2013-06-19 58 views
1

差異的視頻文件的部分我都建立在libav頂部的工作程序(或者ffmpeg - 專業知識或者是在這裏很有用)。Remux的和段只沒有輸出

它需要一個mp4視頻,與H264視頻/ AAC音頻編碼,並且它remuxes到MPEG TS和段成X第二塊。它類似於下面的ffmpeg的命令:

ffmpeg -y -i video.mp4 -c:a copy -bsf:a aac_adtstoasc -c:v copy -bsf:v h264_mp4toannexb -flags -global_header -map 0 -f segment -segment_time 10 -segment_list playlist.m3u8 -segment_format mpegts chunk_%03d.ts 

我不使用命令行的原因,是希望只生成段的一個子集。因此,如果一個視頻產生8到12秒之間的10個分段(由於關鍵幀,分段永遠不會是所需的長度),我可能希望稍後生成分段3-7。

我的程序的完整代碼可以發現here

我使用av_read_frame讀取從源文件中的每個幀,REMUX(包括bitfilter處理)和寫入輸出文件。一旦自上一次輸出變爲接近/大於所需段長度後,我刷新輸出文件,關閉它,打開下一個段並繼續。

我已經嘗試改變代碼做av_seek_frame到第一個段的末尾,並從那裏開始(我也試圖從第二和第三段的末尾開始)。新的段的長度是相同的(以秒和點爲單位),但是與完全runthrough(幾千字節內)的可比段相比,其大小不同 - 起始段(無論是第二,第三還是其他)也顯示爲比以前的可比分段少2個分組。

我認爲av_seek_frame會給我一個精確的匹配,就好像我手動完成了一個到av_read_frame的循環,但看起來情況並非如此。

我希望的東西:

  • 的一種方式,以「快進」的文件中,以一個特定的文件中(近似值)點。
  • 要從該點開始寫入並且輸出與完整運行提供的完全相同(相同的大小,相同的長度,相同的確切字節)。

回答

0

我設法得到它的工作通過執行以下操作:

  • 尋求到一個位(1000和DTS)的實際關鍵幀位於前。
  • 在循環中調用av_read_frame,直到我們到達關鍵幀。
  • 寫頭和尾對每個段avformat_write_headerav_write_trailer

最終的結果是,我可以在給定的時間戳記的地方開始我知道的段是即將開始,有創建的那些片段(並停止在我希望的任何部分,但這是微不足道的)。產生的部分與完整runthrough中創建的部分相同。

1

尋求一般不精確,只會帶你到文件索引中列出的點(通常是視頻關鍵幀)。您可以嘗試使用AVSEEK_FLAG_BACKWARD標誌查找,以在指定點之前尋找,然後從那裏讀取+丟棄。

另外,你可能想看看FFMS2,據推測,它提供了一個更高級別的libav函數包裝與幀精確查找。

+0

我正在尋找關鍵幀,所以我儘管這將是確切的。 FFMS2聽起來很有意思,並且由於缺乏libav的文檔,這可能是我的優點。謝謝! –

+0

FFMS2看起來不錯,但它似乎只是閱讀 - 不寫/多路複用。該API是更好的工作,雖然:) –