
我有一組(相當大的)文件H264在一個MPEG傳輸串流容器。由於時間限制,我需要將此內容重新打包為流暢的串流媒體,而不對其進行轉碼(轉碼會花費太長時間)。
我一直在試圖弄清楚如何使用 ffmpeg 來做到這一點,因為它似乎有 2 個不同的複用器可以完成這項任務。我嘗試過“smoothstreaming”復用器和“ismv”復用器,但在使用這兩個復用器時我都遇到了問題。
ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out
這樣,我收到以下錯誤:
ffmpeg 版本 N-79695-g675cfb2 版權所有 (c) 2000-2016 FFmpeg 開發人員 使用 gcc 5.3.1 (Debian 5.3.1-14) 20160409 構建 配置: libavutil 55.23.100 / 55.23.100 libavcodec 57.38.100 / 57.38.100 libav 格式 57.35.100 / 57.35.100 libavdevice 57.0.101 / 57.0.101 libavfilter 6. 44.100 / 6. 44.100 libswscale 4.1.100 / 4.1.100 libsresample 2.0.101 / 2.0.101 從“input.mpg”輸入#0,mpegts: 持續時間:01:28:41.98,開始:2.040000,位元速率:2500 kb/s 方案1 流 #0:0[0x1e1]: 影片: h264 (主) ([27][0][0][0] / 0x001B), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 25 fps, 25 TB,90,000 TB 流 #0:1[0x1e2](eng):音訊:mp2 ([4][0][0][0] / 0x0004)、48000 Hz、立體聲、s16p、192 kb/s [smoothstreaming @ 0x2616340] 不建議使用 AVStream.codec 將編解碼器參數傳遞給復用器,請改用 AVStream.codecpar。 最後一則訊息重複了 1 次 [smoothstreaming @ 0x2616340] 沒有為流 0 設定位元率 輸出 #0,smoothstreaming,到「ss_out」: 元數據: 編碼器:Lavf57.35.100 串流 #0:0:影片:h264 ([33][0][0][0] / 0x0021)、yuv420p、720x576 [SAR 16:11 DAR 20:11]、q=2-31、25 fps、25 TB,50 TB 流 #0:1(eng):音訊:mp2 (i[0][0][0] / 0x0069)、48000 Hz、立體聲、192 kb/s 流映射: 流#0:0 -> #0:0(複製) 流#0:1 -> #0:1(複製) 無法為輸出檔 #0 寫入標頭(編解碼器參數不正確?):參數無效
我嘗試的另一件事是將其與 ffmpeg 一起打包到 ismv 中:
ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv
到目前為止,這工作正常,但隨後我需要 ismindex 工具來建立清單文件,但這失敗了:
ismindex -n ss_out ss_out.ismv
Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)
是我做錯了什麼,還是我的輸入檔有問題?
答案1
因此,在我認為我的問題有兩種可能的解決方案中,兩者都可以工作,但它們有不同的最終結果。
ISMV 混合器 + ismindex
我需要的是一組伺服器端檔案(.ism、.ismc、.ismv)。為了實現這一目標,我最終做了以下兩件事:
ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv
上面的命令複製視訊串流而不對其進行轉碼,將音訊轉碼為 AAC(儘管 ffmpeg 和 ismindex 似乎也不介意 MP2 音訊)並將其打包為 .ismv。
ismindex -n ss_out ss_out.ismv
然後,ismindex 工具可以建立我需要的 .ism 和 .ismc 檔案。
我從中獲得的文件可以透過帶有媒體服務的 IIS 進行串流傳輸。
平滑流復用器
我最終還讓“smoothstreaming”復用器正常工作,訣竅是它還需要一個 .ismv 檔案作為輸入。因此,我首先執行與上面相同的 ffmpeg 命令,然後我可以再次使用 ffmpeg 使用「smoothstreaming」復用器重新打包它。
不過,我對這個解決方案的問題是,它會產生傳統網頁伺服器進行流暢串流傳輸所需的檔案。因此它會將影片片段分割開來,並按區塊分割元資料。這通常都是由串流媒體伺服器處理的。