저수준 미디어 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");
에 도달하지 않으므로 디코더가 제대로 구성되지 않았다고 가정합니다.
내가이 오류가 발생하는 이유에 대한 정보가 있거나 해결하기 위해 할 수있는 정보가 있다면 그럴 것입니다. 미리 감사드립니다.