在剪映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的API非常的丰富,可以用它来做视频剪辑,音视频合成 ,视频倒放,剪影App中所有的功能 都是由MediaCodec实现的,所以它功能非常强大
MediaCodec 功能丰富却难学,面向过程的语法 很难理解每一句代码是在做什么事情
我们看下面一段解码的api
MediaCodec 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();
}
}
是不是会被震撼住?
音视频为什么难学?
音视频知识庞杂,通俗易懂的资料非常少,自学困难重重;
网上博客、视频充斥着大量的错误信息,使得很多初学者掉到坑里就爬不出来了。
来举个例子,按照传统的音视频学习方法:首先接触大量的音视频开源库,如MediaCodec,FFmpeg 往往这些API就已经把脑袋弄大了。停留在使用API,不能让你适应不断变化的需求。如果最开始的方向错了,不管你如何努力,都学不好音视频。
那么,我们该如何学习音视频呢?
为了帮助大家更快更好的学习音视频开发技术,我特别邀请了前华为、OPPO 、阿里资深架构师 David,为大家带来《剪映音视频剪辑实战》系列直播分享,在这里给大家准备了一场干货十足的音视频学习之旅,将带大家从H265编码原理入手,从0手写剪映音视频剪辑技术,一键制作大片。
原价298元的《剪映音视频剪辑实战》,现在限时优惠只需要0.1元即可加入学习(限量100个名额)
大家手速要快,赶紧识别下方图中二维码加入学习!
报名学习后还将附赠一套系统的开发进阶资料,帮助大家在技术的道路上更进一步。
▲该PDF整理于网络,作者灰色飘零,整编BlackZhangJX▲
赶紧扫码报名领取资料,开启你的学习之旅!
(扫码添加时记得备注:"音视频"快速通过)
【如遇扫码频繁+VX:sjsgyb6】