FFmpeg是非常强大的音视频处理工具,我们可以使用它来处理视频合成、剪辑、加特效等等操作。
关于音视频是什么,可以看一下这篇文章:
NDK模块开发:关于音视频,你需要了解的东西是什么
FFmpeg的官方文档命令真的是太多太多,而且都是英文,感觉精通完这些命令,都够学一门新语言了!
SO 为了让一些小伙伴们快速的用上FFmpeg,我整理了一些FFmpeg的常用的知识和大部分日常用到的命令供大家查阅!
NDK模块开发:音视频处理工具FFmpeg的基本字符命令
还不收藏吗?废话不多说上干货!
本专栏专注分享Android进阶内容、面试精选分享,后续会持续更新,喜欢的话麻烦点击关注一下
Android开发zhuanlan.zhihu.com[图片上传中…(image-7354ea-1572786737901-0)]
常用命令
视频格式转换
ffmpeg -i out.mp4 -y out.avi
视频转Gif
ffmpeg -i out.mp4 -y out.gif
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 -y out.gif
视频转多张图片
ffmpeg -i input_test.mp4 -vf fps=1 out%03d.png
ffmpeg -i input_test.mp4 -vf fps=1/60 out%03d.png
截取视频中的某段视频
ffmpeg -ss 2 -i test.mp4 -t 10 -y -f out_test.mp4
截取从2s开始10秒的视频
视频分片(把视频切为一段一段)
ffmpeg -i test.mp4 -c copy -map 0 -f segment -segment_time 10 video/part-%d.mp4
截取视频中某个时间段的单张图片或多张图片
ffmpeg -ss 2 -i test.mp4 -r 1 -t 2 -y -f image2 image-%3.jpeg
单张图片或多张图片转视频
ffmpeg -loop 1 -i img%3d.png -t 10-y output.mp4
Gif转视频
ffmpeg -i input.gif -y output.mp4
多个视频合并
ffmpeg -i “concat:input1.mp4|input2.mp4|input3.mp4” -c copy output.mp4
修改视频分辨率
ffmpeg -i input_test.mp4 -s 320*240 out_test.mp4
给视频添加音频
ffmpeg -i input.mp4 -i input1.mp3 -y output.mp4
提取视频中的音频
ffmpeg -i test.mp4 -vn -a:c copy out.mp3
视频静音
ffmpeg -i input.mp4 -vn -vcodec copy output.mp4
音频合并
ffmpeg -i “concat:test1.mp3|test2.mp3” -acodec copy output.mp3
音频混音
ffmpeg -i input_01.wav -i input_02.wav -filter_complex amix=inputs=2:duration=shortest:dropout_transition=3 output.wav
以两个音频文件时长较短的音频文件时长作为最终输出的时长
添加文字水印
ffmpeg -y -i test.mp4 -vf "drawtext=fontfile=CourierNew.ttf:text='hello world':x=100:y=50:fontsize=24" out.mp4
Android端添加文字水印
由于Android端字体库的原因,我可以通过把文字转成图片,再加到视频上的方式来添加,以下是文字转图片的源码:
/**
* 文本转成Bitmap
* @param text 文本内容
* @param context 上下文
* @return 图片的bitmap
*/
private static Bitmap textToBitmap(String text , Context context) {
float scale = context.getResources().getDisplayMetrics().scaledDensity;
TextView tv = new TextView(context);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(layoutParams);
tv.setText(text);
tv.setTextSize(scale * TEXT_SIZE);
tv.setGravity(Gravity.CENTER_HORIZONTAL);
tv.setDrawingCacheEnabled(true);
tv.setTextColor(TEXT_COLOR);
tv.setBackgroundColor(Color.WHITE);
tv.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
tv.buildDrawingCache();
Bitmap bitmap = tv.getDrawingCache();
int rate = bitmap.getHeight() / 20;
return Bitmap.createScaledBitmap(bitmap, bitmap.getWidth()/rate, 20, false);
}
/**
* 文字生成图片
* @param filePath filePath
* @param text text
* @param context context
* @return 生成图片是否成功
*/
public static boolean textToPicture(String filePath, String text , Context context){
Bitmap bitmap = textToBitmap(text , context);
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
return false;
}finally {
try {
if(outputStream != null){
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
添加图片水印
添加单个图片水印
ffmpeg -i input.mp4 -i water.png -filter_complex "[0:v][1:v]overlay=main_w-overlay_w-10:10" -y output.mp4
添加多个图片水印
ffmpeg -i input.mp4 -i photo1.png -i photo2.png -filter_complex "[0:v]fade=in:st=0:d=2,curves=vintage[img];[1:v]scale=300:-1[img1];[img][img1]overlay=10:10[out1];[out1][2:v]overlay=main_w:main_h" -y output.mp4
添加了两张图片图片,第一张设置为宽度300,高度-1为根据原图片比例缩放,在视频左上角,第二张图片在视频右下角,fade是淡入淡出效果器,视频效果为从0s开始淡入,淡入2s,视频为复古效果curves=vintage
跑马灯效果
ffmpeg -i video2.mp4 -i logo.png -filter_complex "[1:v]scale=50*50[logo];[0:v]scale=200*200[bg];[bg][logo]overlay=x='if(gte(t,0),-overlay_w+(mod(n,main_w+overlay_w))+5,NAN)':y=0" -y output.mp4
含义: 时间t大于0,那么就开始从子内容的宽度的x-overlay_w位置开始,然后每一帧n计数,帧数n除以(背景main_w+子内容背景overlay_w)求除数+1设置为x坐标,即可循环 overlay=30:10 main_w和main_h为底层视频的宽和高,overlay_w和overlay_h为叠加视频的宽和高
视频去水印
ffmpeg -i test.flv -vf delogo=x=20:y=20:w=70:h=80 output.flv
x,y :指定水印的位置,即图片左上角的坐标 w,h:给出水印的宽高
添加动画
ffmpeg -y -i test.mp4 -t 10 -loop 1 -framerate 6 -i test_%3d.png -filter_comple 'overlay=10:main_h-overlay_h-10' out.mp4
将多张图片(test_001.png, ani002.png…)组成动画, 然后将这个动画叠加在视频的左下角。-t 10 -loop 1会循环播放动画,持续10s
淡入淡出效果器
ffmepg -i input.wav -filter_complex afade=t=in:ss=0:d-4 output.wav
(淡入)把 input 文件的前5s 做一个淡入效果,输出到 output.wav 中
ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
(淡出)将input.wav文件从200s开始,做5s的淡出效果,并放到output.wav文件中
视频提亮效果器
ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=brightness=0.25 -f mp4 output.mp4
提亮参数是brightness,取值范围是从-1.0到1.0,默认值是0
为视频增加对比度效果
ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 output.mp4
对比度参数是contrast,取值范围是从-2.0到2.0,默认值是1.0
截取视频区域
ffmpeg -i input.mp4 -an -vf "crop=480:480:120:0" -vcodec libx264 -b:v 800k output.mp4
旋转视频
ffmpeg -i input.mp4 -vf "transpose=1" -b:v 600k output.mp4
改变视频音量
ffmpeg -i input.mp4 -af 'volume=0.5' output.mp4
压缩视频
视频压缩主要是改变视频的码率和分辨率去压缩,但是需要控制好缩小的码率和分辨率,以保证视频的质量符合你的需求
ffmpeg -i input.mp4 -b:v 600k -y output.mp4
END
今天就简单介绍一下音视频,如果你需要深入NDK学习的话,可以看相关资料或者关注我的专栏点这里获取相关资料。