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_sampletime = 0;long second_sampletime = 0;{//  mediaExtractor.readSampleData(byteBuffer, 0);//   mediaExtractor.advance();mediaExtractor.readSampleData(byteBuffer, 0);first_sampletime = mediaExtractor.getSampleTime();mediaExtractor.advance();second_sampletime = mediaExtractor.getSampleTime();sampletime = Math.abs(second_sampletime - first_sampletime);//时间戳}mediaExtractor.unselectTrack(audioTrackIndex);mediaExtractor.selectTrack(audioTrackIndex);while (true) {int readSampleCount = mediaExtractor.readSampleData(byteBuffer, 0);Log.d(TAG, "audio:readSampleCount:" + readSampleCount);if (readSampleCount < 0) {break;}bufferInfo.size = readSampleCount;bufferInfo.offset = 0;bufferInfo.flags = mediaExtractor.getSampleFlags();bufferInfo.presentationTimeUs += sampletime;audioMuxer.writeSampleData(writeAudioIndex, byteBuffer, bufferInfo);byteBuffer.clear();mediaExtractor.advance();}Log.d(TAG, "muxerAudio finished!\n");audioMuxer.stop();audioMuxer.release();mediaExtractor.release();} catch (IOException e) {e.printStackTrace();}}/*** h264 复用 成 mp4(无音频)*/@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)public static void muxerVideo(String sdcard_path) {MediaMuxer videoMuxer;MediaExtractor mediaExtractor = null;try {mediaExtractor = new MediaExtractor();videoMuxer = new MediaMuxer(sdcard_path + "/mux_video.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);mediaExtractor.setDataSource(sdcard_path + "/input.mp4");int trackCount = mediaExtractor.getTrackCount();int videoTrackIndex = -1;for (int i = 0; i < trackCount; i++) {MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);String mineType = trackFormat.getString(MediaFormat.KEY_MIME);//音频信道if (mineType.startsWith("video/")) {videoTrackIndex = i;}}ByteBuffer byteBuffer = ByteBuffer.allocate(500 * 1024);MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();//切换到音频信道mediaExtractor.selectTrack(videoTrackIndex);MediaFormat trackFormat = mediaExtractor.getTrackFormat(videoTrackIndex);int writeVideoIndex = videoMuxer.addTrack(trackFormat);videoMuxer.start();long sampletime = 0;long first_sampletime = 0;long second_sampletime = 0;{//  mediaExtractor.readSampleData(byteBuffer, 0);//   mediaExtractor.advance();mediaExtractor.readSampleData(byteBuffer, 0);first_sampletime = mediaExtractor.getSampleTime();mediaExtractor.advance();second_sampletime = mediaExtractor.getSampleTime();sampletime = Math.abs(second_sampletime - first_sampletime);//时间戳}//上面只是获取时间戳,获取完后,重新选择下trackmediaExtractor.unselectTrack(videoTrackIndex);mediaExtractor.selectTrack(videoTrackIndex);while (true) {int readSampleCount = mediaExtractor.readSampleData(byteBuffer, 0);Log.d(TAG, "audio:readSampleCount:" + readSampleCount);if (readSampleCount < 0) {break;}bufferInfo.size = readSampleCount;bufferInfo.offset = 0;bufferInfo.flags = mediaExtractor.getSampleFlags();bufferInfo.presentationTimeUs += sampletime;videoMuxer.writeSampleData(writeVideoIndex, byteBuffer, bufferInfo);byteBuffer.clear();mediaExtractor.advance();}Log.d(TAG, "muxerVideo finished!\n");videoMuxer.stop();videoMuxer.release();mediaExtractor.release();} catch (IOException e) {e.printStackTrace();}}/*** 合并上面生成的aac(mp4容器) 和 h264(mp4容器)** @param sdcard_path*/@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)public static void combineVideo(String sdcard_path) {MediaMuxer mediaMuxer;MediaExtractor videoExtractor = null;MediaExtractor audioExtractor = null;try {audioExtractor = new MediaExtractor();videoExtractor = new MediaExtractor();mediaMuxer = new MediaMuxer(sdcard_path + "/mux_output.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);videoExtractor.setDataSource(sdcard_path + "/mux_video.mp4");audioExtractor.setDataSource(sdcard_path + "/mux_audio.mp4");int trackCount = videoExtractor.getTrackCount();int videoTrackIndex = -1;for (int i = 0; i < trackCount; i++) {MediaFormat videoFormat = videoExtractor.getTrackFormat(i);String mineType = videoFormat.getString(MediaFormat.KEY_MIME);//视频信道if (mineType.startsWith("video/")) {videoTrackIndex = i;}}int audioTrackIndex = -1;for (int i = 0; i < trackCount; i++) {MediaFormat audioFormat = audioExtractor.getTrackFormat(i);String mineType = audioFormat.getString(MediaFormat.KEY_MIME);//视频信道if (mineType.startsWith("audio/")) {audioTrackIndex = i;}}ByteBuffer byteBuffer = ByteBuffer.allocate(500 * 1024);MediaCodec.BufferInfo audiobufferInfo = new MediaCodec.BufferInfo();MediaCodec.BufferInfo videobufferInfo = new MediaCodec.BufferInfo();videoExtractor.selectTrack(videoTrackIndex);audioExtractor.selectTrack(audioTrackIndex);MediaFormat videotrackFormat = videoExtractor.getTrackFormat(videoTrackIndex);int writeVideoIndex = mediaMuxer.addTrack(videotrackFormat);MediaFormat audiotrackFormat = audioExtractor.getTrackFormat(audioTrackIndex);int writeAudioIndex = mediaMuxer.addTrack(audiotrackFormat);mediaMuxer.start();//videolong sampletime = 0;long first_sampletime = 0;long second_sampletime = 0;{videoExtractor.readSampleData(byteBuffer, 0);first_sampletime = videoExtractor.getSampleTime();videoExtractor.advance();second_sampletime = videoExtractor.getSampleTime();sampletime = Math.abs(second_sampletime - first_sampletime);//时间戳Log.d(TAG, "sampletime" + sampletime);}//上面只是获取时间戳,获取完后,重新选择下trackvideoExtractor.unselectTrack(videoTrackIndex);videoExtractor.selectTrack(videoTrackIndex);while (true) {int readSampleCount = videoExtractor.readSampleData(byteBuffer, 0);Log.d(TAG, "audio:readSampleCount:" + readSampleCount);if (readSampleCount < 0) {break;}audiobufferInfo.size = readSampleCount;audiobufferInfo.offset = 0;audiobufferInfo.flags = videoExtractor.getSampleFlags();audiobufferInfo.presentationTimeUs += sampletime;mediaMuxer.writeSampleData(writeVideoIndex, byteBuffer, audiobufferInfo);byteBuffer.clear();videoExtractor.advance();}//audiowhile (true) {int readSampleCount = audioExtractor.readSampleData(byteBuffer, 0);Log.d(TAG, "audio:readSampleCount:" + readSampleCount);if (readSampleCount < 0) {break;}videobufferInfo.size = readSampleCount;videobufferInfo.offset = 0;videobufferInfo.flags = audioExtractor.getSampleFlags();videobufferInfo.presentationTimeUs += sampletime;mediaMuxer.writeSampleData(writeAudioIndex, byteBuffer, videobufferInfo);byteBuffer.clear();audioExtractor.advance();}Log.d(TAG, "combineVideo finished!\n");mediaMuxer.stop();mediaMuxer.release();audioExtractor.release();videoExtractor.release();} catch (IOException e) {e.printStackTrace();}}
}

