Android 深入系统完全讲解(29)

news2024/11/16 12:56:09

MediaMuxer 封装器
MediaMuxer 最多仅支持一个视频 track 和一个音频 track,所以如果有多个音频 track 可以先
把它们混合成为一个音频 track 然后再使用 MediaMuxer 封装到 mp4 容器中。
MediaMuxer 支持输出格式为 MP4,webm 和 3gp. 默认我们就用 mp4. MUXER_OUTPUT_3GPP:对应 3gp 文件,
MUXER_OUTPUT_HEIF:定影 HEIF 文件,
MUXER_OUTPUT_MPEG_4:对应 mp4 文件,
MUXER_OUTPUT_WEBM:对应 webm 文件。
主要函数说明:
addTrack(MediaFormat format):利用 MediaFormat 添加音频或视频轨道。
release():释放 MediaMuxer 的资源。
setLocation(float latitude,float longitude):设置并存储地理位置信息到生成文件中。
setOrientationHint(int degrees):设置输出视频回放的方向提示。
start() :开始 muxer,等待数据的输入。
Stop():停止 muxer,调用这个函数后将生成合成的文件。
writeSampleData(int trackIndex, ByteBuffer byteBuf, MediaCodec.BufferInfo bufferInfo):往 muxer 中写入编码的数据。
参数说明:
trackIndex:sample(样本)的 track index,可以利用 MediaExtractor 获取。
byteBuf:写入的数据,不可为 null;
bufferInfo:当前 sample(样本)相关的 buffer 的信息,不可为 null。
MediaCodec.BufferInfo:
主要包括四个数据:
flags:输入 buffer 相关的 buffer flags。
offset:buffer 开始的偏移量,通常设为 0。
presentationTimeUs:buffer 的时间戳。
size:buffer 的数据大小。
我们看下例子:
MediaMuxer muxer = new MediaMuxer(“temp.mp4”, OutputFormat.MUXER_OUTPUT_MPEG_4);
// More often, the MediaFormat will be retrieved from MediaCodec.getOutputFormat()
// or MediaExtractor.getTrackFormat(). MediaFormat audioFormat = new MediaFormat(…);
MediaFormat videoFormat = new MediaFormat(…);
int audioTrackIndex = muxer.addTrack(audioFormat);
int videoTrackIndex = muxer.addTrack(videoFormat);
ByteBuffer inputBuffer = ByteBuffer.allocate(bufferSize);
boolean finished = false;
BufferInfo bufferInfo = new BufferInfo();
muxer.start();
while(!finished) {
// getInputBuffer() will fill the inputBuffer with one frame of encoded
// sample from either MediaCodec or MediaExtractor, set isAudioSample to
// true when the sample is audio data, set up all the fields of bufferInfo, // and return true if there are no more samples. finished = getInputBuffer(inputBuffer, isAudioSample, bufferInfo);
if (!finished) {
int currentTrackIndex = isAudioSample ? audioTrackIndex : videoTrackIndex;
muxer.writeSampleData(currentTrackIndex, inputBuffer, bufferInfo);
}};
muxer.stop();
muxer.release();
主要流程,创建混合 MediaMuxer
addTrack 加入从 MediaExtractor 解出来的轨道信息
调用开始,启动
MediaMuxer.writeSampleData() 写入数据,每次只有一个视频或者音频信息
完成了这块知识,下来我们进入核心领域,编码 MediaCodec。MediaCodec 介绍
MediaCodec 类可以用于使用一些基本的多媒体编解码器(音视频编解码组件),它是 Android
基本的多媒体支持基础架构的一部分通常和 MediaExtractor , MediaSync , MediaMuxer , MediaCrypto , MediaDrm , Image , Surface , and AudioTrack 一起使用。
一个编解码器可以处理输入的数据来产生输出的数据,编解码器使用一组输入和输出缓冲器
来异步处理数据。你可以创建一个空的输入缓冲区,填充数据后发送到编解码器进行处理。
编解码器使用输入的数据进行转换,然后输出到一个空的输出缓冲区。最后你获取到输出缓
冲区的数据,消耗掉里面的数据, 释放回编解码器。如果后续还有数据需要继续处理,编
解码器就会重复这些操作。输出流程如下:在这里插入图片描述
编解码器能处理的数据类型为:**压缩数据、原始音频数据和原始视频数据。**你可以通过
ByteBuffers 能够处理这三种数据,但是需要你提供一个 Surface,用于对原始的视频数据进
行展示,这样也能提高编解码的性能。
Surface 使用的是本地的视频缓冲区,这个缓冲区不映射或拷贝到 ByteBuffers。这样的机制
让编解码器的效率更高。通常在使用 Surface 的时候,无法访问原始的视频数据,但是你可
以使用 ImageReader 访问解码后的原始视频帧。在使用 ByteBuffer 的模式下,您可以使用
Image 类和 getInput/OutputImage(int)访问原始视频帧。编解码器的生命周期:
主要的生命周期为:Stopped、Executing、Released。
Stopped 的状态下也分为三种子状态:Uninitialized、Configured、Error。
Executing 的状态下也分为三种子状态:Flushed, Running、End-of-Stream。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产生聚类数据集sklearn.datasets.make_blobs()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 产生聚类数据集 sklearn.datasets.make_blobs() [太阳]选择题 以下python代码结果错误的一项是? import matplotlib.pyplot as plt from sklearn.datasets import make_blobs data,labelmak…

