1、ffmpeg简介
2、ffmpeg常用功能
3、ffmpeg的GPU加速
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
ffmpeg -i video.avi
参数:
-i:表示输入的源视频
这个命令可以查看视频时长,比特率,音频编码方式,音频比特率,视频编码方式,视频比特率,帧率,视频分辨率等信息。
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;
ffmpeg -f concat -i filelist.txt -c copy output.avi
参数:
filelist.txt的内容为:
file '001.avi'
file '002.avi'
file '003.avi'
ffmpeg -i video.mp4 -vn audio.mp3
参数:
-vn:表示去掉视频
ffmpeg -i video.mp4 -an output.mp4
参数:
-an:表示去掉音频
ffmpeg -i video.mp4 image%d.jpg
# 上面的命令会生成image1.jpg,image2.jpg,image3.jpg, ... ,imageN.jpg
ffmpeg -r 30 -i image%d.jpg -b 200K output.mp4
参数:
-r:指定视频的帧率,注意-r要放在-i前面;
-b: 指定比特率;
图像有三种格式,分别是jpg,png和bmp,其中jpg压缩损失最大,图片最小,质量最差,bmp是没有任何压缩,图片最大,png介于两者之间。因此如果我们想要将分解的图像序列合成源视频的原样,最好采用bmp格式。
ffmpeg -i input.mp4 -i audio.mp3 -c copy output.mp4
ffmpeg -i input.avi -c:a copy -r 30 output.mp4
参数:
-r:指定帧率
-c:a: 音频编码方式不变
比特率也是一个决定音视频总体质量的参数,它决定每个时间单位处理的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 -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4
参数:
-vf:等价于-filter:v,即对视频进行过滤,这里提高视频为原来的两倍;
-af:等价于-filter:a,即对音频进行过滤,这里提高音频为原来的两倍;
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