/** * 音频必须是aac,视频需要是H264或mpeg4 */ private void muxing(String audioFilePath,String videoFilePath) { String outputFile = ""; try { File file = new File(Environment.getExternalStorageDirectory() + File.separator + "final.mp4"); file.createNewFile(); outputFile = file.getAbsolutePath(); //创建视频分离器 MediaExtractor videoExtractor = new MediaExtractor(); videoExtractor.setDataSource(videoFilePath); //创建音频分离器 MediaExtractor audioExtractor = new MediaExtractor(); audioExtractor.setDataSource(audioFilePath); Log.d(TAG, "Video Extractor Track Count " + videoExtractor.getTrackCount()); Log.d(TAG, "Audio Extractor Track Count " + audioExtractor.getTrackCount()); //创建混音器 MediaMuxer muxer = new MediaMuxer(outputFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); //选中轨道0 videoExtractor.selectTrack(0); //----------------- //int trackCount = videoExtractor.getTrackCount(); //MediaFormat trackFormat = videoExtractor.getTrackFormat(trackCount); //String mime = trackFormat.getString(MediaFormat.KEY_MIME); //Log.i(TAG,"video mime:" + mime);//mime=video/avc //----------------- //获取音频格式封装对象 MediaFormat videoFormat = videoExtractor.getTrackFormat(0); int videoTrack = muxer.addTrack(videoFormat); //选中轨道0 audioExtractor.selectTrack(0); //trackCount = audioExtractor.getTrackCount(); //trackFormat = audioExtractor.getTrackFormat(trackCount); //mime = trackFormat.getString(MediaFormat.KEY_MIME); //Log.i(TAG,"audio mime:" + mime);//mime=audio/mp4a-latm //获取视频格式封装对象 MediaFormat audioFormat = audioExtractor.getTrackFormat(0); //向混音器添加音轨 int audioTrack = muxer.addTrack(audioFormat); Log.d(TAG, "Video Format " + videoFormat.toString()); Log.d(TAG, "Audio Format " + audioFormat.toString()); 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(); //将位置移动到0 videoExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC); audioExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC); //开启混音器 muxer.start(); 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(); //if(audioBufferInfo.presentationTimeUs > 5*1000*1000){ // break; //} Log.d(TAG, "Frame (" + frameCount + ") Video PresentationTimeUs:" + videoBufferInfo.presentationTimeUs + " Flags:" + videoBufferInfo.flags + " Size(KB) " + videoBufferInfo.size / 1024); Log.d(TAG, "Frame (" + frameCount + ") Audio PresentationTimeUs:" + audioBufferInfo.presentationTimeUs + " Flags:" + audioBufferInfo.flags + " Size(KB) " + audioBufferInfo.size / 1024); } } 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++; Log.d(TAG, "Frame (" + frameCount + ") Video PresentationTimeUs:" + videoBufferInfo.presentationTimeUs + " Flags:" + videoBufferInfo.flags + " Size(KB) " + videoBufferInfo.size / 1024); Log.d(TAG, "Frame (" + frameCount + ") Audio PresentationTimeUs:" + audioBufferInfo.presentationTimeUs + " Flags:" + audioBufferInfo.flags + " Size(KB) " + audioBufferInfo.size / 1024); } } muxer.stop(); muxer.release(); audioExtractor.release(); videoExtractor.release(); } catch (IOException e) { Log.d(TAG, "Mixer Error 1 " + e.getMessage()); } catch (Exception e) { Log.d(TAG, "Mixer Error 2 " + e.getMessage()); } }
音视频合成
最新推荐文章于 2024-08-23 12:02:23 发布