【发布时间】:2014-07-08 10:36:35
【问题描述】:
我已经看到下面使用MediaCodec API 进行编码/解码的示例。
https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
其中将猜测的呈现时间与从解码信息接收的呈现时间进行比较。
assertEquals("Wrong time stamp", computePresentationTime(checkIndex),
info.presentationTimeUs);
由于解码器只是解码编码缓冲区中的数据,我认为在此编码器的输出 H.264 流中可以解析任何时间戳信息。
我正在编写一个 Android 应用程序,它使用 ffmpeg (libavformat) 将由 MediaCodec 编码的 H264 流 (.h264) 混合到 mp4 容器。
我不想使用MediaMuxer,因为它需要的 4.3 版本太高了。
但是,ffmpeg 似乎无法识别由MediaCodec 编码的数据包中的呈现时间戳,因此当我尝试从流中读取帧时总是得到 NO_PTS 值。
有谁知道在这种情况下如何获得正确的演示时间戳?
【问题讨论】:
-
基本问题是 H.264 流不包括演示时间戳。它们必须带外传送,或写入包装器(例如,MediaMuxer 创建的 .mp4 文件包装器)。
-
但是为什么解码器队列中的解码信息显示正确的时间戳?
-
在EncodeDecodeTest代码中,PTS由
computePresentationTime()生成,通过queueInputBuffer()或eglPresentationTime()传递给编码器,在BufferInfo中与输出缓冲区一起接收,与输入一起传递给解码器queueInputBuffer()的缓冲区,然后在 BufferInfo 中与输出一起接收。如果您查看 DecodeEditEncodeTest 中的 VideoChunks,您可以看到它为每一帧保存了三个部分(编码数据、标志和 PTS)。时间戳与编解码器内部的缓冲区相关联,但它只是通过。 -
谢谢你。现在我知道
MediaCodec编码器/解码器是如何工作的了。
标签: android ffmpeg encode android-mediacodec pts