마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

mediacodec 으로 player 만들기 핼프~

0 추천
도와주세여 mediacodec으로 player만드는데 서비스를 이용해서 백드라운드로
동작 되게 만들려고 하거든요 이게 지금 서비스 쪽인데 여기저기 따다가 
만들었는데 뭘 더 해야할지 모르겠어요 지금 제가 만든게
pcm으로 잘 만들어진건지.. 다음엔 뭘더 해야하는지.. 깝깝해서 질문올려요 ㅠ


public class SimpleService extends Service implements OnCompletionListener {

 MediaPlayer mediaPlayer;
 private MediaExtractor mExtractor = null;
 private MediaCodec mMediaCodec = null;
 private AudioTrack mAudioTrack = null;
 private Decoder Decoder;
 private final IBinder basBinder = new SimpleServiceBinder();

 @Override
 public void onCreate() {
//  mediaPlayer.setOnCompletionListener(this);
 }
 
 public enum State
 {
  Stopped, Prepare, Buffering, Playing, Pause
 };
 State mState = State.Stopped;
 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return basBinder;
 }

 @Override
 public int onStartCommand(Intent intent, int Flags, int startId) {

  ByteBuffer[] codecInputBuffers;
  ByteBuffer[] codecOutputBuffers;
  
//  Decoder.decoder();
  mExtractor = new MediaExtractor();
  
  loder();
  MediaFormat format = mExtractor.getTrackFormat(0);
  String mime = format.getString(MediaFormat.KEY_MIME);
  try {
   mMediaCodec = MediaCodec.createDecoderByType(mime);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  mMediaCodec.configure(format, null, null, 0);
  mMediaCodec.start();
  codecInputBuffers = mMediaCodec.getInputBuffers();
  codecOutputBuffers = mMediaCodec.getOutputBuffers();

  int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);

  mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
    sampleRate,
    AudioFormat.CHANNEL_OUT_STEREO, 
    AudioFormat.ENCODING_PCM_16BIT,
    AudioTrack.getMinBufferSize(sampleRate,
      AudioFormat.CHANNEL_OUT_STEREO,
      AudioFormat.ENCODING_PCM_16BIT), 
      AudioTrack.MODE_STREAM);

  mAudioTrack.play();

  mExtractor.selectTrack(0);

//  final long kTimeOutUs = 10000;
//  MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
//  boolean sawInputEOS = false;
//  int noOutputCounter = 0;
//  int noOutputCounterLimit = 50;

//  while (true) {
//   int res = mMediaCodec.dequeueOutputBuffer(info, kTimeOutUs);
//  }
  
  
  return START_STICKY;

 }

 public void onDestroy() {
  Log.e("onDestroy", "service");
  if (mediaPlayer.isPlaying()) {
   mediaPlayer.stop();
  }
  mediaPlayer.release();
 }

 @Override
 public void onCompletion(MediaPlayer mp) {
  // TODO Auto-generated method stub
  stopSelf();
 }

 public class SimpleServiceBinder extends Binder {
  SimpleService getService() {
   return SimpleService.this;
  }
 }

// public void havefun() {
//  if (mediaPlayer.isPlaying()) {
//   mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() - 2500);
//  }
// }

 public void loder() {

  try {
   mExtractor.setDataSource("/sdcard/testiu.mp3");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

 

프리머니 (270 포인트) 님이 2015년 7월 22일 질문
여백이 자꾸 &nbsp로 나오네요 보기 불편해서 죄송요 ㅠ
일단 기본적으로 그냥 play stop만 동작되게끔 만드는건데 어려워요 ㅠ

1개의 답변

0 추천
 
채택된 답변
http://drcarter.tistory.com/162 소스를 참조 해 보세요
사악미소 (65,330 포인트) 님이 2015년 7월 22일 답변
프리머니님이 2015년 7월 22일 채택됨
안그래도 그소스에서 좀 긁어 왔어요 ㅎㅎㅎ

저 소스에서 extractor.setdatasource(요기) 이 부분에 raw 폴더에있는데 mp3파일을 읽히게 하고 싶은데 어떻게 적어야 할까여?
API 중
final void    setDataSource(FileDescriptor fd) 나
final void    setDataSource(FileDescriptor fd, long offset, long length)를 쓰시면 될 듯 하네요..

FileDescriptor 는 아래 방식대로 구하시면 될거구요..

FileInputStream fdstream = getResources().openRawResource (R.raw."리소스 이름");
FileDescriptor fd = fdstream.getFD();
...