转载:
作者: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(); 各种释放内存,关闭文件
简单记录一下,主要是方便自己随时查看。查看源码,还需访问原博文。