2014-10-17 28 views
0

我正在使用MediaCodec來解碼視頻,並使用sws_scale(來自ffmpeg)重新調整它。我可以處理一種特殊的顏色格式,例如。 YUV420P,並將其重新縮放至目標尺寸。但是我必須做一些準備工作,比如將lineize和memcpy的輸出緩衝區設置爲三個普通切片(data [0],data [1],data [2]),並且解碼器輸出的顏色格式在不同的設備上有所不同。如果我得到colorformat,ffmpeg中是否有方法自動重新調整它的大小而不進行特殊處理(當然,顏色格式應該由ffmpeg支持)?如何從任何顏色格式的MediaCodec輸出中縮放YUV圖像?

回答

1

swscale/libavutil沒有直接採用OMX(MediaCodec)顏色格式的功​​能,您需要手動映射格式。但是,您不需要將輸出緩衝區memcpy分成三個單獨的緩衝區,只需將三個數據指針data [0],data [1]和data [2]設置爲從MediaCodec指向輸出緩衝區(同一點在緩衝區中,否則您將會使用memcpied)。

正常的顏色格式(如YUV420P和NV12)應該可以正常工作,您只需要設置格式常量之間的映射。但是一些MediaCodec解碼器(特別是Qualcomm解碼器)通常使用專有的平鋪格式,這需要更多的努力來解讀,而swscale不直接支持該解碼器,您需要自己解讀。

+0

謝謝,mstorsjo.Yes,我知道我需要在ffmpeg中用pix_fmt映射MediaCodec顏色格式。除此之外,我必須設置數據指針並處理dest數據指針。如果這可以通過傳遞pix_fmt,這將非常美妙。因爲有太多的格式需要處理。我發現av_image_alloc傳回的行可能有一些幫助,但其他版本的大小(與hight的關係)也來自不同的pix_fmt。你有什麼建議嗎? – 2014-10-17 07:32:14

0

這只是一個基於我在Raspberry Pi上的OMX經驗的直觀建議,但是,您可以檢查Stagefright庫是否提供任何類似於NDK的C/C++接口的OMX--在這種情況下,如果沒有隻有一個解碼器組件和一個調整大小組件(例如Raspberry Pi有component),那麼你可以製作一個OMX管道,然後組件可以自動協商這些格式,但這只是一個假設,我從來沒有深入研究過Stagefright自己,我知道它的意圖是從Java級別通過MediaCodec和其他類,但仍然可以看看。如果Stagefright具有這樣的API,我可以提供一些OMX包裝代碼,以簡化我爲Raspberry Pi製作的組件的使用,因爲從頭開始構建OMX代碼是相當多的工作。

編輯

我沒多一些谷歌搜索這個,因爲它似乎interresting,發現了一個NDK媒體sample - 以及它似乎是Broadcom公司執行OMX的不同之處很多,所以還是大多數的東西會被需要從scracth構建。你能解釋一下爲什麼你需要這樣做嗎?如果目標只是顯示解碼流,則可以在Java級別設置預覽表面,所以我認爲解碼的內容是其他的。

+0

感謝Rudolfs.I在考慮使用Stagefright之前,但我只是不知道如何開始我的工作。首先它需要在android平臺下構建Stagefright代碼。其次,它需要研究API。並且我們想要做什麼是Android開發團隊的工作。你同意嗎?所以我放棄了這個想法。 – 2014-10-17 07:49:26

+0

你能解釋一下爲什麼你需要重新縮放?你打算如何處理解碼的視頻? – 2014-10-17 07:52:41

+0

因爲我想將較小的比特率和大小的視頻文件轉碼爲上傳。所以我使用MediaCodec,但它不能直接更改大小。 – 2014-10-17 11:15:30