Android音视频处理之MediaMuxer(MP4)

Android将编码的音视频数据合成mp4文件 合入mp4文件 说明: 1.使用MediaMuxer来合入编码后的音、视频流,生成mp4文件 2.不能生成.ts等格式,后续用ffmpeg来实现 具体如下: init { //设置文件路径 //设置格式:MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4 muxer = MediaMuxer(path, format) //添加r... 阅读详情


http://www.jianshu.com/p/aeadf260258a


在Android中,可以使用MediaMuxer来封装编码后的视频流和音频流到mp4容器中:

MediaMuxer facilitates muxing elementary streams. Currently supports mp4 or webm file as the output and at most one audio and/or one video elementary stream. MediaMuxer does not support muxing B-frames.

在官方文档的介绍中,MediaMuxer最多仅支持一个视频track和一个音频track,所以如果有多个音频track可以先把它们混合成为一个音频track然后再使用MediaMuxer封装到mp4容器中。

通常视频编码使用H.264(AVC)编码,音频编码使用AAC编码,在MediaFormat中我们可以看到各种编码格式:

public static final String MIMETYPE_VIDEO_AVC = "video/avc";
public static final String MIMETYPE_AUDIO_AAC = "audio/mp4a-latm";
public static final String MIMETYPE_TEXT_CEA_608 = "text/cea-608";

上面只各自摘取了视频、音频、字幕的一种编码格式,更多的编码格式可自行查看MediaFormat源码。

MediaMuxer的使用也比较简单,首先通过new MediaMuxer(String path, int format)指定视频文件输出路径和文件格式:

MediaMuxer mMediaMuxer = new MediaMuxer(mOutputVideoPath, 
                MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

创建MediaMuxer对象之后,一个比较重要的操作就是addTrack(MediaFormat format),添加媒体通道,该函数需要传入MediaFormat对象,通常从MediaExtractor或者MediaCodec中获取,如果希望自己创建的话可以直接new或者通过该类如下静态方法创建:

MediaFormat.createAudioFormat(...);
MediaFormat.createVideoFormat(...);
MediaFormat.createSubtitleFormat(...);

如果是自己创建MediaFormat要根据媒体类型配置好相应的keys,这在MediaFormat官方文档有详细说明。这里注意一定要设置csd参数,否则添加进MediaMuxer的MediaFormat会导致MediaMuxer调用stop()时抛出异常。

csd参数在官方文档中叫Codec-specific Data,详细介绍可以看MediaCodec官方文档 - Codec-specific Data部分。对于H.264来说,"csd-0"和"csd-1"分别对应sps和pps;对于AAC来说,"csd-0"对应ADTS。下面是自己创建视频MediaFormat的例子:

MediaFormat videoFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1280, 720);
byte[] header_sps = {0, 0, 0, 1, 103, 100, 0, 31, -84, -76, 2, -128, 45, -56};
byte[] header_pps = {0, 0, 0, 1, 104, -18, 60, 97, 15, -1, -16, -121, -1, -8, 67, -1, -4, 33, -1, -2, 16, -1, -1, 8, 127, -1, -64};
videoFormat.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps));
videoFormat.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps));
videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
videoFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080);
videoFormat.setInteger(MediaFormat.KEY_CAPTURE_RATE, 25);

把MediaFormat添加到MediaMuxer后记录返回的track index,添加完所有track后调用start方法:

videoTrackIndex = mMediaMuxer.addTrack(format);
audioTrackIndex = mMediaMuxer.addTrack(format);
mMediaMuxer.start();

然后就可以调用MediaMuxer.writeSampleData()向mp4文件中写入数据了。这里要注意每次只能添加一帧视频数据或者单个Sample的音频数据,并且BufferInfo对象的值一定要设置正确:

info.offset = 0;
info.size = sampleSize;
info.flags = MediaCodec.BUFFER_FLAG_SYNC_FRAME;
info.presentationTimeUs = mVideoExtractor.getSampleTime();
mMediaMuxer.writeSampleData(videoTrackIndex, buffer, info);
  • info.size 必须填入数据的大小
  • info.flags 需要给出是否为同步帧/关键帧
  • info.presentationTimeUs 必须给出正确的时间戳,注意单位是 us

