MediaMuxer的使用
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的使用相关推荐
- Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图
原址:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍是用MediaMuxer与MediaExtractor进入音视频 ...
- Android多媒体框架(5)—— MediaMuxer.jara源码分析
MediaMuxer.jara源码分析 音视频通过Codec(编码器)编码之后,还需要经过MediaMuxer(混合器)"混合".混合器在framework的实现就是MediaMu ...
- Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)
Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (码字不易,转载请声明出处:http://blog.csdn.net/andrexp ...
- ffmpeg开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)
ffmpeg开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (原文链接:http://blog.csdn.net/andrexpert/article ...
- 【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据
1 简介 本文以 mp4 文件为例,讲解去音频操作.mp4 是一种视频封装的容器,里面包含音频(audio)和视频(video)数据,对应的数据编码格式分别为 aac 和 h264.在去音频过程中,主 ...
- Android中MediaMuxer和MediaCodec用例 - audio+video
在Android的多媒体类中,MediaMuxer和MediaCodec算是比较年轻的,它们是JB 4.1和JB 4.3才引入的.前者用于将音频和视频进行混合生成多媒体文件.缺点是目前只能支持一个au ...
- Android MediaMuxer合成视频文件
相关笔记: Android MediaCodec简单总结_丞恤猿的博客-CSDN博客 Android使用MediaCodec进行视频编码 & 视频的一些基础概念介绍_丞恤猿的博客-CSDN博客 ...
- 使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
一个音视频文件是由音频和视频组成的,我们可以通过MediaExtractor.MediaMuxer把音频或视频给单独抽取出来,抽取出来的音频和视频能单独播放: 一.MediaExtractor API ...
- Android音视频API - MediaCodec/MediaMuxer/MediaStore/MediaController等
AudioTrack播放音频PCM.[Android] 混音器AudioMixer. MediaPlayer/MediaRecorder, AudioTrack/AudioRecorder, Medi ...
最新文章
- MAPGIS中输入分数和上下标格式的字符串。
- js返回上一页并刷新代码整理
- wordpress 调整段落空两,段落间的距离
- 字节跳动测试开发4轮面试_字节跳动测试开发工程师一面总结
- Launch custom android application from android browser
- 静态库的冲突 duplicate symbol
- Linux工作笔记035---设置连接Linux Centos 超时连接时间_空闲的等待时间 -bash: TMOUT: readonly variable
- 算法:冒泡排序、一阶滤波
- 完美仿MSN右下角弹出广告代码并可自动消失,附带关闭按钮
- 统计假设检验之显著性检验(significance test)
- lidar_camera_calib代码解读-优化部分
- WPF 设置本地打印的纸张和方向
- php图片颤抖,PHP-使用jquery 怎么做出图片的震荡效果
- 数据库关系代数练习题
- 二维码扫码登录的原理
- 全球与中国PH和ORP通用分析仪市场深度研究分析报告
- VC单文档对话框添加托盘图标
- 精华文稿|用于无监督双目立体匹配学习的视差注意力机制
- PAT乙级 1069 微博转发抽奖 (20 分) C语言
- python小项目之淘宝秒杀
热门文章
- 【转】pkg-config与LD_LIBRARY_PATH
- QT Creator5.14软件的安装与使用(Win7与Ubuntu20.04)
- 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解
- UVA10494 If We Were a Child Again【大数除法】
- Vijos P1975 扫雷游戏【谜题】
- CCF NOI1041 志愿者选拔
- B00005 函数atoi()(去空格,带符号)
- HDU1282 回文数猜想【回文】
- windows 下 opencv 3.x 的安装及常见问题的解决
- matlab figure 调整大小、字体、线宽