Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;JNI错误:GetStringUTFChars收到空jstring";调用MediaCodec.configure()时_Java_Android_Java Native Interface_Android Mediacodec - Fatal编程技术网

Java &引用;JNI错误:GetStringUTFChars收到空jstring";调用MediaCodec.configure()时

Java &引用;JNI错误:GetStringUTFChars收到空jstring";调用MediaCodec.configure()时,java,android,java-native-interface,android-mediacodec,Java,Android,Java Native Interface,Android Mediacodec,我想从*.mp3文件中获取原始数据。我发现这对我来说很好,但我 A/64.myproj: java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: GetStringUTFChars received NULL jstring java_vm_ext.cc:542] in call to GetStringUTFChars java_vm_ext.cc:542] from void android.media.M

我想从*.mp3文件中获取原始数据。我发现这对我来说很好,但我

A/64.myproj: java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: GetStringUTFChars received NULL jstring
    java_vm_ext.cc:542]     in call to GetStringUTFChars
    java_vm_ext.cc:542]     from void android.media.MediaCodec.native_configure(java.lang.String[], java.lang.Object[], android.view.Surface, android.media.MediaCrypto, android.os.IHwBinder, int)
    java_vm_ext.cc:542] "main" prio=5 tid=1 Runnable
    java_vm_ext.cc:542]   | group="main" sCount=0 dsCount=0 flags=0 obj=0x74071ee0 self=0xed774000
    java_vm_ext.cc:542]   | sysTid=1552 nice=-10 cgrp=default sched=0/0 handle=0xf2463494
    java_vm_ext.cc:542]   | state=R schedstat=( 993990291 519274343 1413 ) utm=70 stm=29 core=1 HZ=100
    java_vm_ext.cc:542]   | stack=0xff31c000-0xff31e000 stackSize=8MB
mediaCodec.configure上配置(mediaFormat,null,null,0)

代码如下:

public static void foo(String filepath) throws IOException {
    MediaExtractor mediaExtractor = new MediaExtractor();
    mediaExtractor.setDataSource(filepath);
    MediaFormat mediaFormat = mediaExtractor.getTrackFormat(0);
    mediaExtractor.release();
    MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    mmr.setDataSource(filepath);
    final long durationMs = Long.parseLong(mmr.extractMetadata(
            MediaMetadataRetriever.METADATA_KEY_DURATION));
    mmr.release();

    MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
    mediaFormat.setString(MediaFormat.KEY_FRAME_RATE, null);
    String codecName = mediaCodecList.findDecoderForFormat(mediaFormat);
    MediaCodec mediaCodec = MediaCodec.createByCodecName(codecName);
    mediaCodec.setCallback(new MediaCodec.Callback() {
        @Override
        public void onInputBufferAvailable(MediaCodec codec, int index) {
            File file = new File(filepath);
            int size = (int) file.length();
            byte[] bytes = new byte[size];
            ByteBuffer in = codec.getInputBuffer(index);
            try (BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file))) {
                buf.read(bytes, 0, bytes.length);
                in.put(bytes);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            codec.queueInputBuffer(
                    index,
                    0,
                    size,
                    durationMs * 1000L,
                    MediaCodec.BUFFER_FLAG_END_OF_STREAM);
        }

        @Override
        public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {
            ByteBuffer out = codec.getOutputBuffer(index);
            short buf[] = out.asShortBuffer().array();
        }

        @Override
        public void onError(MediaCodec codec, MediaCodec.CodecException e) {}

        @Override
        public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {}
    });
    mediaCodec.configure(mediaFormat, null, null, 0);
    mediaCodec.start();
}

和。

findDecoderForFormat的文档说明,如果未找到此类编解码器,则返回“null”。同时,
createByCodeName
的文档中说,传递给它的名称“决不能为空”。因此,显然您必须处理该场景。
mediaFormat.setString(mediaFormat.KEY\u FRAME\u RATE,null)可能是问题所在。只是不要设置它,这通常是不必要的。由于未正确处理
null
值,可能仍然是制造商的错误。你在用什么设备?@Michael,是的,但目前还没有问题-MediaCodec创建正确,它会抛出
NullPointerException
或者something@ChrisBe,我试过了,没有改变。顺便说一句,它本身已经有了
null
:)我正在使用Android Studio的模拟器-Nexus 5X API 28hm,帧速率仍然为null,这可能是崩溃的原因。您是否尝试将其设置为实际值?试试25,你可能希望它会被MediaCode忽略。
findDecoderForFormat
的文档说它返回“如果没有找到这样的编解码器,则返回null”。同时,
createByCodeName
的文档中说,传递给它的名称“决不能为空”。因此,显然您必须处理该场景。
mediaFormat.setString(mediaFormat.KEY\u FRAME\u RATE,null)可能是问题所在。只是不要设置它,这通常是不必要的。由于未正确处理
null
值,可能仍然是制造商的错误。你在用什么设备?@Michael,是的,但目前还没有问题-MediaCodec创建正确,它会抛出
NullPointerException
或者something@ChrisBe,我试过了,没有改变。顺便说一句,它本身已经有了
null
:)我正在使用Android Studio的模拟器-Nexus 5X API 28hm,帧速率仍然为null,这可能是崩溃的原因。您是否尝试将其设置为实际值?试试25,你可能希望它被mediacodec忽略