質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

Q&A

1回答

4339閲覧

Android MediaExtractor を使用しない MediaCodec デコード方法がわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

0グッド

0クリップ

投稿2015/01/26 05:05

表題通り、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ご提示のコードはコンパイルが通らないみたいですが、動かしてみてエラーが出ているのでしょうか?
エラーの詳細を教えてください。

それと、参考にされたコードのMediaExtractorを取り除く前の状態では動作したのでしょうか。

投稿2015/01/28 12:31

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問