FFmpeg的使用

一、FFmpeg的理论基础

1、FFmpeg的定义

FFmpeg(Fast Forward Moving Picture Experts Group,快转动态图像专家组)既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频的调用接口。

FFMpeg 提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等,还提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。

2、FFmpeg的主要工作流程

FFmpeg 的主要工作流程相对比较简单,具体如下:

1)读取输入源

2)进行音视频的解封装(Demuxing)

3)解码每一帧音视频数据(Decoding)

4)编码每一帧音视频数据(Encoding)

5)进行音视频的重新封装(Muxing)

6)输出到目标

3、FFmpeg的相关概念

容器(container):视频文件本身其实是一个容器,里面包括了视频和音频,也可能有字幕等其他内容。一般来说,视频文件的后缀名反映了它的容器格式,常见的容器格式有avi、mp4等。

媒体流(Stream):表示在时间轴上的一段连续的数据,比如一段声音数据、一段视频数据或者一段字母数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。

数据帧/数据包(Frame/Packet):通常一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储与容器之中。

编码器(encoders):编码器是实现某种编码格式的库文件。只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码。FFmpeg 内置的视频编码器包括libx264(最流行的开源 H.264 编码器)、NVENC(基于 NVIDIA GPU 的 H.264 编码器)、libx265(开源的 HEVC 编码器)、libvpx(谷歌的 VP8 和 VP9 编码器)、libaom(AV1 编码器),内置的音频编码器包括libfdk-aac、aac。

编码(压缩)格式:视频和音频都需要经过编码,才能保存成文件。不同的编码格式有不同的压缩率,会导致文件大小和清晰度的差异。常用的有版权的视频编码格式有H.262、H.264、H.265,无版权的有VP8、VP9、AV1,常用的音频编码格式有MP3、AAC。

4、FFmpeg的主要结构体

  • AVFormatContext:统领全局的基本结构体,主要用于处理封装格式(flv, mpegts, mp4等)。
  • AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等)。
  • AVStream,AVCodecParameters:音视频流对应的结构体,用于音视频编解码。
  • AVFrame:存储解码后的数据(RGB/YUV/PCM采样数据)
  • AVPacket:存储解封装后、解码前的数据(H264/HEVC/AAC等码流数据)

二、FFmepg的相关命令

1、FFmepg的bin文件夹下包括三个exe文件:

ffmpeg.exe: 媒体视频和音频处理的命令行工具

ffprobe.exe:媒体参数分析命令行工具

ffplay.exe:媒体播放命令行工具

2、查看ffmpeg的帮助说明命令ffmpeg -h

常用的快捷键

按键"Q"或"Esc":退出媒体播放
键盘方向键:媒体播放的前进后退
点击鼠标右键:拖动到该播放位置
按键"F":全屏
按键"P"或空格键:暂停
按键"W":切换显示模式

3、在音视频文件上右键“在此处打开命令行”,相关命令如下:

播放视频/音频:ffplay vidio.mp4/music.mp3  

清空命令行:cls

查看文件参数信息:ffprobe vidio.mp4

  4、转换格式(文件格式,封装格式),文件名可以是中英文,但不能有空格。-i是input,用于指定输入的文件

ffmpeg -i video.mp4 video_avi.avi

 5、改变编码(编码,音频转码)

  • -c:指定编码器
  • -c copy:直接复制,不经过重新编码(这样比较快)
  • -c:v:指定视频编码器
  • -c:a:指定音频编码器
  • -i:指定输入文件
  • -an:去除音频流
  • -vn: 去除视频流
  • -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
  • -y:不经过确认,输出时直接覆盖同名文件。

(1)查看编解码器

ffmpeg -codecs

(2)网站常用编码

MP4封装:H264视频编码+ACC音频编码
WebM封装:VP8视频编码+Vorbis音频编码
OGG封装:Theora视频编码+Vorbis音频编码

(3)无损编码格式.flac转换编码(先指名属性,然后是新的属性)

ffmpeg -i music_flac.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 music_mp3.mp3

说明:

  • acodec:audio Coder Decoder 音频编码解码器
  • libmp3lame:mp3解码器
  • ar:audio rate:音频采样率
  • 44100:设置音频的采样率44100。若不输入,默认用原音频的采样率
  • ab:audio bit rate 音频比特率
  • 320k:设置音频的比特率。若不输入,默认128K
  • ac:aduio channels 音频声道
  • 2:声道数。若不输入,默认采用源音频的声道数

查看结果属性

ffprobe music_flac_mp3.mp3

6、改变编码(视频压缩)

(1)视频转码

ffmpeg -i input.mp4 -c:v(指定视频编码器) libx264(H.264编码的编码器) output.mp4

