2013-03-31 3 views
3

저수준 미디어 API를 사용하여 mp3 및 다른 형식의 파일을 디코딩하여 처리 할 수 ​​있도록 노력하고 있습니다. 튜토리얼 here을 따라 인코딩 된 파일을 가져 와서 AudioTrack로 다시 재생하고 내 코드는 대체로 동일하지만 오류가 발생합니다. MediaCodec 컨텍스트에서 "OMX_GetExtensionIndex failed"오류는 무엇을 의미하며 어떻게 해결할 수 있습니까?

public void playSongMono(View view) 
{ 
    //create extractor and point it to file 
    AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.song); 

    MediaExtractor extractor = new MediaExtractor(); 
    extractor.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(),fd.getLength()); 

    //get MIME type of file 
    MediaFormat inputFormat = extractor.getTrackFormat(0); 
    Log.d("MonoPlayer","TRACKS #: "+extractor.getTrackCount()); 
    String mime = inputFormat.getString(MediaFormat.KEY_MIME); 
    Log.d("MonoPlayer","FORMAT: "+mime); 

    extractor.selectTrack(0); 

    //create codec 
    MediaCodec codec = MediaCodec.createDecoderByType(mime); 
    Log.d("MonoPlayer","1"); 
    codec.configure(inputFormat, null, null, 0); 
    Log.d("MonoPlayer","2"); 
    codec.start(); 
    Log.d("MonoPlayer","3"); 

    ByteBuffer[] inputBuffers = codec.getInputBuffers(); 
    ByteBuffer[] outputBuffers = codec.getOutputBuffers(); 

    //get a buffer and fill it 
    int inputBufferIndex = codec.dequeueInputBuffer(1000000); 

    if(inputBufferIndex >= 0) 
    { 
     Log.d("MonoPlayer","4"); 
     //fill the buffer 
     int sampleSize = extractor.readSampleData(inputBuffers[inputBufferIndex], 0); 
     long presentationTimeUs = 0; 
     boolean sawInputEOS= false; 

     if (sampleSize < 0) { 
      sawInputEOS = true; 
      sampleSize = 0; 
     } else { 
      presentationTimeUs = extractor.getSampleTime(); 
     } 

     codec.queueInputBuffer(inputBufferIndex, 
           0, 
           sampleSize, 
           presentationTimeUs, 
           sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0); 

     if (!sawInputEOS) { 
      extractor.advance(); 
     } 
    } 

    BufferInfo info = new BufferInfo(); //this will be populated with data by dequeueOutputBuffer 

    //get the index of a finished buffer. since we only enqueued one we should only wait for one 
    int resultBufferIndex = codec.dequeueOutputBuffer(info, 1000000); 

    if (resultBufferIndex >= 0) 
    { 
     Log.d("MonoPlayer","5"); 
     //we now have a buffer of pcm data 
     byte[] chunk = new byte[info.size]; 
     outputBuffers[resultBufferIndex].get(chunk); 
     outputBuffers[resultBufferIndex].clear(); 
     codec.releaseOutputBuffer(resultBufferIndex, false); 

     //create audiotrack to play sound 
     audiotrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
       44100, 
       AudioFormat.CHANNEL_OUT_STEREO, 
       AudioFormat.ENCODING_PCM_16BIT, 
       chunk.length, 
       AudioTrack.MODE_STATIC); 

     audiotrack.play(); 
     audiotrack.write(chunk, 0, chunk.length); 

    } 

    extractor.release(); 
    extractor = null; 

    codec.stop(); 
    codec.release(); 
    codec = null; 
} 

그리고 나는 다음과 같은 로그 캣 출력 위

D MonoPlayer  TRACKS #: 1 
D MonoPlayer  FORMAT: audio/mpeg 
I OMXClient  Using client-side OMX mux. 
D MonoPlayer  1 
E OMXNodeInstance OMX_GetExtensionIndex failed 
D MonoPlayer  2 
D MonoPlayer  3 
D MonoPlayer  4 

를 얻을이 코드의 실행시

내가 언급 한 오류는 다음과 같습니다

여기 내 코드입니다. 나는 왜이 오류가 발생하는지 또는 그것이 무엇을 의미하는지 정확히 알지 못한다. 그러나 일부 정보를 수집하려고했습니다. 로그 출력을 사용하면 오류 codec.configure(inputFormat, null, null, 0);과 함께 오류가 발생합니다. 나는 선을 제거하려고 노력했는데, 이는 잘못된 상태 오류가 될 것으로 예상되지만 문제의 오류를 제거합니다. 또한 내가 게시 한 코드에서 dequeue 호출의 시간 제한이 무기한으로 설정되어 있어도 Log.d("MonoPlayer","5");에 도달하지 않으므로 디코더가 제대로 구성되지 않았다고 가정합니다.

내가이 오류가 발생하는 이유에 대한 정보가 있거나 해결하기 위해 할 수있는 정보가 있다면 그럴 것입니다. 미리 감사드립니다.

답변

1

그 메시지는 아마도 무해합니다. 나는 성공한 시험에서 그것을 본다.

줄 288에서 오는 것 같습니다. OMXNodeInstance.cpp입니다. OMX.google.android.index.enableAndroidNativeBuffers 확장명 조회가 실패합니다. 이는 확장명이 해당 장치에 정의되지 않았 음을 의미합니다.