h264与aac(不包含adts头)合成mp4。
package local.asuper.localplayer.mediacodec;
import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.media.MediaMuxer;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
import java.io.IOException;
import java.nio.ByteBuffer;
/**
* @说明 h264 aac muxer 成mp4
* 直接muxer h264和aac 无法muxer,
* audioExtractor.setDataSource(sdcard_path + "/input.aac");无法读取
* 1.需要将h264先混合成mpeg4包装的mp4(无音频)
* 2.需要将aac(无adts)先混合成mpeg4容器包装的mp4(无视频)
* 3.muxer混合包装好的音频和视频(分别从包装好的中重新分离出来aac和H264),生成新的视频文件
*/
public class H264_AAC_toMp4_MediaMuxer {
private static String TAG = "H264_AAC_toMp4_MediaMuxer";
/**
* aac 复用 成mp4(无视频)
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public static void muxerAudio(String sdcard_path) {
MediaMuxer audioMuxer;
MediaExtractor mediaExtractor = null;
try {
mediaExtractor = new MediaExtractor();
audioMuxer = new MediaMuxer(sdcard_path + "/mux_audio.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
mediaExtractor.setDataSource(sdcard_path + "/input.mp4");
int trackCount = mediaExtractor.getTrackCount();
int audioTrackIndex = -1;
for (int i = 0; i < trackCount; i++) {
MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);
String mineType = trackFormat.getString(MediaFormat.KEY_MIME);
//音频信道
if (mineType.startsWith("audio/")) {
audioTrackIndex = i;
}
}
ByteBuffer byteBuffer = ByteBuffer.allocate(500 * 1024);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
//切换到音频信道
mediaExtractor.selectTrack(audioTrackIndex);
MediaFormat trackFormat = mediaExtractor.getTrackFormat(audioTrackIndex);
int writeAudioIndex = audioMuxer.addTrack(trackFormat);
audioMuxer.start();
long sampletime = 0;
long first_sa