簡體   English   中英

MediaCodec H264編碼器輸出大量原始流

[英]MediaCodec h264 encoder outputs large raw stream

我在Android應用程序中使用MediaCodec對USB攝像機的幀進行編碼,然后將該原始流饋送到mp4parser以創建mp4(API級別為16)。

一切在許多設備上都可以正常運行,但是Galaxy S3(I9300)出現問題。

問題是,當我將幀發送到編碼器1分鍾時,有時我會從編碼器獲得非常大的輸出。

大小范圍在2.5MB-20MB之間。 在較長的剪輯上,此問題會變得更糟,例如7分鍾的范圍是9MB-120MB。

那是正常的嗎?

我嘗試捕獲相同的場景,但是仍然得到不同的結果。

編碼器設置:

Codec: OMX.SEC.AVC.Encoder
Color Format: 21
KEY_FRAME_RATE: 8.77
KEY_BIT_RATE: ~880Kbit

還有一件事,將幀發送到編碼器時,我正在使用:

mediaVideoCodec.queueInputBuffer(inputBufferIndex, 0, FrameData.length, computePresentationTime(frameCounter), 0);

和功能

private long computePresentationTime(int frameIndex) {
    return (long)(132 + (frameIndex * (1000000f / 8.77f)));
}

編碼是在后台線程中完成的,所以我不確定我是否可以在這里使用系統時間,除非生產者保存了幀和時間。 是正確的,132代表什么?

謝謝您的幫助。

“ 132”表示代碼是從CTS測試中復制的, 該測試生成了它編碼的視頻。 測試代碼正在創建一系列具有恆定幀速率的幀。 作為確定時間戳是否正在通過未修改而不是由編解碼器在內部生成的工作的一部分,添加了一個小的偏移量。

在880Kbps下,您期望(880/8)*(7 * 60)/ 1024 = 45MB。 大多數編碼器都能很好地匹配所需的速率。 我已經看到,當幀上的時間戳與幀速率不匹配時,這種情況會變得很糟糕(例如this post ),但是由於您正在生成時間戳,所以我不確定為什么會這樣。

理想情況下,時間戳記來自攝像機,而不是生成的值或系統時間。 否則,您將無法知道是否在源附近丟了幀。

MediaCodec在Android 4.1(API 16)中有許多問題 ,在Android 4.3(API 18)中已解決。 您正在測試哪種設備和Android版本?

暫無
暫無

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

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