表題通り、MediaExtractor を使用しない場合の MediaCodec のデコード方法がわかりません。
自分が探した限りでは MediaCodecによるデコードのサンプルはほとんどが MediaExtractor を使用したものばかりでした。
MediaExtractor を使用したくない理由として再生をしながら メタデータ(icy-meta, Shoutcast)、MP3 Rawバイナリを操作したいと考えているからです。
MediaExtractor をもちいたデコードの サンプル を元にFileInputStreamを使用したコードを書いてみました。
エラーが起きてまともにデコードできません。
lang
1package com.test; 2 3import android.app.Activity; 4import android.media.AudioFormat; 5import android.media.AudioManager; 6import android.media.AudioTrack; 7import android.media.MediaCodec; 8import android.media.MediaCodec.BufferInfo; 9 10import android.media.MediaFormat; 11import android.os.Bundle; 12import android.os.Environment; 13import android.util.Log; 14import java.io.File; 15import java.io.FileInputStream; 16import java.io.IOException; 17import java.nio.ByteBuffer; 18 19import com.test.R; 20 21public class AndroidTestActivity extends Activity { 22 23 private static final String TAG = "TAG"; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.main); 29 30 new Thread() { 31 @Override 32 public void run() { 33 try { 34 process(); 35 } catch (IOException e) { 36 e.printStackTrace(); 37 } 38 } 39 }.start(); 40 } 41 42 private synchronized void process() throws IOException { 43 44 45 46 File inputFile = new File(Environment.getExternalStorageDirectory().getPath() + "/download/music/test.mp3"); 47 FileInputStream fis = new FileInputStream(inputFile); 48 49 50 MediaFormat format = MediaFormat.createAudioFormat("audio/mpeg", 44100,2); 51 String mime = format.getString(MediaFormat.KEY_MIME); 52 //int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE); 53 54 55 MediaCodec codec = MediaCodec.createDecoderByType(mime); 56 codec.configure(format, null , null , 0); 57 codec.start(); 58 59 60 ByteBuffer[] codecInputBuffers = codec.getInputBuffers(); 61 ByteBuffer[] codecOutputBuffers = codec.getOutputBuffers(); 62 63 64 65 AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, 66 format.getInteger(MediaFormat.KEY_SAMPLE_RATE), 67 AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, 68 8000, AudioTrack.MODE_STREAM); 69 track.play(); 70 71 BufferInfo info = new BufferInfo(); 72 boolean inputEos = false; 73 boolean outputEos = false; 74 long timeoutUs = 1000; 75 76 byte[] tempBuffer = new byte[8192]; 77 78 while (!outputEos) { 79 80 if (!inputEos) { 81 82 int inputBufIndex = codec.dequeueInputBuffer(timeoutUs); 83 if (inputBufIndex >= 0) { 84 85 ByteBuffer buf = codecInputBuffers[inputBufIndex]; 86 87 88 int bytesRead = fis.read(tempBuffer, 0, buf.limit()); 89 90 long presentationTimeUs = 0; 91 if (bytesRead = 0) { 92 93 int outputBufIndex = res; 94 95 ByteBuffer buf = codecOutputBuffers[outputBufIndex]; 96 byte[] dst = new byte[info.size]; 97 int oldPosition = buf.position(); 98 99 buf.get(dst); 100 buf.position(oldPosition); 101 102 //Play music 103 track.write(dst, 0, dst.length); 104 105 codec.releaseOutputBuffer(outputBufIndex, false); 106 107 if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { 108 Log.d(TAG, "output eos."); 109 outputEos = true; 110 } 111 } else if (res == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { 112 Log.d(TAG, "output buffer changed."); 113 codecOutputBuffers = codec.getOutputBuffers(); 114 } else if (res == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { 115 MediaFormat f = codec.getOutputFormat(); 116 Log.d(TAG, "output format changed. " + f); 117 //track.setPlaybackRate(f.getInteger(MediaFormat.KEY_SAMPLE_RATE)); 118 } 119 } 120 121 Log.d(TAG, "complete stop!"); 122 fis.close(); 123 codec.stop(); 124 codec.release(); 125 } 126 127 128}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。