13、flush 编码
int flush_encoder(AVFormatContext *fmt_ctx,unsigned int stream_index){int ret;int got_frame;AVPacket enc_pkt;// 确认如果if (!(fmt_ctx->streams[stream_index]->codec->codec->capabilities &CODEC_CAP_DELAY))return 0;while (1) {enc_pkt.data = https://www.isolves.com/it/rj/ysp/2022-01-14/NULL;enc_pkt.size = 0;av_init_packet(&enc_pkt);ret = avcodec_encode_video2 (fmt_ctx->streams[stream_index]->codec, &enc_pkt,NULL, &got_frame);av_frame_free(NULL);if (ret < 0)break;if (!got_frame){ret=0;break;}printf("Flush Encoder: Succeed to encode 1 frame!tsize:%5dn",enc_pkt.size);/* mux encoded frame */ret = av_write_frame(fmt_ctx, &enc_pkt);if (ret < 0)break;}return ret;}int ret2 = flush_encoder(pFormatCtx,0);if (ret2 < 0) {printf("Flushing encoder failedn");return;}
14、我们上面写完了编码头、编码数据,当然也要写入编码的尾部表示结束了啦,这样才是一个完整的编码格式嘛
// 写入数据流尾部到输出文件当中,并释放文件的私有数据av_write_trailer(pFormatCtx);
15、释放我们之前创建的内存
if (video_st){// 关闭编码器avcodec_close(video_st->codec);// 释放 AVFrameav_free(pFrame);// 释放图片 buf,就是 free() 函数,硬要改名字,当然这是跟适应编译环境有关系的av_free(picture_buf);}// 关闭输入数据的缓存avio_close(pFormatCtx->pb);// 释放 AVFromatContext 结构体avformat_free_context(pFormatCtx);// 关闭输入文件fclose(in_file);
---- 好了,写到这里,我们首先要做的就是利用就把下面这个 .yuv 文件放到工程当中,如下图
文章插图
然后在 `- (void)viewDidLoad `方法中使用如下代码
const char *input_file = [[[NSBundle mainBundle] pathForResource:@"FFmpegTest" ofType:@"yuv"] cStringUsingEncoding:NSUTF8StringEncoding];yuvCodecToVideoH264(input_file);
然后运行,瞬间, 利用同步推打开我们工程的系统,看到我们就得到我们想要的东西了文章插图
---- 有些小伙伴可能在编译的时候遇到错误,那是因为函数当中一些用到的工程库并没有链接到工程中,可以在工程的 General->Linked Frameworks and Libraries 检查如下图
文章插图
好了,先写这么多了
【FFmpeg 开发——将视频 YUV 格式编码成 H264】
推荐阅读
- 前端开发之动态管理Nginx集群的方法
- 必知必会的python测试开发笔、面试题
- 一起学排序算法——选择排序
- 我的漂亮的 Linux 开发环境
- cpolar——安全的内网穿透工具
- 鸿蒙APP开发:如何实现“百度地图”的显示?需要3项认真操作才行
- Python数据分析——处理中国地区信息
- App制作的流程是什么?如何制作App开发流程?
- Java业务开发常见错误
- 程序的执行流程和开发工具介绍