FFMpeg的向导对于学习FFMpeg有很大的帮助,出处:
原始:http://www.dranger.com/ffmpeg/tutorial01.html
翻译:http://home.chinavideo.org/space.php?do=mtag&tagid=2
tutorial01 和 tutorial02很简单,按照做就可以:大致FFMpeg API的使用流程是
- 用av_open_input_file() 打开文件,可以得到AVFormatContext 结构。这样,文件的格式信息就可以全部取出。
- 遍历stream得到相应的音视频流的编号,可以找出解码器的ID和AVCodecContext 结构
- 用avcodec_find_decoder()根据ID,找出AVCodec的指针。
- av_read_frame()读出一个AVPacket 结构
- avcodec_decode_video()循环传入一个个Packet,然后得到一个解码后的原始帧。
- 用sws_getContext()和sws_scale转换成RGB格式的帧传入SDL显示
对于音频:
- av_read_frame()读出一个音频AVPacket 结构,放入队列。
- SDL会调用audio_callback取得一个音频帧,实现代码要memcpy一个指定大小的帧到一个指针中。
- audio_decode_frame()读取队列中一个Packet,就放入avcodec_decode_audio2()解码出一段数据,放入callback
- 中的一个指定audio_buf,如果buffer满了,就返回。
- audio_decode_frame(),把一个audio_buf memcpy到帧的指针,知道一个帧填满。
tutorial03 纠缠了我好几天,
在主循环中,多了一个
av_free_packet(&packet); 造成的后果是:如果在正确的地方再次释放,就会卡在那里。
调试起来很困难,不知道为什么会卡在那,也找不出那条语句会卡。
最后用排除法,才找到一条释放语句出的问题,但也不知道为什么。后来比对别人的代码才真正发现。