gpt4 book ai didi

java - MediaCodec h264 编码器输出大量原始流

转载 作者:行者123 更新时间:2023-12-02 04:04:59 29 4
gpt4 key购买 nike

我在 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”表示代码是从 the CTS test 复制的,它生成它编码的视频。测试代码正在创建一系列具有恒定帧速率的帧。为了确定时间戳未经修改地传递,并且不是由编解码器内部生成,添加了一个小的偏移量。

在 880Kbps 下,您预计 (880/8)*(7*60)/1024 = 45MB。大多数编码器都能很好地匹配所需的速率。当帧上的时间戳与帧速率不匹配时(例如 this post ),我发现这会变得很糟糕,但由于您正在生成时间戳,所以我不确定为什么会这样。

理想情况下,时间戳来自相机,而不是生成的值或系统时间。否则,您无法知道帧是否在源附近丢失。

MediaCodec 有 many problems Android 4.1 (API 16) 中的问题已在 Android 4.3 (API 18) 中解决。您在什么设备和 Android 版本上进行测试?

关于java - MediaCodec h264 编码器输出大量原始流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34398695/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com