MediaMuxer的使用相关推荐

  1. Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图

    原址:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍是用MediaMuxer与MediaExtractor进入音视频 ...

  2. Android多媒体框架(5)—— MediaMuxer.jara源码分析

    MediaMuxer.jara源码分析 音视频通过Codec(编码器)编码之后,还需要经过MediaMuxer(混合器)"混合".混合器在framework的实现就是MediaMu ...

  3. Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)

    Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (码字不易,转载请声明出处:http://blog.csdn.net/andrexp ...

  4. ffmpeg开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)

    ffmpeg开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (原文链接:http://blog.csdn.net/andrexpert/article ...

  5. 【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据

    1 简介 本文以 mp4 文件为例,讲解去音频操作.mp4 是一种视频封装的容器,里面包含音频(audio)和视频(video)数据,对应的数据编码格式分别为 aac 和 h264.在去音频过程中,主 ...

  6. Android中MediaMuxer和MediaCodec用例 - audio+video

    在Android的多媒体类中,MediaMuxer和MediaCodec算是比较年轻的,它们是JB 4.1和JB 4.3才引入的.前者用于将音频和视频进行混合生成多媒体文件.缺点是目前只能支持一个au ...

  7. Android MediaMuxer合成视频文件

    相关笔记: Android MediaCodec简单总结_丞恤猿的博客-CSDN博客 Android使用MediaCodec进行视频编码 & 视频的一些基础概念介绍_丞恤猿的博客-CSDN博客 ...

  8. 使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件

    一个音视频文件是由音频和视频组成的,我们可以通过MediaExtractor.MediaMuxer把音频或视频给单独抽取出来,抽取出来的音频和视频能单独播放: 一.MediaExtractor API ...

  9. Android音视频API - MediaCodec/MediaMuxer/MediaStore/MediaController等

    AudioTrack播放音频PCM.[Android] 混音器AudioMixer. MediaPlayer/MediaRecorder, AudioTrack/AudioRecorder, Medi ...

最新文章

  1. MAPGIS中输入分数和上下标格式的字符串。
  2. js返回上一页并刷新代码整理
  3. wordpress 调整段落空两,段落间的距离
  4. 字节跳动测试开发4轮面试_字节跳动测试开发工程师一面总结
  5. Launch custom android application from android browser
  6. 静态库的冲突 duplicate symbol
  7. Linux工作笔记035---设置连接Linux Centos 超时连接时间_空闲的等待时间 -bash: TMOUT: readonly variable
  8. 算法:冒泡排序、一阶滤波
  9. 完美仿MSN右下角弹出广告代码并可自动消失,附带关闭按钮
  10. 统计假设检验之显著性检验(significance test)
  11. lidar_camera_calib代码解读-优化部分
  12. WPF 设置本地打印的纸张和方向
  13. php图片颤抖,PHP-使用jquery 怎么做出图片的震荡效果
  14. 数据库关系代数练习题
  15. 二维码扫码登录的原理
  16. 全球与中国PH和ORP通用分析仪市场深度研究分析报告
  17. VC单文档对话框添加托盘图标
  18. 精华文稿|用于无监督双目立体匹配学习的视差注意力机制
  19. PAT乙级 1069 微博转发抽奖 (20 分) C语言
  20. python小项目之淘宝秒杀

热门文章

  1. 【转】pkg-config与LD_LIBRARY_PATH
  2. QT Creator5.14软件的安装与使用(Win7与Ubuntu20.04)
  3. 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解
  4. UVA10494 If We Were a Child Again【大数除法】
  5. Vijos P1975 扫雷游戏【谜题】
  6. CCF NOI1041 志愿者选拔
  7. B00005 函数atoi()(去空格,带符号)
  8. HDU1282 回文数猜想【回文】
  9. windows 下 opencv 3.x 的安装及常见问题的解决
  10. matlab figure 调整大小、字体、线宽