您的位置:首页 > 其它

ffmpeg 实例编码、转码小结

2015-12-18 21:12 302 查看
FFMPEG编码一张图片为例。

参考代码:http://blog.csdn.net/leixiaohua1020/article/details/25346147

音频编码参考:http://blog.csdn.net/leixiaohua1020/article/details/25430449

视频编码参考:http://blog.csdn.net/leixiaohua1020/article/details/25430425

转码参考:http://blog.csdn.net/leixiaohua1020/article/details/25422685

一 编码成一幅图片小结:  参考代码:http://blog.csdn.net/leixiaohua1020/article/details/25346147

1 分配pFormatCtx格式上下文结构体,,并指定编码器MJPG,得到编码器pcodecCtx上下文结构体;

其实构造编码器上下文结构体pcodecCtx;

最直接的方式是分配空结构体然后赋值; AVCodecContext * avcodec_alloc_context3(const AVCodex * codec),

2 建立IO读写上下文和打开编码文件url,avio_open(pFormatCtx,urlJpg,rw)

2 备份格式信息,利用AVFormatCtx分配一个包含格式上下文的新流X,avformat_new_stream(AVFormatCtx,0)

3 得到解码器pCodec=avcodec_find_encoder(codec_id)

4 打开解码器,avcodec_open2(pFormatCtx,codec_id,0)

5 分配空图片帧;av_frame_alloc(),并填充图片数据;avpicture_fill()

6  写文件头,avformat_wirte_headr(pFormatCtx,0)

7  压缩图片--->作为视频帧压缩;avcodec_encode_video2(pcodecCtx,pkt,pic,gotPic);pkt引用了2中X信息头

8 将压缩图片pkt写入文件; av_write_frame(pcodecCtx,pkt);

9 写文件尾,av_write_trailer

 注意的是,pFormatCtx始终贯穿结构当中,充当信息载体传入。

二 音视频编码小结  http://blog.csdn.net/leixiaohua1020/article/details/25430449

在一基础上,循环写入编码pkg既可以,最后需要flush_pakge下,保证所有的缓冲包都写入到了文件;

注意:写入文件头的时候,不同的输出文件格式mp4,avi,flv,它怎么保证是对的呢?

avio_open(pFormatCtx,url, rwFlg)的时候,api根据url名字猜出文件属性来实现对不同文件或者protocol的头写入,所以一定要保证url的准确性;

avformat_wirte_headr完成了对文件mux_ini和write_head。 即对avStream必要参数的准确性检测和头信息的写入。

参考:   http://blog.csdn.net/leixiaohua1020/article/details/41199947

三 文件格式转码小结  转码参考:http://blog.csdn.net/leixiaohua1020/article/details/25422685

单纯的文件转码,在二基础上,通过api获取ifmt_ctx,复制ofmt_ctx;然后一遍读pkt,一边写pkt,循环完成。 

注意完成pkt的属性处理,pkt.pts/dts/duration/  调用 int64=av_rescale_q(pkt.pts,in_timeBase,out_timeBase)(或者xx_rnd,xx_q_rnd系列)实现;

注意,在这里写pkt
api:av_interleaved_write_frame

在有多个流的情况下要用av_interleaved_write_frame/av_write_frame只有单一流2个函数都可以用

参考分析:http://blog.csdn.net/dancing_night/article/details/46469865
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: