ffmpeg视频处理教程

1、ffmpeg简介

2、ffmpeg常用功能

3、ffmpeg的GPU加速


1、ffmpeg简介

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

  • 视频采集功能:ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
  • 视频格式转换功能:ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成视频网站所采用的flv格式。转码时可选命令非常多,编码器、视频时长、帧率、分辨率、像素格式、采样格式、码率、裁剪选项、声道数等等都可以自由选择:
  • 视频截图功能:对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。
  • 给视频加水印功能:使用ffmpeg 视频添加水印(logo)。

2、ffmpeg常用功能

(1)查看视频信息:

ffmpeg -i video.avi
参数:
  -i:表示输入的源视频

    这个命令可以查看视频时长,比特率,音频编码方式,音频比特率,视频编码方式,视频比特率,帧率,视频分辨率等信息。

(2)从视频中剪切出片段:

ffmpeg -i output.mp4 -ss 00:00:00 -c copy -to 00:00:10 output_10.mp4
参数:
  -ss:指定裁剪的开始时间;
  -to:指定裁剪的结束时间;
  -c:指定音频和视频的编码方式,这里为copy,表示目标视频和源视频相同,-c可以细分为图像-c:v和音频-c:a;

(3)视频片段合并 :

ffmpeg -f concat -i filelist.txt -c copy output.avi
参数:
  filelist.txt的内容为:
     file '001.avi'
     file '002.avi'
     file '003.avi' 

(4)从视频中提取音频:

ffmpeg -i video.mp4 -vn audio.mp3
参数:
  -vn:表示去掉视频

(5)从视频中提取无声视频:

ffmpeg -i video.mp4 -an output.mp4
参数:
  -an:表示去掉音频

(6)从视频中提取图像序列:

ffmpeg -i video.mp4 image%d.jpg
 # 上面的命令会生成image1.jpg,image2.jpg,image3.jpg, ... ,imageN.jpg

(7)图像序列和音频合并成视频:

ffmpeg -r 30 -i image%d.jpg -b 200K output.mp4
参数:
  -r:指定视频的帧率,注意-r要放在-i前面;
  -b: 指定比特率;

    图像有三种格式,分别是jpg,png和bmp,其中jpg压缩损失最大,图片最小,质量最差,bmp是没有任何压缩,图片最大,png介于两者之间。因此如果我们想要将分解的图像序列合成源视频的原样,最好采用bmp格式。

  • 如果想合成MP4视频,图像格式只能为jpg,其它两种格式不能用;
  • png和bmp格式的图片可以合成avi格式的视频,但是不能合成MP4格式的;

(8)视频和音频合成视频:

ffmpeg -i input.mp4 -i audio.mp3 -c copy output.mp4

(9)调整视频帧率:

ffmpeg -i input.avi -c:a copy -r 30 output.mp4
参数:
  -r:指定帧率
  -c:a: 音频编码方式不变

(10)调整视频比特率:

      比特率也是一个决定音视频总体质量的参数,它决定每个时间单位处理的bit数。比特率决定处理1s的编码流需要多少bits。 

  •  压缩前的每秒数据量(这里可以算出一个字节大小) = 帧率 × 分辨率;
  •  压缩比 = 压缩前的每秒数据量 / 码率; 
  •  文件大小 = 比特率 × 视频时长;

    比特率不是越大越好,也不是越小越好。比特率和分辨率有很大关系,一般情况下,分辨率越大,也要求比特率很大,分辨率很小,只需要很小的比特率就可以了。

ffmpeg -i file.avi -b 1.5M file.mp4
参数:
  -b:指定比特率,这里-b可以细分为音频比特率-b:a和视频比特率-b:v,-b则表示整体比特率;

(11)调整视频分辨率:

ffmpeg -i input.mp4 -vf scale=-1:360 -c:a copy output.mp4
参数:
  -vf:对视频进行过滤,-1表示原视频调整后不会变形
  • 窄屏的分辨率和比特率配置如下:

       ffmpeg视频处理教程_第1张图片

  • 宽屏的分辨率和比特率配置如下

       ffmpeg视频处理教程_第2张图片

