2016-08-04 14 views
2

私はmp3オーディオファイルとmp4ビデオファイル(サウンドなし)でAndroid Appを開発しています。MediaMuxerを使用してオーディオとビデオをマージする方法は?

ここでは、それらをミックスして、新しいmp4ビデオファイル(サウンド付き)を作成します。 Android 4.3からは、MediaMuxerクラスを使用してストリームのオーディオとビデオをミックスすることをお勧めします。私は成功しなくても何度も試みました。

不明なMIMEタイプ 'オーディオ/ MPEG':私は以下のエラーを取得する

private void muxing() { 

    String outputFile = ""; 

    try { 

     File file = new File(Environment.getExternalStorageDirectory() + "/final2.mp4"); 
     file.createNewFile(); 
     outputFile = file.getAbsolutePath(); 
     MediaExtractor videoExtractor = new MediaExtractor(); 
     videoExtractor.setDataSource(Environment.getExternalStorageDirectory().toString()+"/vd1.h264"); 
     MediaExtractor audioExtractor = new MediaExtractor(); 
     audioExtractor.setDataSource(Environment.getExternalStorageDirectory()+"/audioVideoDir/audio.m4a"); 
     MediaMuxer muxer = new MediaMuxer(outputFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); 

     videoExtractor.selectTrack(0); 
     MediaFormat videoFormat = videoExtractor.getTrackFormat(0); 
     int videoTrack = muxer.addTrack(videoFormat); 

     audioExtractor.selectTrack(0); 
     MediaFormat audioFormat = audioExtractor.getTrackFormat(0); 
     int audioTrack = muxer.addTrack(audioFormat); 
     boolean sawEOS = false; 
     int frameCount = 0; 
     int offset = 100; 
     int sampleSize = 256 * 1024; 
     ByteBuffer videoBuf = ByteBuffer.allocate(sampleSize); 
     ByteBuffer audioBuf = ByteBuffer.allocate(sampleSize); 
     MediaCodec.BufferInfo videoBufferInfo = new MediaCodec.BufferInfo(); 
     MediaCodec.BufferInfo audioBufferInfo = new MediaCodec.BufferInfo(); 


     videoExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC); 
     audioExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC); 

     muxer.start(); 

     while (!sawEOS) 
     { 
      videoBufferInfo.offset = offset; 
      videoBufferInfo.size = videoExtractor.readSampleData(videoBuf, offset); 


      if (videoBufferInfo.size < 0 || audioBufferInfo.size < 0) 
      { 
       // Log.d(TAG, "saw input EOS."); 
       sawEOS = true; 
       videoBufferInfo.size = 0; 

      } 
      else 
      { 
       videoBufferInfo.presentationTimeUs = videoExtractor.getSampleTime(); 
       videoBufferInfo.flags = videoExtractor.getSampleFlags(); 
       muxer.writeSampleData(videoTrack, videoBuf, videoBufferInfo); 
       videoExtractor.advance(); 


       frameCount++; 

      } 
     } 

     Toast.makeText(getApplicationContext() , "frame:" + frameCount , Toast.LENGTH_SHORT).show(); 



     boolean sawEOS2 = false; 
     int frameCount2 =0; 
     while (!sawEOS2) 
     { 
      frameCount2++; 

      audioBufferInfo.offset = offset; 
      audioBufferInfo.size = audioExtractor.readSampleData(audioBuf, offset); 

      if (videoBufferInfo.size < 0 || audioBufferInfo.size < 0) 
      { 
       // Log.d(TAG, "saw input EOS."); 
       sawEOS2 = true; 
       audioBufferInfo.size = 0; 
      } 
      else 
      { 
       audioBufferInfo.presentationTimeUs = audioExtractor.getSampleTime(); 
       audioBufferInfo.flags = audioExtractor.getSampleFlags(); 
       muxer.writeSampleData(audioTrack, audioBuf, audioBufferInfo); 
       audioExtractor.advance(); 

      } 
     } 

     Toast.makeText(getApplicationContext() , "frame:" + frameCount2 , Toast.LENGTH_SHORT).show(); 

     muxer.stop(); 
     muxer.release(); 


    } catch (IOException e) { 

    } catch (Exception e) { 

    } 
} 

:ここ

はコードです。 12月9日11:58:33.569:A/MPEG4Writer(332):フレームワーク/ AV /メディア/ libstagefright/MPEG4Writer.cpp:2699 CHECK

どれ(! "ここではすべきではない、未知のMIMEタイプ。")私の問題をGoogleのMediaMuxer APIで解決する方法は?私もオーディオとビデオのマージ後にffmpegで試してみましたが、ビデオはアンドロイドデバイスのデフォルトビデオプレーヤーで再生されませんが、Vlcプレーヤーに読み込まれます。

FFMPEGここから続く:https://github.com/WritingMinds/ffmpeg-android-java

答えて

0

は、MP4ビデオファイルを追加しよう。 私のために働いています。出力ファイルはオーディオの持続時間です。

関連する問題