当前位置: 首页 > 知识库问答 >
问题:

MediaFormat。getByteBuffer(“csd-0”)在某些设备上返回null

冯野
2023-03-14

我试图在我的应用程序中解码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处理器设备上看到了这个错误,大多数错误都发生在三星设备上。有什么方向吗?

共有1个答案

凌博实
2023-03-14

如果csd-0缓冲区为空,那么我希望它在传递到MediaCodec时仍能正确解码。如果您只是选择不将csd-0数据设置为MediaCodec的输入,如果它为空,会这样做吗?一般来说,如果直接将MediaExtractor输出传输到MediaCodec,则应该能够对其进行解码。

不过,MediaExtractor输出的数据的实际格式并没有严格规定,因此在实践中,一些制造商(主要是三星)会以只有自己的解码器才能处理的方式进行更改。见例句。https://code.google.com/p/android/issues/detail?id=74356另一起同样的案子。

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

 类似资料:
  • 问题内容: 我正在尝试获取文件的大小,然后再下载。我曾经这样做,它在我的家用计算机Android 2.1 Emulator上运行良好。 但是,一旦我从手机(WiFi或3G)运行我的应用程序,该功能将无法使用,而当我从工作笔记本电脑的Android 2.1仿真器中运行该应用程序时,它也将无法使用。 有谁知道解决方法?还有另一种方法可以获取文件的大小,而无需使用。 问题答案: 此信息并非始终可用。通常

  • 和onActivityResult 和错误的堆栈跟踪 stack_trace=java.lang.runtimeException:未能将结果ResultInfo{who=null,request=1,result=-1,data=intent{act=inline-data(havs extras)}}传递到活动{com.madhours/com.madhours.activities.acti

  • 我的Android应用程序无法安装在一些“随机”、较旧的API设备上(任何低于API级别25的设备),错误如下: 所以,基本上看起来… API 我见过类似的问题,答案与小写的包名有关。我已经有了。 有人有什么想法吗? 舱单: BTW我用的是Visual Studio 2019和一夫一妻制3.7

  • 最近,我们在Android应用程序中增加了对Chromecast的支持,但在对各种移动设备(手机和平板电脑)的扩展测试中,发现在许多移动设备上,Flipps应用程序都没有发现Chromecast。在相同的设备上,我们使用了最新版本的官方Chromecast SDK演示应用程序进行测试,该应用程序从https://github.com/googlecast/castvideo-Android下载(主

  • 我正试图在后台获取用户位置。在我的手机(htc one m7)上一切都很好,但出于某种原因,它不能在我测试的两个设备上工作:三星galaxy s3索尼Xperia Z1 顺便说一句:我把所有东西都添加到了清单中。

  • 问题内容: 我看到Google Play中与Fabric / Crashlytics相关的崩溃。从正常的Crashlytics更新到新的Fabric Crashlytics之后,发生了这种情况。我只能在其中一台设备(Galaxy S2)上重现它。我拥有的所有其他设备(Nexus 5和S4)都没有崩溃。这是堆栈跟踪: 这是我的build.gradle的内容: 问题答案: 我只是凭直觉就知道了!升级到