NDK模块开发:音视频处理工具FFmpeg的常用命令与高级命令整理集

前言

FFmpeg是非常强大的音视频处理工具,我们可以使用它来处理视频合成、剪辑、加特效等等操作。

关于音视频是什么,可以看一下这篇文章:

NDK模块开发:关于音视频,你需要了解的东西是什么

FFmpeg的官方文档命令真的是太多太多,而且都是英文,感觉精通完这些命令,都够学一门新语言了!

SO 为了让一些小伙伴们快速的用上FFmpeg,我整理了一些FFmpeg的常用的知识和大部分日常用到的命令供大家查阅!

NDK模块开发:音视频处理工具FFmpeg的基本字符命令

还不收藏吗?废话不多说上干货!

NDK模块开发:音视频处理工具FFmpeg的常用命令与高级命令整理集_第1张图片

本专栏专注分享Android进阶内容、面试精选分享,后续会持续更新,喜欢的话麻烦点击关注一下

Android开发​zhuanlan.zhihu.com[图片上传中…(image-7354ea-1572786737901-0)]

常用命令

视频格式转换

ffmpeg -i out.mp4 -y out.avi

视频转Gif

  • 视频转Gif

ffmpeg -i out.mp4 -y out.gif

  • 从0开始截10s转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

以两个音频文件时长较短的音频文件时长作为最终输出的时长

  • inputs: The number of inputs. If unspecified, it defaults to 2.//输入的数量,如果没有指明,默认为2.
  • duration: 决定了流的结束
  • longest: 最长输入的持续时间
  • shortest:最短输入的持续时间
  • first: 第一个输入的持续时间
  • dropout_transition: 输入流结束时(音频)容量重整化的转换时间(以秒为单位)。 默认值为2秒。

添加文字水印

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学习的话,可以看相关资料或者关注我的专栏点这里获取相关资料。

你可能感兴趣的:(Android进阶学习,Android,Android优化)