结束写入后关闭以及释放资源:

mMediaMuxer.stop();
mMediaMuxer.release();




Android音视频处理—通过MediaMuexr合成MP4文件 参考文章:http://blog.51cto.com/ticktick/1710743 1.MP4基本概念 MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的b... 阅读详情

相关推荐

Android 音视频入门 (四)- 记录一次MediaCodec + MediaMuxer的使用

总体来说还是挺简陋的,比如没有根据具体的设备动态地去判断录制的尺寸、录制的色彩格式选择等等,相机相关的功能闪光灯、对焦也未加入。MediaCodec本身是编解码器,和FFmpeg不同,它会优先进行硬件解码,效率高,功耗低,但是缺点就是,兼容性、可扩展性相对于软件解码来说会更低。有一部分的播放软件,将硬解还是软解的选择权交给了用户,这样既可以兼顾到扩展性,又可以兼顾到功耗。

2501_90193635的博客 763

Android在NDK JNI中使用MediaMuxer合成mp4的流程

如果不写这个结束包的话,保存的视频也可以播放,但是log会报一个录入音视频流没有正确结束的错误:mpeg4writer: stop() called but track is not started or stopped。这里写入的数据是h264/h265数据包的。音频部分大概也是在视频轨道的基础上再加一个音频轨道,如果有大佬在此基础上增加,可以A一下我,多谢了。前言:找了很久,很少有NDK层使用合成mp4的例程,由于我们使用的是实时流合成mp4的文件,基本所有的视频流都是在C++操作的。

qq_27637465的博客 2864

Android Multimedia实战(四)MediaProjection实现截图,与MediaMuxer实现录屏为MP4,Gif格式

MediaProjection可以用来捕捉屏幕,具体来说可以截取当前屏幕和录制屏幕视频 (5.0以上)先总结下系统是如何实现组合键截屏的: 都应该知道Android源码中对按键的捕获位于文件PhoneWindowManager.java中 当满足按键条件时会用一个mHandler 开始post一个runnable,进入这个runnable中执行takeScreenshot()方法。使用AIDL

WangShuo的专栏 9031

Android MediaMuxer合成MP4,音视频同步

H264/AAC实时流 录制成MP4格式的本地视频 GITHUB: https://github.com/chezi008/mp4muxer 建议使用场景 一般视频流有如下两种途径获取: Android摄像头采集 服务端传输过来的视频流 如果数据由本机摄像头直接采集,建议使用MediaMuxer类去实现mp4的合成。如果是服务端传输过来的视频流可以使用mp4v2的方法实现mp4的合成。 一、M...

chezi008 3万+

Android MediaMuxer合成视频文件

#.简介 MediaMuxer在Android中可以将编码后的视频、音频数据封装后输出为多媒体文件,支持的文件输出格式包括MP4,webm和3gp。不过MediaMuxer中最多只能添加一条视轨和一条音轨。 一般音视频编码由MediaCodec负责,而MediaMuxer处理MediaCodec输出的编码数据,合成多媒体文件。 #主要API 1.public MediaMuxer(@NonNull String path, @Format int format)

u013914309的博客 1422

Mp4MuxerDemo-master

Android使用Jni mp4v2库将h264裸流合成mp4文件 建议使用场景 一般视频流有如下两种途径获取: 1. Android摄像头采集 2. 服务端传输过来的视频流 如果数据由本机摄像头直接采集,建议使用MediaMuxer类去实现mp4的合成。如果是服务端传输过来的视频流可以使用mp4v2的方法实现mp4的合成。我在项目里面也简单的利用MediaMuxer编写了一个Demo。可能写的不是很详细,功能也不是很完善。所以有什么问题还是多多希望指出,一起改进。

Android使用Mp4v2用h264流和aac流合成mp4

Android使用Jni mp4v2库将h264裸流合成mp4文件 建议使用场景 一般视频流有如下两种途径获取: Android摄像头采集 服务端传输过来的视频流 如果数据由本机摄像头直接采集,建议使用MediaMuxer类去实现mp4的合成。如果是服务端传输过来的视频流可以使用mp4v2的方法实现mp4的合成。我在项目里面也简单的利用MediaMuxer编写了一个Demo。可...

