簡體   English   中英

使用Broadway.js解碼原始h.264

[英]Decoding raw h.264 using Broadway.js

我正在開發一個應用程序,它使用ffmpeg給我一個編碼的h.264幀:

avcodec_encode_video2(c, &packet, frame, &got_output)

如果我都保存packet.data到一個文件out.h264,它顯示了使用所需的輸出ffplay

現在,我的目標是在收到數據包時發送每個數據包並在網頁上顯示它(實時流)。 為此我正在使用Broadway.js

我可以確認我在應用程序中發送的數據是在瀏覽器中正確接收的。 但是,我無法使用百老匯( Player.jsDecoder.jsYUVCanvas.js )在webGL畫布上顯示相同內容:

if (data != null) player.decode(new Uint8Array(data));

我得到的輸出是一個空白的白色畫布。 data是一個ArrayBuffer ,它包含來自avcodec_encode_video2的數據包中的h.264比特流。 難道我做錯了什么? 數據是否應該采用特定格式?

邊注:
我的視頻文件out.h264使用此處提供的示例正常播放: BroadwayStream

它似乎使用命令行ffmpeg接口並處理收到的每個數據包。 我的程序使用ffmpeg庫獲取相同的數據包,我需要渲染。 有人可以幫忙嗎?

請記住,Broadway僅處理使用CAVLC(霍夫曼編碼)編碼的基線配置文件,並且只忽略主配置文件或使用CABAC(算術編碼)編碼的任何內容。 換句話說,百老匯只接受最容易解碼的H.264流類型。 如果您的視頻編碼錯誤,可能會令人沮喪,因為您會遇到可怕的空白屏幕綜合症。

BroadwayStream使用服務器端的ffmpeg對debox mp4文件進行轉換,將它們轉換為原始的H.264數據流。 也就是說,它生成一系列H.264網絡接入層單元(NALU)。

然后瀏覽器端篡改整個數據流並將其傳遞給百老匯的decode()方法。 因此, decode()總是獲得一系列完整的NALU,在任何特定的方法調用中都沒有傳遞部分NALU。

decode()不接受部分NALU。 (BroadwayStream通過給它整個流整齊地回避這一點。)它不需要mp4或webm數據流,只需要deboxed H.264。 如果你傳遞它部分NALU它不起作用 - 它只是忽略你給它的數據。 因此,接受數據流的客戶端js必須以某種方式將流分離為NALU,然后再將它們傳遞給decode()

如果你的js接受MIME類型video/webm; codecs="avc1.42E01E" muxed文件video/webm; codecs="avc1.42E01E" video/webm; codecs="avc1.42E01E"你可以看一下https://github.com/themasch/node-ebml 這個要點 ,以獲取解除它們的方法。 每個data塊包含一個或多個可以傳遞給decode()整個NALU。

如果是video/mp4; codecs="avc1.42E01E" video/mp4; codecs="avc1.42E01E"碎片MP4,您可以在avcC框中取消裝箱sps和pps項,然后avcC mdat框。 這些項目中的每一項都是一個或多個整個NALU。

如果您從服務器獲得原始H.264流,則必須以某種方式將其自身解析為NALU。 Yumi Chan寫了一篇關於NALU的有用文章。 請記住,有兩種方法可以分離NALU:數據包傳輸和字節流。 decode()接受,但你的解析器也必須。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM