天天看点

YUV编码为H264 H264封装为MP4

转载: 

作者:DaveBobo 

来源:CSDN 

原文:https://blog.csdn.net/DaveBobo/article/details/79648900 

1 、YUV编码为H264

YUV编码为H264有两种方式: 

(1)基于FFMPEG调用libx264实现YUV420P的像素数据编码为H.264的压缩编码数据; 

(2)直接调用libx264将输入的YUV数据编码为H.264码流文件; 

1.1 基于FFmpeg YUV编码为H264 

使用FFmpeg编码视频涉及的主要函数: 

av_register_all():注册FFmpeg所有编解码器。 

avformat_alloc_output_context2():初始化输出码流的AVFormatContext。 

avio_open():打开输出文件。 

av_new_stream():创建输出码流的AVStream。 

avcodec_find_encoder():查找编码器。 

avcodec_open2():打开编码器。 

avformat_write_header():写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。 

avcodec_encode_video2():编码一帧视频。即将AVFrame(存储YUV像素数据)编码为AVPacket(存储H.264等格式的码流数据)。 

av_write_frame():将编码后的视频码流写入文件。 

flush_encoder():输入的像素数据读取完成后调用此函数。用于输出编码器中剩余的AVPacket。 

av_write_trailer():写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。

1.2 直接调用libx264 YUV编码为H264 

调用libx264进行视频编码涉及的主要函数: 

x264_param_default():设置参数集结构体x264_param_t的缺省值。 

x264_picture_alloc():为图像结构体x264_picture_t分配内存。 

x264_encoder_open():打开编码器。 

x264_encoder_encode():编码一帧图像。 

x264_encoder_close():关闭编码器。 

x264_picture_clean():释放x264_picture_alloc()申请的资源。

存储数据的结构体如下所示。 

x264_picture_t:存储压缩编码前的像素数据。 

x264_nal_t:存储压缩编码后的码流数据。 

2 、H264封装为MP4

H264封装为MP4有两种方式: 

(1)基于FFmpeg使用mp4封装格式封装视频数据;(这种方式效率较低) 

(2)根据MP4文件协议直接将H264包封装成MP4格式,通过Mp4v2可以很方便的将H264编码成MP4格式文件 

2.1 基于FFmpeg使用mp4封装格式封装视频数据、

使用FFmpeg编码视频涉及的主要函数:

avcodec_register_all();     av_register_all();    注册

avformat_alloc_output_context2();    初始化

avio_open();    打开文件

avformat_new_stream();    初始化视频码流

为CodecContext 设置参数

 avcodec_find_encoder();    寻找编码器并打开编码器

avcode_open2();    

av_frame_alloc();    初始化帧

avformat_write_header();    写文件头

avcodec_encode_video2();    循环编码

flush_encoder();   flush encoder

av_write_traler();    写文件尾

avcodec_close();  av_free()    avio_close()    avformat_free_context()    fclose();     各种释放内存,关闭文件

简单记录一下,主要是方便自己随时查看。查看源码,还需访问原博文。