chezi008 3万+

静止无功补偿SVG的基本控制原理

上图是自励单变量控制框图,基本控制方式为,采集计算得到负载无功电流和SVG输出的无功电流的差值,经过PI调节作为功率角δ和固定的调制深度λ和调制波,经过PWM调制形成开关信号驱动SVG的功率电路。该控制方式使保持调制深度λ(即SVG电压的幅度)不变,通过调整δ来调整直流电压和无功,跟踪输出无功功率,直流电压就会大幅度随动,无功相应速度较慢。SVG通常有他励方式和自励方式,他励方式需要提供外部的直流电源,自励方式通过电网输出有功功率至SVG建立SVG的直流电压。δ为Us和Uc之间的相角差。

weixin_42668920的博客 1989

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

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

m0_60259116的博客 446

保姆级教程:手把手配置MAX9295/9296 GMSL2-CSI2链路,搞定4LAN/1LAN模式与常见调试

本文提供MAX9295/9296 GMSL2-CSI2链路的详细配置教程,涵盖4LAN和1LAN模式的硬件连接、寄存器配置及调试技巧。通过实战案例和代码示例,帮助开发者快速实现高带宽视频传输,解决常见问题如信号同步和功耗优化,适用于车载摄像头和机器人视觉系统开发。

weixin_42561143的博客 434

新代永久解锁西门子smart S7-200PLC 上传程序步骤

西门子 SMART S7-200 PLC 程序上传步骤 打开编程软件 或左下角依次打开 程序 所有程序 Siemens Automation Simatic STEP 7-MicroWIN SMART V2.4 STEP 7-MicroWIN SMART 技术交流 plcjiesuo1 2. 确认plc电源端以及输入电压; 3.用网线连接plc与电脑技术交流 plcjiesuo1 4.plc通电; 5.打开编程软件,双击通讯 6.按照...

m0_60773720的博客 2万+

Android多媒体-视频-录屏三种方式

createScreenCaptureIntent()这个方法会返回一个intent,你可以通过startActivityForResult方法来传递这个intent,为了能开始屏幕捕捉,activity会提示用户是否允许屏幕捕捉(为了防止开发者做一个木马,来捕获用户私人信息),你可以通过getMediaProjection来获取屏幕捕捉的结果。screenrecord是一个shell命令,支持Android4.4(API level 19)以上,录制的视频格式为mp4 ,存放到手机sd卡里,默认录。

weixin_47145826的博客 4036

深入解析BlueZ5与D-Bus:Linux蓝牙开发实战指南

本文深入解析BlueZ5与D-Bus在Linux蓝牙开发中的核心应用,提供从环境搭建到实战开发的完整指南。通过详细代码示例和调试技巧,帮助开发者掌握蓝牙协议栈与D-Bus接口的交互方法,实现高效蓝牙设备管理与GATT服务开发。

weixin_28292761的博客 450

Android 音视频开发(7): 音视频录制流程总结

在前面我们学习和使用了AudioRecord、AudioTrack、Camera、MediaExtractor、MediaMuxer API、MediaCodec。 学习和使用了上述的API之后,相信对Android系统的音视频处理有一定的经验和心得了。本文及后面的几篇文章做的事情就是将这些知识串联起来,做一些稍微复杂的事情。 一、流程分析 1.1 需求说明 我们需要做的事情就是:串联整个...

qq_28334473的博客 899

【Unity】Gif图片播放插件(支持UI及模型纹理渲染两种模式)

unity本身不支持GIF格式文件直接渲染, 因此一般的做法是通过加载图片,通过代码控制其循环播放、停止等,模拟动画效果,本文简单介绍一下某个现有开源工具,感谢开源作者。

灵境引路人 4036

基于YOLOv10的PCB电子元件智能识别系统设计与实现