(12)加快视频和音频的播放速度:

ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4
参数:
  -vf:等价于-filter:v,即对视频进行过滤,这里提高视频为原来的两倍;
  -af:等价于-filter:a,即对音频进行过滤,这里提高音频为原来的两倍;

3、ffmpeg的GPU加速

    ffmpeg可以使用GPU进行加速,只需要在编译时配置好驱动进行编译即可,具体教程参考这里。安装好GPU版本的ffmpeg之后,我们首先需要查询ffmpeg支持的硬件加速器:

ffmpeg -hwaccels

输出:
    Hardware acceleration methods:
    cuda
    cuvid

      接着我们需要查看硬件加速器支持的编码器和解码器有哪些:

ffmpeg -codecs | grep cuvid

输出:
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp 
                 --extra-cflags=-I/usr/local/cuda-10.0/include --extra-ldflags=-L/usr/local/cuda-10.0/lib64
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_cuvid) 
                            (encoders: h264_nvenc h264_v4l2m2m nvenc nvenc_h264 )
 DEV.L. hevc                 H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) 
                            (encoders: nvenc_hevc hevc_nvenc )
 DEVIL. mjpeg                Motion JPEG (decoders: mjpeg mjpeg_cuvid )
 DEV.L. mpeg1video           MPEG-1 video (decoders: mpeg1video mpeg1_v4l2m2m mpeg1_cuvid )
 DEV.L. mpeg2video           MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_v4l2m2m mpeg2_cuvid )
 DEV.L. mpeg4                MPEG-4 part 2 (decoders: mpeg4 mpeg4_v4l2m2m mpeg4_cuvid ) (encoders: mpeg4 mpeg4_v4l2m2m )
 D.V.L. vc1                  SMPTE VC-1 (decoders: vc1 vc1_v4l2m2m vc1_cuvid )
 DEV.L. vp8                  On2 VP8 (decoders: vp8 vp8_v4l2m2m vp8_cuvid ) (encoders: vp8_v4l2m2m )
 D.V.L. vp9                  Google VP9 (decoders: vp9 vp9_v4l2m2m vp9_cuvid )

      所有带有"cuvid""nvenc"的,都是CUDA提供的GPU编解码器可以看到,我们现在可以进行 h264 / hevc / mjpeg / mpeg1 / mpeg2 / mpeg4 / vc1 / vp8 / vp9格式的GPU解码,以及h264 / hevc格式的GPU编码。接着我们就可以用-hwaccel参数指定硬件加速器,指定视频解码器和视频编码器进行GPU加速。比如:

  •   对视频进行压缩,调整比特率,分辨率不变:
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i test.mp4 -c:v h264_nvenc -b 2.5M test_gpu.mp4
参数:
  -hwaccel cuvid:指定使用cuvid硬件加速;
  -c:v h264_cuvid:使用h264_cuvid进行视频解码;
  -c:v h264_nvenc:使用h264_nvenc进行视频编码;
  -b 2.5M : 指定视频输出的比特率为2.5M;
  • 调整视频的分辨率,此时比特率也要随着调整:
ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -i test.mp4 -b 0.96M -vf scale_npp=-1:320 -c:v h264_nvenc test_gpu.mp4

参数:
  -hwaccel cuvid:指定使用cuvid硬件加速;
  -c:v h264_cuvid:使用h264_cuvid进行视频解码;
  -c:v h264_nvenc:使用h264_nvenc进行视频编码;
  -b 0.96M : 指定视频输出的比特率为0.96M;
  -vf scale_npp=-1:320:进行硬解码,即GPU解码,使用硬件加速时使用该参数,而-vf scale表示使用软解码,即CPU解码,
                        不使用硬件加速时使用该参数。-1表示原视频调整后不会变形;

 参考:https://developer.nvidia.com/ffmpeg

          https://blog.csdn.net/WuLex/article/details/101513018

          https://blog.csdn.net/daxiangqqcom/article/details/84030141

你可能感兴趣的:(Linux)