gpt4 book ai didi

android - 媒体编解码器 : how to measure performance?

转载 作者:行者123 更新时间:2023-11-29 21:34:43 26 4
gpt4 key购买 nike

我正在阅读有关 MediaCodec 的 Android 文档和其他在线教程/示例。据我了解,使用 MediaCodec 的方式是这样的(伪代码中的解码器示例):

    //-------- prepare audio decoder, format, buffers, and files  --------
MediaExtractor extractor;
MediaCodec codec;
ByteBuffer[] codecInputBuffers;
ByteBuffer[] codecOutputBuffers;
extractor = new MediaExtractor();
extractor.setDataSource();
MediaFormat format = extractor.getTrackFormat(0);

//---------------- start decoding ----------------
codec = MediaCodec.createDecoderByType(mime);
codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
codec.start();
codecInputBuffers = codec.getInputBuffers();
codecOutputBuffers = codec.getOutputBuffers();
extractor.selectTrack(0);

//---------------- decoder loop ----------------
while (MP3_file_not_EOS) {

//-------- grasp control of input buffer from codec --------
codec.dequeueInputBuffer();

//---- fill input buffer with data from MP3 file ----
extractor.readSampleData();

//-------- release input buffer so codec can have it --------
codec.queueInputBuffer();

//-------- grasp control of output buffer from codec --------
codec.dequeueOutputBuffer();

//-- copy PCM samples from output buffer into another buffer --
short[] PCMoutBuffer = copy_of(OutputBuffer);

//-------- release output buffer so codec can have it --------
codec.releaseOutputBuffer();

//-------- write PCMoutBuffer into a file, or play it -------
}

//---------------- stop decoding ----------------
codec.stop();
codec.release();

这是使用 MediaCodec 的正确方法吗?如果没有,请用正确的方法启发我。如果这是正确的方法,我该如何衡量 MediaCodec 的性能?是codec.dequeueOutputBuffer()返回和codec.queueInputBuffer()返回的时间差吗?我想要微秒的准确度/精度。感谢您的想法和想法。

最佳答案

(合并评论并略微展开)

您不能简单地计算单个缓冲区提交所花费的时间,因为编解码器可能希望在执行任何操作之前对多个缓冲区进行排队。您需要对其进行总体测量,使用 System.nanoTime() 对整个文件解码的持续时间进行计时。如果您将 copy_of 操作变为空操作并仅丢弃解码数据,则您会将输出端(将解码数据写入磁盘)排除在计算之外。

从输入端排除 I/O 比较困难。正如 MediaCodec 文档中所述,编码的输入/输出“不是字节流,而是访问单元流”。因此,您必须在 MediaFormat 中填充任何必要的特定于编解码器的数据键,然后识别各个输入帧,以便您可以正确地提供给编解码器。

一种更简单但不太准确的方法是进行单独的传递,计算读取输入数据所需的时间,然后从总时间中减去该时间。在您的示例代码中,您将保留对 extractor 的操作(如 readSampleData),但不对 codec 执行任何操作(可能出列一个缓冲区,只是每次都重复使用)。这样您只测量 MediaExtractor 开销。这里的技巧是在完整测试之前立即运行两次,并忽略第一次的结果——第一次通过“预热”磁盘缓存。

如果您对设备之间的性能差异感兴趣,可能是输入 I/O 时间的差异,尤其是来自“热”缓存的差异足够相似且足够小,您可以忽略它并且不经历所有额外的体操。

关于android - 媒体编解码器 : how to measure performance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665172/

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