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