android平台短视频技术之 视频编辑的经验分享.
java
提示一: 各位看官,这里分享的是视频编辑,即剪切/拼接/分离/合并/涂鸦/标记/叠加/滤镜等对视频的编辑操做.不是流媒体网络播放等功能,请注意.linux
提示二: 这些文字90%的为普及知识,10%为宣传咱们的SDK,由于分享别人,有利自已,才是良性循环,才可让咱们持续分享,毕竟只分享,不有益很难持续下去.要养家糊口啊^_^.android
提示三:咱们是android视频编辑的专业团队,如下分享的文字,彻底实际经验总结,每个知识点您均可以在咱们的SDK或开源的工程中验证.
咱们的SDK:https://github.com/LanSoSdk/LanSoEditor_common(收费的,但写了30个详细注释,适合初学者学习,能够用来练手)
开源的工程:https://github.com/WritingMinds/ffmpeg-android(免费的,须要本身编译,需懂linux和ndk)
这两个工程您均可以测试,学习后, 而后再决定采用何种方式对您的项目最有利。
正文: git
1, 作 android 上的视频编辑,必定要从编辑ffmpeg开始吗? github
彻底不是。需求是最重要的,android从4.1开始提供了MediaCodec类,你要作视频提取图片,用mediacodec或mediaextractor就能够;你作视频裁剪,用MediaCodec也能够;你要作视频缩放,用MediaCodec+ Opengl是最好的选择;彻底不必定用ffmepg来作。编程
2,那么为何不少用ffmpeg来完成?
由于ffmpeg封装了不少的格式,使用起来比较灵活,简单,兼容性好,他的命令行能够帮你节省大量的时间,好比视频裁剪 ffmpeg -ss 10 -t 20 -i INPUT -acodec copy -vcodec copy OUTPUT;这样就完成了,再也不须要您本身去编写大量的代码。
3,ffmpeg能够帮我完成大部分的视频编辑功能吗?
没有优化的ffmpeg在功能能够,但性能不行。因为手机CPU的性能的限制,有些命令处理起来比较慢,好比overlay命令,colorchannelmixer命令 eq命令,libx264编码功能,这样你功能上虽然实现了,但处理一个10秒的视频,要花费2分钟,这样的功能,估计很难在APP里使用。咱们的SDK针对这样的状况,作了硬解码器和硬编码器,彻底加速ffmpeg的执行,这个也是咱们SDK的核心所在。
4,ffmpeg我怎么开始作呢?
若是您是初学者,建议不要一上来就编译ffmpeg,由于网上github上编译好的工程太多了,你的目的是学习使用到你项目中。再说了,若是你要用ffmpeg实现一些复杂的运算,即便你花费一周时间编译好了,结果发现功能能够知足,但处理起来太慢了,根本没法使用,事倍功半,也是没意义的。建议用上面推荐的两个连接,先学习了再说,即便收费的版本,但ffmpeg的命令代码是公开的,运行是不变的,只是有时间和其余限制而已,学习ffmepg是没有阻碍的。建议先学习起来再说,毕竟熟悉了,才能够灵活的使用。
5,ffmpeg哪些功能执行较快,而且免费工程里也能够实现?
像普通的音视频剪切,分离,合成,拼接,封装,格式转换这些是能够的。由于没有用到视频数据解码和编码操做,执行起来很快;好比秒拍中音乐那个功能,他用到的命令有: 音频裁剪,把视频中的音频分离,而后把新的音频在和视频合并;用到音量调节,也能够用ffmpeg的amixer来实现;再好比秒拍中的视频截取,其实就是用ffmpeg的截取命令来实现的;再好比你直接把MediaCodec编码好的H264裸码流保存成文件,你想封装成mp4格式,让别的播放器也能够播放,则用ffmpeg的封装命令就能够实现,不须要本身去封装。若是您的项目中只用到这些,则免费版本就能够知足,彻底不须要收费的SDK。
6,普通的ffmpeg哪些功能较慢,不适合使用?
在一些须要用到操做视频画面像素的场合,好比用overlay作叠加,colorchannelmixer或eq作滤镜,用scale缩放,用到视频解码-->处理-->再编码的场合。
这些功能的大概工做流程是:
第一步解码,若是采用硬件解码,则会快不少,若是用软解码,即便通过NEON批处理优化,处理速度仍是不够理想;
第二步处理,假如您用到的是colorchannelmixer这个命令,他的工做原理是事先把255个像素值根据您的设置所有放到一个表里,在处理一个像素时,利用查表法来获得处理后的值,虽然快一些,但和用opengl比较起来仍是很慢,毕竟这个是一个像素一个像素的去作,而opengl则采用矢量并行处理,速度上彻底不能比;
第三步:视频编码,ffmpeg自己不带H264视频编码器,须要使用外部的,好比libx264,libopenh264这些,但也是软编码。
你的视频每帧都须要通过这三步来作,解码,处理,再编码。这样下来,假如20秒的视频,每秒25帧,则是500帧,若是不用硬件加速来作,速度上估计很难完成。
咱们的SDK针对这样的状况,作了硬解码和硬编码,加速ffmpeg的执行,让它跑快一些,这个也是咱们SDK的核心所在。
7,有没有好的办法,又想实现功能,又想用免费版本的?
有。 用MediaCodec+ OpenGL的形式来作,把ffmpeg一些处理慢的操做,通通用MediaCodec+OpenGL来实现,好比滤镜,好比叠加,好比缩放等,咱们高级版本中的大部分操做也是用opengl来作的,咱们作了大量的工做,让你像操做一个ArrayList类同样,增长一个媒体,删除一个媒体,简单易用。
8,若是咱们本身作,须要懂得哪些知识:
首先你要从战略上轻视它^_^,毕竟又不是让你去搞科研,去搞高精尖,去得到诺贝尔奖。这是一项技术,一项已经很成熟的技术,相似学习android的UI,学习java的编程同样的一项技术,须要的是在这方面知识的积累和花时间去作的事情。若是你是初学者,那须要花很长的时间去学习,去摸索的事情,而后精通的过程。
再者你就要从战术上重视它^_^, 涉及到的知识点有:
8.1 linux基本操做,在这里强烈不推荐在windows下用cygwin来搞,第一很难行通,第二事倍功半。
8.2 ndk和jni,gcc的知识,由于你要作的最终要封装成java的一个类和方法,让作UI的工程师调用,并须要懂得一些java的编程,这样你调试起来会快一些。
8.3 视频的知识。这个必不可少,也不用多说,毕竟作的是视频编辑,像视频格式,音频,pcm,h264的基本知识,视频码率,分辨率,帧率,ffmpeg的经常使用命令等等。
8.4 懂得视频知识后,强烈推荐彻底精通MediaCodec和视频播放原理,由于这个能够帮你节省大量的时间去实现一个功能。
总结:不要一上来就编译,学以至用才重要,用免费的版本消耗的是人力成本和时间成本,用咱们的SDK能够加速您项目的开发,再说咱们的SDK的费用远远小于您人力成本和时间成本的费用^_^。windows