剪映团队内部解密:视频裁剪应该怎么优化?
在剪映APP中,对多个视频文件进行截取和拼接是非常常见的操作。视频截取我们应该怎么做呢?

例如有100M的视频文件 总时长 10min,想截取前面5min中的视频, 直接以100M 的1/2进行切割 ,前面的1/2的文件既是 剪辑后的视频文件

纳尼?视频剪辑是这样做的?

视频剪辑中正确的姿势是什么样呢?

要实现这些功能,就需要对视频文件进行编解码操作,即先解码要处理的视频文件,还原出对应的原始帧然后再对原始帧重新编码最后就能得到剪辑后的视频文件
原理知道了 谁来做解码和编码呢?
MediaCodec可以帮我做音视频的解码与编码?
MediaCodeC是Android处理音视频API, Mediacodec类可用于访问DSP媒体编解码器

- Google并没有MediaCodec实现音视频解码器,相反,解码器都是后期手机厂商自己register进去的,MediaCodeC只提供抽象的接口,具体实现在各个手机上,
- 当然,Android源码里面引入了一套AAC编码器(因为AAC是开放标准的 ),而大家常用的MP3是有版权的,所以原生MediaCodec无法编码MP3,除非厂商提供MP3编码器)
MediaCodec 功能丰富却难学,面向过程的语法 很难理解每一句代码是在做什么事情
我们看下面一段解码的apiMediaCodec codec = MediaCodec.createByCodecName(name);
codec.configure(format, …);//配置 MediaCodeC
codec.start();//开始解码
ByteBuffer[] inputBuffers = codec.getInputBuffers();//获取输入的缓存区
ByteBuffer[] outputBuffers = codec.getOutputBuffers();//获取输出的缓冲区
for (;;) {
int inputBufferId = codec.dequeueInputBuffer(…);
if (inputBufferId >= 0) {
codec.queueInputBuffer(inputBufferId, …);
}
int outputBufferId = codec.dequeueOutputBuffer(…);
if (outputBufferId >= 0) {
codec.releaseOutputBuffer(outputBufferId, …);
} else if (outputBufferId == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
outputBuffers = codec.getOutputBuffers();
} else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
MediaFormat format = codec.getOutputFormat();
}
}是不是会被震撼住?

音视频为什么难学?
- 音视频知识庞杂,通俗易懂的资料非常少,自学困难重重;
- 网上博客、视频充斥着大量的错误信息,使得很多初学者掉到坑里就爬不出来了。
那么,我们该如何学习音视频呢?
为了帮助大家更快更好的学习音视频开发技术,我特别邀请了前华为、OPPO 、阿里资深架构师 David,为大家带来《剪映音视频剪辑实战》系列直播分享,在这里给大家准备了一场干货十足的音视频学习之旅,将带大家从H265编码原理入手,从0手写剪映音视频剪辑技术,一键制作大片。
大家手速要快,赶紧识别下方图中二维码加入学习!

报名学习后还将附赠一套系统的开发进阶资料,帮助大家在技术的道路上更进一步。


赶紧扫码报名领取资料,开启你的学习之旅!(扫码添加时记得备注:"音视频"快速通过)【如遇扫码频繁+VX:sjsgyb6】
评论
