ffmpeg 問題收集

ffmpeg是當前最重要的開源多媒體工程,我之前和現在做的很多項目都用到了ffmpeg。我會在本文中不斷更新一些使用和移植優化ffmpeg的心得,和大家一起交流提高。爲了方便查看採用Q&A的形式。

 

Q1:我用一個解碼循環解一便視頻文件後,調用av_seek_frame到開始位置用同一個循環再解一遍,可第二次的第一禎總是該視頻的最後一禎,這是什麼原因呢?我的調用方法
av_seek_frame(pFormatCtx, -1, pFormatCtx->start_time, 0)
後來發現
av_seek_frame(pFormatCtx, -1, 0, 0)效果一樣,調用模式try了所有除了有一個沒有進解碼循環,其他都一樣。

A: 重新解碼前要flush codec
avcodec_flush_buffers(...streams[video_index]->codec)

 

Q2: 我調用av_seek_frame後解出的圖像是花的,調用avcodec_flush_buffers後也是一樣

A: 沒有seek到I Frame

 

Q3:把ffmpeg移植到mtk平臺,出現Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o).

 

A: ffmpeg是跨平臺的,裏面用到了很多標準C函數,而MTK裏面是不允許越過OS直接操作內存的,所以printf,malloc,fopen,assert,abort函數需要全部define成MTK的系統函數。 比如fopen改成FS_Open,assert改成ASSERT等。

 

 

Q4: 用libavformat demuxer出來的raw音頻或raw視頻用播放器怎麼放不了?

 

A:  還需要文件開頭加上幾個字節 才能讓播放器識別格式。比如mpeg4要加一個VOL,h.264要加起始碼0001, aac要加FFF9, amrnb要加6個字節“#!AMR"

 

5. 如何正確使用av_seek_frame實現視頻拖放

 

   time=5;//拖放到5秒的位置 

 

    ret = av_seek_frame(FormatCtx,videoStream,(int64_t)time*(AV_TIME_BASE),AVSEEK_FLAG_BACKWARD); 

 

 注:AVSEEK_FLAG_BACKWARD的作用是seej到請求的timestamp之前最近的關鍵幀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章