FFMpeg tutorial01 --- tutorial03 小结

Posted on 2010-01-13 14:42  Teddy Yan  阅读(610)  评论(0编辑  收藏  举报

FFMpeg的向导对于学习FFMpeg有很大的帮助,出处:

 

原始:http://www.dranger.com/ffmpeg/tutorial01.html

翻译:http://home.chinavideo.org/space.php?do=mtag&tagid=2

 

tutorial01 和 tutorial02很简单,按照做就可以:大致FFMpeg API的使用流程是

 

  1. 用av_open_input_file() 打开文件,可以得到AVFormatContext 结构。这样,文件的格式信息就可以全部取出。
  2. 遍历stream得到相应的音视频流的编号,可以找出解码器的ID和AVCodecContext 结构
  3. 用avcodec_find_decoder()根据ID,找出AVCodec的指针。
  4. av_read_frame()读出一个AVPacket 结构
  5. avcodec_decode_video()循环传入一个个Packet,然后得到一个解码后的原始帧。
  6. 用sws_getContext()和sws_scale转换成RGB格式的帧传入SDL显示

 

对于音频:

  1. av_read_frame()读出一个音频AVPacket 结构,放入队列。
  2. SDL会调用audio_callback取得一个音频帧,实现代码要memcpy一个指定大小的帧到一个指针中。
  3. audio_decode_frame()读取队列中一个Packet,就放入avcodec_decode_audio2()解码出一段数据,放入callback
  4. 中的一个指定audio_buf,如果buffer满了,就返回。
  5. audio_decode_frame(),把一个audio_buf memcpy到帧的指针,知道一个帧填满。

 

 

tutorial03 纠缠了我好几天,

 

在主循环中,多了一个

av_free_packet(&packet); 造成的后果是:如果在正确的地方再次释放,就会卡在那里。

调试起来很困难,不知道为什么会卡在那,也找不出那条语句会卡。

最后用排除法,才找到一条释放语句出的问题,但也不知道为什么。后来比对别人的代码才真正发现。

 

 

Copyright © 2024 Teddy Yan
Powered by .NET 9.0 on Kubernetes