2017-02-25 13 views
0

MediaCodecを使用してビデオを再生しようとしています。ビデオは再生されていますが、オーディオはミュートです。私はオーディオをミュートしたいと思っています。研究の結果、オーディオとビデオを別々にデコードする必要があることが判明しました。私はMediacodecとMediaExtractorオブジェクトを使ってビデオとオーディオを再生したい。これは達成可能ですか? ビデオの再生に以下のコードを使用しました。MediaCodecとMediaExtractorを使用してビデオとオーディオを再生

 extractor = new MediaExtractor(); 
     extractor.setDataSource(SAMPLE); 

     for (int i = 0; i < extractor.getTrackCount(); i++) { 
      MediaFormat format = extractor.getTrackFormat(i); 
      String mime = format.getString(MediaFormat.KEY_MIME); 
      if (mime.startsWith("video/")) { 
       extractor.selectTrack(i); 
       decoder = MediaCodec.createDecoderByType(mime); 
       decoder.configure(format, surface, null, 0); 
       break; 
      } 
     } 

     if (decoder == null) { 
      Log.e("DecodeActivity", "Can't find video info!"); 
      return; 
     } 

     decoder.start(); 

     ByteBuffer[] inputBuffers = decoder.getInputBuffers(); 
     ByteBuffer[] outputBuffers = decoder.getOutputBuffers(); 
     BufferInfo info = new BufferInfo(); 
     boolean isEOS = false; 
     long startMs = System.currentTimeMillis(); 

     while (!Thread.interrupted()) { 
      if (!isEOS) { 
       int inIndex = decoder.dequeueInputBuffer(10000); 
       if (inIndex >= 0) { 
        ByteBuffer buffer = inputBuffers[inIndex]; 
        int sampleSize = extractor.readSampleData(buffer, 0); 
        if (sampleSize < 0) { 
         // We shouldn't stop the playback at this point, just pass the EOS 
         // flag to decoder, we will get it again from the 
         // dequeueOutputBuffer 
         Log.d("DecodeActivity", "InputBuffer BUFFER_FLAG_END_OF_STREAM"); 
         decoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); 
         isEOS = true; 
        } else { 
         decoder.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime(), 0); 
         extractor.advance(); 
        } 
       } 
      } 

      int outIndex = decoder.dequeueOutputBuffer(info, 10000); 
      switch (outIndex) { 
      case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: 
       Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED"); 
       outputBuffers = decoder.getOutputBuffers(); 
       break; 
      case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: 
       Log.d("DecodeActivity", "New format " + decoder.getOutputFormat()); 
       break; 
      case MediaCodec.INFO_TRY_AGAIN_LATER: 
       Log.d("DecodeActivity", "dequeueOutputBuffer timed out!"); 
       break; 
      default: 
       ByteBuffer buffer = outputBuffers[outIndex]; 
       Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer); 

       // We use a very simple clock to keep the video FPS, or the video 
       // playback will be too fast 
       while (info.presentationTimeUs/1000 > System.currentTimeMillis() - startMs) { 
        try { 
         sleep(10); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
         break; 
        } 
       } 
       decoder.releaseOutputBuffer(outIndex, true); 
       break; 
      } 

      // All decoded frames have been rendered, we can stop playing now 
      if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { 
       Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM"); 
       break; 
      } 
     } 

     decoder.stop(); 
     decoder.release(); 
     extractor.release(); 
    } 

答えて

0

あなたはそれを行うことができない1点の抽出が、オーディオおよびビデオplayback.Only 1つのmediacodec例えば2つのmediacodecインスタンスを使用することができます。 デマルチプレクサの場合、1つのエクストラクタは正常です。ファイルをオーディオストリームとビデオストリームにdemuxします。 しかし、オーディオとビデオのストリームは、オーディオAAC、ビデオAVCなどのような異なるデコーダを使用する必要があります...そして、mediacodecはデコードタイプを動的に変更することはできませんので、ストリームごとに異なるmediacodecインスタンスを作成する必要があります。 プレーヤーはAV同期を考慮する必要があります... https://github.com/saki4510t/AudioVideoPlayerSample

+0

フィードバックをいただきありがとうございます。私は2つの異なるmediacodecインスタンスを使用し、正常に動作します。 –

関連する問題