android - MediaFormat.getByteBuffer ("csd-0") 在某些设备上返回 null

标签 android decoding android-mediacodec aac

我正在尝试在我的应用程序中解码 AAC 编码文件并初始化用于初始化我的 MediaCodec 对象的 MediaFormat 对象,这是设置变量的代码对于 MediaFormat 对象

MediaExtractor mediaExtractor = new MediaExtractor();
        try {
            mediaExtractor.setDataSource(audioFilePath);
        } catch (IOException e) {
            return false;
        }
        Log.d(TAG, "Number of tracks in the file are:" + mediaExtractor.getTrackCount());

        MediaFormat mediaFormat = mediaExtractor.getTrackFormat(0);

        Log.d(TAG, "mediaFormat:" + mediaFormat.toString());

        mSampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
        Log.d(TAG, "mSampleRate: " + mSampleRate);


        mChannels = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);

        Log.d(TAG, "mChannels number of channels: " + mChannels);

        // Reading the duration from the file and converting from micro seconds to milliseconds.
        mDuration = (int) (mediaFormat.getLong(MediaFormat.KEY_DURATION) / 1000);

        Log.d(TAG, "duration: " + mDuration);

        // Getting the csd-0 info from the file ..
        mCSDBuffer = mediaFormat.getByteBuffer("csd-0");

我面临的问题是语句 mCSDBuffer = mediaFormat.getByteBuffer("csd-0") 为某些设备上的同一文件获取了 null。该应用程序正在生产中,我在 Android API 级别为 17、18 和 19 的 armabi-v7a/armabi 处理器设备上看到此错误,并且这些错误中的大部分都在三星设备上。有什么方向吗?

最佳答案

如果 csd-0 缓冲区为空,那么我希望它在传递到 MediaCodec 时仍能正确解码。如果您只是选择不将 csd-0 数据设置为 MediaCodec 的输入(如果它为 null),是否可以?一般来说,如果您直接将 MediaExtractor 输出通过管道传输到 MediaCodec,您应该能够对其进行解码。

尽管 MediaExtractor 输出的数据的实际格式并没有非常严格的规定,所以在实践中众所周知,一些制造商(主要是三星)以只有他们自己的解码器处理的方式改变了这种格式。参见例如https://code.google.com/p/android/issues/detail?id=74356对于另一个相同的情况。

理想情况下,Android CTS 测试会变得更加严格,以确保 MediaExtractor 的行为一致,允许其在更通用的上下文中使用,或者使用除 MediaCodec 之外的其他解码器。 (例如,对于当前的三星问题,您不能在一台设备上使用 MediaExtractor,通过网络将提取的数据发送到另一台设备并在那里解码。)

关于android - MediaFormat.getByteBuffer ("csd-0") 在某些设备上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41014730/

相关文章:

javascript - 如何将以下代码(例如\u00e8,\u00e9)以字符串格式解码并输出到Python中的符号

base64 - 将 Base64 编码转换为 XLSX

Android:在特定端口上收到短信后启动应用程序

android - AVD 屏幕录制无法正常工作

Android:警报在预定时间之前被触发

python - 如何解码文件名

安卓 MediaCodec 解码器 : Slow Down Video Playback

android - 暂停/恢复 MediaCodec

Android 9 AAC 解码器使用 ffmpeg 编码文件输出零样本

java - 在java中处理HTTP请求重定向