ffmpeg:將 H264@MPEGTS 打包成平滑串流媒體

ffmpeg:將 H264@MPEGTS 打包成平滑串流媒體

我有一組(相當大的)文件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」復用器重新打包它。

不過,我對這個解決方案的問題是,它會產生傳統網頁伺服器進行流暢串流傳輸所需的檔案。因此它會將影片片段分割開來,並按區塊分割元資料。這通常都是由串流媒體伺服器處理的。

相關內容