数据预处理模块:负责对原始PCB图像进行标注、增强和格式转换模型训练模块:基于YOLOv10架构进行模型训练和优化推理检测模块:加载训练好的模型进行实时检测用户界面模块:提供友好的交互界面,方便用户操作和结果可视化YOLO(You Only Look Once)系列算法自2016年提出以来,经历了多次迭代更新。YOLOv1-v3:奠定了YOLO系列的基础架构YOLOv4-v7:引入大量优化技巧和网络结构改进YOLOv8-v9:进一步优化模型结构和训练策略YOLOv10。

YOLO 156

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

Android直播开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (码字不易,转载请声明出处:http://blog.youkuaiyun.com/andrexpert/article/details/72523408)   1.  AAC编码格式分析 (1)  AAC简介     高级音频编码(AdvancedAudio Coding,AAC)一种...

老蒋也疯狂 1万+

15、目标检测模型的评估指标与YOLO算法解析

本文详细解析了目标检测模型的评估指标,包括精确率、召回率、AP、mAP及IoU的定义与作用,并深入介绍了YOLO算法的核心原理与推理流程。从网格划分、锚框引入到边界框细化与后处理,全面阐述了YOLO如何实现快速准确的目标检测。同时总结了YOLO在智能安防、自动驾驶和工业检测等领域的应用,并展望了其未来在准确性提升、多类别支持和技术融合方面的发展趋势。

work3的博客 65

作为一个Android程序员,关于音视频开发,这些你确定这些你都懂了吗?

Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。资源持续更新中,欢迎大家一起学习和探讨。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

2401_84149496的博客 988

独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

独创改进🚀! | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

Coding... 2211

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android 从视频中提取音频及录音后合并到视频

1.前段时间想开发一个app,用来提取mp4中的音频然后进行裁剪 MediaExtractor extractor = new MediaExtractor();//新建提取器 extractor.setDataSource(…); int numTracks = extractor.getTrackCount(); for (int i = 0; i < numTracks; ++i) ...

qq_16710641的博客 1073

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

安卓音视频基础(七)

音视频录制流程总结 在前面我们学习和使用了AudioRecord、AudioTrack、Camera、MediaExtractor、MediaMuxer API、MediaCodec。 学习和使用了上述的API之后,相信对Android系统的音视频处理有一定的经验和心得了。本文及后面的几篇文章做的事情就是将这些知识串联起来,做一些稍微复杂的事情。 一、流程分析 1.1 需求说明 我们需要做的事情就是:串联整个音视频录制流程,完成音视频的采集、编码、封包成 mp4 输出。 1.2 实现方式 An.

zhuchengcheng1992的博客 182

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

作为一个Android程序员,精通音视频开发,寒冬再冷也冻不到你(1)

2. 在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件3. 在 Android 平台使用 Camera API 进行视频的采集,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调4. 学习 Android 平台的 MediaExtractor 和 MediaMuxer API,知道如何解析和封装 mp4 文件。

2401_84148942的博客 1371

Android 音视频开发序列7

Android 音视频开发序列7---音视频录制流程总结

ListQ的博客 110

在android中进行视频的分割

最近项目有个需求要对录制的视频进行分割,查了很多资料,看到ffmpeg可以对视频进行分割。上网找到别人基于android的开源ffmpeg,终于编译成功ffmpeg.so。但是要使用的话还要查ffmpeg的api,并且写jni的调用接口,非常麻烦。偶然情况下发现了开源软件mp4parser: http://code.google.com/p/mp4parser/ 一款非常棒的开源软件,可以对视频进

mengzhengjie的专栏 567

作为一个Android程序员,精通音视频开发,寒冬再冷也冻不到你

三、使用 AudioRecord 实现录音,并生成wav创建一个AudioRecord对象初始化一个buffer开始录音创建一个数据流,一边从AudioRecord中读取声音数据到初始化的buffer,一边将buffer中数据导入数据流。关闭数据流停止录音四、用 AudioTrack 播放PCM音频1.AudioTrack 基本使用MODE_STATIC模式MODE_STREAM模式2.AudioTrack 详解音频流的类型Buffer分配和Frame的概念AudioTrack构造过程3. AudioTra

2401_84009192的博客 851
上一篇: h264+aac=ts
下一篇: Android中如何提取和生成mp4文件(MediaMUxer)
STN_LCD
博客等级 码龄15年 384粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值