FFmpeg 开发——将视频 YUV 格式编码成 H264( 三 )

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 文件放到工程当中,如下图

FFmpeg 开发——将视频 YUV 格式编码成 H264

文章插图
 
然后在 `- (void)viewDidLoad `方法中使用如下代码
const char *input_file = [[[NSBundle mainBundle] pathForResource:@"FFmpegTest" ofType:@"yuv"] cStringUsingEncoding:NSUTF8StringEncoding];yuvCodecToVideoH264(input_file);然后运行,瞬间, 利用同步推打开我们工程的系统,看到我们就得到我们想要的东西了
FFmpeg 开发——将视频 YUV 格式编码成 H264

文章插图
 
---- 有些小伙伴可能在编译的时候遇到错误,那是因为函数当中一些用到的工程库并没有链接到工程中,可以在工程的 General->Linked Frameworks and Libraries 检查如下图
FFmpeg 开发——将视频 YUV 格式编码成 H264

文章插图
 
好了,先写这么多了

【FFmpeg 开发——将视频 YUV 格式编码成 H264】


推荐阅读