簡體   English   中英

如何使用MediaStreamSource播放來自matroska文件的h264幀?

[英]How to use MediaStreamSource to play h264 frames coming from a matroska file?

我正在嘗試使用MediaStreamSource在Silverlight 3中渲染來自mkv h264文件的幀。 解析mkv文件很好,但是我正在為SL中的CodecPrivateData的期望值掙扎,它必須是字符串,而來自mkv的PrivateData信息是一個二進制元素。 另外,我不確定應以哪種形式將幀提供給SL(即,它們以mkv / mp4格式存儲或以代碼轉換為NALU的方式)是否有人對此有任何信息?

在經歷了我自己的類似問題並為之苦惱后,我能夠回答這個問題。

  • 在ReportOpenMediaCompleted()中,設置視頻流描述時,盡管文檔中有說明,您仍可以忽略CodecPrivateData屬性字符串。 不是必需的 (假設您的NAL單位流包括SPS和PPS單位)

  • 對於每個GetSampleAsync()請求,應將一個NAL單元發送回MediaElement。 這包括非圖片NAL單位,例如SPS / PPS單位。

  • 發送NAL單元時,請確保每個單元的開頭都有3字節的起始碼(0x00 0x00 0x01)。 (這類似於“附件B”格式,但不完全相同)

  • 在ReportGetSampleCompleted()中,將“偏移”的值設置為等於NAL起始代碼的開頭,而不是實際數據的開頭。 (在大多數情況下,如果您使用每個NAL單位使用新的流,則該值為零)

我已經在這里寫了一些有關體驗的博客,希望能寫更多的博客。

根據文檔,編解碼器專用數據應設置為00000001 + sps + 00000001 + pps。 但是,文檔錯誤 ,似乎完全忽略了CodecPrivateData的值。 相反,您需要傳遞SPS和PPS NALS(當然帶有附件b標頭)作為GetSampleAsync的第一和第二結果。

對於常規媒體樣本,正常的4字節附件b標頭標頭工作正常

CodecPrivateData是MP4文件中'stsd'原子的子級'avcC'原子的內容。 您必須將二進制數據轉換為字符串。 它看起來像這樣:“ 014D401FFFE10017674D401F925402802DD0800000030080000018478C195001000468EE32C8”

您還必須將mkv / mp4長度替換為NALU。 我已經寫了一些有關此內容的信息(以使平滑流能夠用於H.264文件)。

問候,

請參閱: 流暢流式H264

暫無
暫無

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

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