2017-07-18 57 views
0

我需要實現H264編碼和配置MediaCodec如下的Android MediaCodec似乎被忽略指定KEY_BIT_RATE值

MediaCodec codec = MediaCodec.createEncoderByType("video/avc"); 
    MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", resolution.getWidth(), resolution.getHeight()); 

    mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); 
    mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 1000000); 
    mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE,30); 
    codec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 

比特率被設置爲百萬,這是由網絡的限制所限定的要求。當我在Samsung Galaxy J7上測試時,我預計輸出1000 kbps。但是當我在三星Galaxy Grand 2 Duos(android 4.4)或華爲Nexus 6P(android 7.1.2)等特定設備上測試相同的代碼時,我發現編碼器每秒輸出高達5兆字節,這意味着編解碼器完全忽略了每秒1000000比特的指定值。它出什麼問題了?有沒有辦法強制編碼器使用這個指定的值?

回答

0

這種行爲的真正原因是在我推送幀時轉入編碼器的時間戳。在簡化的開發階段,我使用System.nanoTime()值作爲時間戳。此時間戳以納秒爲單位表示時間,而編碼器需要以微秒作爲時間戳。

大多數編解碼器實現可能使用自己的計時器來測量實際傳入的fps,因此它們不依賴於實際的時間戳值而只是忽略它們。但Nexus 6P可能很聰明,該編碼器使用時間戳測量fps值。時間戳以納秒爲單位,從編解碼器時間流的角度來看,速度慢1000倍,測量的fps爲每33秒1000/30〜1幀,因此編解碼器試圖將所有請求的兆位推送到單個輸出幀。

0

我也遇到過這個問題,它只發生在一個設備上(7號的Moto E Plus,雖然6號的Moto E還好,7號的其他設備也是如此),並且進一步的測試顯示它是使用分配的比特率作爲Kbps而不是指定的bps。
不幸的是,我發現檢測android錯誤的唯一「解決方案」是看到媒體編解碼器的輸出,如果看起來輸出的數據太多,則將其重置爲比特率/ 1000。

+0

我想你也給納秒時間戳的編碼器,這是你的問題的真正原因。納秒時間戳將幀率的度量單位更改爲每秒幀數。這意味着您需要將比特率的度量單位更改爲每秒千比特以保持測量的正確性和正確的行爲。無論如何,謝謝你的回答,讓我有正確的想法。 –

+1

我確認我正在交付編解碼器微秒,所以我想我們只是看着兩個類似症狀的不同問題。我不排除我做錯了 - 這就是爲什麼我只是加倍檢查我的時間戳 - 但現在我在爲我的問題指責OEM。很高興你的問題更容易理清。 –

+0

我遇到了與moto c plus相同的問題。我相信微秒會進入而不是納秒。沒有面對與我測試過的任何其他設備(15件東西)的這個問題。 –