统计-参数估计-假设检验-总结二

统计-参数估计-假设检验-总结二参数估计—区间估计三大分布卡方分布(Gamma分布的特例)t分布F分布求估计区间假设检验参数检验拟合优度检验通往 统计-参数估计-假设检验-总结一参数估计—区间估计 以某一范围提供对参数θ\thetaθ的估计。寻找统计量θ1∗(x1,x2,...,xn)\theta…

20230120英语学习

How Animals May Have Conquered Snowball Earth “雪球地球”时期,动物是如何存活的? Planet Earth used to be something like a cross between a deep freeze and a car crusher.During vast stretches of the planet’s history, everything from p…

微信小程序开发尚学堂 介绍 项目结构 组件 喧嚷 事件 模板

一、微信小程序介绍1. 微信小程序介绍微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,它实现了应用”触手可及”的梦想,用户扫一扫或搜一下即可打开应用。说明:小程序是需要下载的,小程序的占用…

概论_第6章_统计量及其抽样分布_知识结构

先看知识结构图数量统计的特点是 背记的内容多, 与前面概率论 背记和计算的多 有很大区别。本文从统计量的概念讲起, 一. 统计量定义: 设 ...... 为取自某总体的样本, 若样本函数TT(, ... ) 中不含有任何未知参数, 则称T 为统计…

力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积、693. 交替位二进制数

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积…

企业实施RPA需考虑的20条建议

如何提高效率又能降低成本,是企业发展所面临的重要挑战。在降本增效的路上,RPA(机器人流程自动化)以其特点与优势脱颖而出,迅速得到企业青睐。尽管如此,部署RPA也并非一蹴而就。仓促实施可能会给企业带来更…

实时时钟实现

重要知识点 setInterval是一个实现定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式var sNownew Date(),Date 对象会自动把当前日期和时间保存为其初始值。 参数形式有以下5种: new Dat…

SpringBoot 接口幂等性实现的4种方案

目录 什么是幂等性 什么是接口幂等性 为什么需要实现幂等性 引入幂等性后对系统的影响 Restful API 接口的幂等性 如何实现幂等性 方案一:数据库唯一主键 方案二:数据库乐观锁 方案三:防重 Token 令牌 方案四、下游传递唯一序列号 实…

mysql连接查询

笛卡尔积现象: 注意: 效率更高的方法:

Pr 计时器动画

​哈喽,各位小伙伴!今天我们来学习一下如何制作数字滚动的计时器动画? 新建序列 新建一个1920*1080的序列,选择一张图片作为背景(背景图出自不良人第5季,距离第6季开播还有41天) 新建文字图层…

5.算法通关面试 --- 递归and分治and贪心

50. Pow(x, n) https://leetcode.cn/problems/powx-n/

【C语言从0到1之文件操作】(原理 画图 举例 不信教不会你 不要放收藏夹落灰 学起来好嘛)

🕺作者:迷茫的启明星 🎃专栏:《数据库》《C语言从0到1专栏》《数据结构》《C语言杂谈》🏇分享喜欢的一句话:心如花木,向阳而生前言在我们的学习中,文件操作是被我们忽略,…

ML 训练与测试数据不满足同分布 - 如何检测?如何解决?

😄 同分布问题是数据挖掘中的常见问题,也是ML中的一个重要假设。解决训练与测试数据不满足同分布问题,有助于提高模型的泛化性、稳定性! 文章目录一、定义:训练与测试数据不满足同分布定义:❓疑问&#xff…

仿牛客论坛项目

源代码:https://gitee.com/qiuyusy/community 1. Spring 在测试类中使用Spring环境 RunWith(SpringRunner.class) 让Spring先运行ContextConfiguration 导入配置文件implements ApplicationContextAware 后实现方法 获得 applicationContext RunWith(SpringRunner.class) S…

关于JVM

作者:~小明学编程 文章专栏:JavaEE 格言:热爱编程的,终将被编程所厚爱。 目录 内存区域的划分 程序计数器(线程私有) Java虚拟机栈 (线程私有) 本地方法栈 堆(线程共享) 方法…

Leetcode:77. 组合、216. 组合总和 III(C++)

目录​​​​​​​ 77. 组合: 问题描述: 实现代码与解析: 递归(回溯): 原理思路: 剪枝优化版: 原理思路: 216. 组合总和 III: 问题描述&#xff1a…

[C/C++]指针,指针数组,数组指针,函数指针

文章目录指针内存空间的访问方式指针变量的声明指针的赋值指针运算用指针处理数组元素指针数组用指针作为函数的参数指针型函数指向函数的指针指针 指针是C从C中继承过来的重要数据类型。通过指针技术可以描述各种复杂的数据结构,可以更加灵活的处理字符串&#xf…

Linux下dmi信息分析工具dmidecode原理

dmidecode命令主要是通过DMI获取主机的硬件信息,其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。它是通过SMBIOS(System Management BIOS)来获取信息的。SMBIOS是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。 什么是DM…

QA特辑 | 以万变钳制黑灰产之变的验证码产品设计逻辑的答案,都在这里

1月12 日下午,就验证码的攻防对抗问题,顶象反欺诈专家大卫从验证码的破解手段讲起,从防御角度深度剖析如何应对黑灰产的攻击以及验证码在产品能力设计层面应该考虑哪些问题。 直播也吸引了众多关注验证码的观众前来围观,针对验证…