ffmpeg -i video.mp4 -s 1920x1080 -pix_fmt yuv420p -vcodec libx264 -preset medium -profile:v high -level:v 4.1 -crf 23 -acodec aac -ar 44100 -ac 2 -b:a 128k video_avi.avi

说明:

  • -s 1920x1080:缩放视频新尺寸(size)
  • -pix_fmt yuv420p:pixel format,用来设置视频颜色空间。参数查询:ffmpeg -pix_fmts
  • -vcodec libx264:video Coder Decoder,视频编码解码器
  • -preset medium: 编码器预设。参数:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo
  • -profile:v high :编码器配置,与压缩比有关。实时通讯-baseline,流媒体-main,超清视频-high
  • -level:v 4.1 :对编码器设置的具体规范和限制,权衡压缩比和画质。
  • -crf 23 :设置码率控制模式。constant rate factor-恒定速率因子模式。范围0~51,默认23。数值越小,画质越高。一般在8~28做出选择。
  • -r 30 :设置视频帧率
  • -acodec aac :audio Coder Decoder-音频编码解码器
  • -b:a 128k :音频比特率.大多数网站限制音频比特率128k,129k

7、改变编码(码率控制模式)

码率是编码的比特率,一般用来将视频文件的体积变小

$ ffmpeg -i input.mp4 -minrate(指定最小码率) 964K -maxrate(指定最大码率) 3856K -bufsize(指定缓冲区大小)2000K output.mp4

ffmpeg支持的码率控制模式:-qp -crf -b

(1)恒定量化器模式: -qp:constant quantizer

无损压缩的例子(快速编码)

ffmpeg -i input -vcodec libx264 -preset ultrafast -qp 0 output.mkv

无损压缩的例子(高压缩比)

ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 output.mkv

(2)恒定速率因子模式(一般用这个):-crf :constant rate factor

(3)固定目标码率模式(不建议使用):-b:bitrate

8、合并、提取音视频

(1)单独提取视频(不含音频流)

ffmpeg -i video.mp4 -c:v/vcodec copy(保持原编码不变) -an(去除音频) video_nomusic.mp4

(2)单独提取音频(不含视频流)

ffmpeg -i video.mp4 -vn(去除视频) -c:a/acodec copy video_novideo.m4a

具备多个音频流的,如

Stream #0:2[0x81]:Audio:ac3,48000Hz,5.1,s16,384kb/s
Stream #0:3[0x82]:Audio:ac3,48000Hz,5.1,s16,384kb/s
Stream #0:4[0x80]:Audio:ac3,48000Hz,5.1,s16,448kb/s

针对性的单一的提取,例如提取第2条,用指令: -map 0:3

(3)合并音视频

ffmpeg -i video_novideo.m4a -i video_silent.mp4 -c copy video_merge.mp4

9、截取、连接音视频

(1)截取

ffmpeg -i music.mp3 -ss(起始时间) 00:00:30 -to(结束时间) 00:02:00 -acodec copy music_cutout.mp3

截取60秒

ffmpeg -i music.mp3 -ss 00:00:30 -t(截取时长) 60 -acodec copy music_cutout60s.mp3

-sseof : 从媒体末尾开始截取

ffmpeg -i in.mp4 -ss 00:01:00 -to 00:01:10 -c copy out.mp4
ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -c copy out.mp4
ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -c copy -copyts out.mp4

把-ss放到-i之前,启用了关键帧技术,加速操作,但截取的时间段不一定准确。可用最后一条指令,保留时间戳,保证时间准确。

(2)连接音视频

ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy merge.mp4

不同格式的音视频可以连接在一起,但不推荐不同格式连接在一起,建议使用Avidemux软件连接。

10、截图、水印、动图

(1)截图

截取第7秒第1帧的画面

ffmpeg -i video.mp4 -ss 7 -vframes 1 video_image.jpg

(2)水印

ffmpeg -i video.mp4 -i qt.png -filter_complex(添加滤镜,水印) "overlay=20:80(离左边和顶部20个像素)" video_watermark.mp4

(3)截取动图

ffmpeg -i video.mp4 -ss 7.5 -to 8.5 -s(缩放大小) 640x320 -r(降低帧率) 15 video_gif.gif

11、录屏、直播

(1)录屏

windows: ffmpeg -f gdigrab(捕获视频) -i desktop rec.mp4
ubuntu: sudo ffmpeg -f fbdev -framerate 10 -i /dev/fb0 rec.mp4

gdigrab :ffmpeg中的一个组件,只捕获视频,若要录屏、录音、获取摄像头、麦克风、换组件,用OBS Studio软件

(2)直播

ffmpeg -re(按视频帧率推流) i rec.mp4 按照网站要求编码 -f flv "你的rtmp地址/你的直播码"

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值