簡體   English   中英

在Android中解碼Raw H264流?

[英]Decoding Raw H264 stream in android?

我有一個項目,我被要求在android中顯示視頻流,流是原始H.264,我連接到服務器,將從服務器接收字節流。

基本上我想知道有沒有辦法將原始字節發送到android中的解碼器並將其顯示在表面上?

我使用android 4.1中的新MediaCodec和MediaExtractor API成功解碼了包含在mp4容器中的H264,遺憾的是我還沒有找到使用這些API解碼原始H264文件或流的方法。

我知道一種方法是編譯和使用FFmpeg,但我寧願使用可以使用硬件加速的內置方法。 我也理解Android中支持RTSP流,但這不是一個選項。 Android版本不是問題。

不幸的是,我不能為此提供任何代碼,但我會盡力根據我如何使用它來解釋它。

所以這里是我如何使用MediaCodec類獲得原始H.264編碼視頻的概述。

使用上面的鏈接有一個獲取解碼器設置以及如何使用它的示例,您需要將其設置為解碼H264 AVC。

H.264的格式是它由NAL單元組成,每個NAL單元的起始前綴為三個字節,值為0x00,0x00,0x01,每個單元的類型不同,具體取決於這些后面的第4個字節的值。 3個起始字節。 一個NAL單元不是視頻中的一個幀,每個幀由許多NAL單元組成。

基本上我寫了一個方法,找到每個單獨的單元並將其傳遞給解碼器(一個NAL單元是起始前綴,其后是任何字節,直到下一個起始前綴)。

現在,如果你有解碼器設置解碼H.264 AVC並從解碼器有一個InputBuffer,那么你就准備好了。 您需要使用NAL單元填充此InputBuffer並將其傳遞回解碼器並繼續對流的長度執行此操作。 但是,為了完成這項工作,我必須先將解碼器傳遞給SPS(序列參數集)NAL單元。 在啟動前綴(第4個字節)之后,該單元的字節值為0x67,在某些設備上解碼器會崩潰,除非它首先接收到該單元。 基本上直到找到這個單元,忽略所有其他NAL單元並繼續解析流直到你得到這個單元,然后你可以將所有其他單元傳遞給解碼器。

有些設備首先不需要SPS,有些設備確實需要SPS,但最好先將它傳遞給它。

現在,如果你有一個表面,你在配置它時傳遞給解碼器,那么一旦它獲得足夠的NAL單位的幀,它應該在表面上顯示它。

以下是我在類似項目中發現有用的資源:

  1. 該視頻對於了解MediaCodec如何在高級別處理原始h.264流非常有洞察力。
  2. 該線程詳細介紹了如何處理SPS / PPS NALU。 如上所述,您需要使用開始前綴分隔各個NAL單元,然后將剩余數據傳遞給MediaCodec。
  3. 這個repo (libstreaming)是使用RTSP / RTP在Android中解碼H264流進行傳輸的一個很好的例子。

您可以從服務器下載原始H.264,然后通過手機上運行的本地HTTP服務器提供它,然后讓VLC for Android從該HTTP服務器進行播放。 您應該使用VLC的http / h264://方案強制解復用器使用原始H.264(如果您不強制解復用器VLC可能無法識別流,即使HTTP服務器返回的MIME類型是設置正確)。 看到

https://github.com/rauljim/tgs-android/blob/integrate_record/src/com/tudelft/triblerdroid/first/VideoPlayerActivity.java#L211

有關如何創建將啟動VLC的Intent的示例。

注意:原始H.264顯然沒有時序信息,因此VLC將盡可能快地播放。 首先將其嵌入MPEGTS會更好。 還沒有找到能夠做到這一點的Android庫。

暫無
暫無

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

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