文章目录
前言
在数字媒体处理领域,ffmpeg是一款非常强大的工具,它可以用来进行媒体流的重新编码、设置码率、设置帧速率等操作。ffmpeg的功能强大且复杂,但是一旦掌握了其基本的使用方法,就能够灵活地处理各种媒体文件,满足各种需求。
ffmpeg的描述
ffmpeg是一款通用的媒体转换工具,它可以读取各种类型的输入(包括实时抓取/录制设备),进行过滤,并将它们转换成各种输出格式。
ffmpeg可以从任意数量的输入"文件"中读取数据,这些文件可以是常规文件、管道、网络流、抓取设备等,这些都是通过-i
选项指定的。ffmpeg可以写入任意数量的输出"文件",这些文件是通过一个普通的输出url指定的。命令行上找到的任何不能被解释为选项的内容都被视为输出url。
每个输入或输出url原则上可以包含任意数量和类型(视频/音频/字幕/附件/数据)的流。流的数量和/或类型可能受到容器格式的限制。选择哪些流从哪些输入进入哪个输出要么自动完成,要么通过-map
选项完成。
在选项中引用输入文件时,你必须使用它们的索引(从0开始)。例如,第一个输入文件是0,第二个是1,等等。同样,文件内的流也是通过它们的索引引用的。例如,2:3
指的是第三个输入文件中的第四个流。
作为一般规则,选项应用于下一个指定的文件。因此,顺序很重要,你可以在命令行上多次使用同一个选项。每次出现的选项都会应用于下一个输入或输出文件。此规则的例外是全局选项(例如,详细程度级别),这些选项应该首先被指定。
不要混合输入和输出文件 - 首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并在文件之间重置。
重新编码媒体流
重新编码媒体流的命令
我们可以使用ffmpeg把任意他支持的媒体流变成另一个他支持的媒体流,就像这样:
bash
ffmpeg -i input.mp4 output.avi
bash
D:\Codes\ffmpeg_Command>ffmpeg -i test.mp4 out1.avi
ffmpeg支持的媒体流
FFmpeg支持的文件后缀非常多,包括但不限于以下几种:
- 视频格式 :
.mp4
、.avi
、.flv
、.mov
、.mkv
、.wmv
、.3gp
等。 - 音频格式 :
.mp3
、.wav
、.aac
、.flac
、.ogg
、.m4a
等。 - 封装格式 :
.ts
、.m3u8
(用于HLS流)等。 - 图像格式 :
.jpg
、.png
、.bmp
、.gif
等。
你可以通过ffmpeg -formats
命令来获取FFmpeg所支持的所有文件类型
bash
D:\Codes\ffmpeg_Command>ffmpeg -formats
ffmpeg version 7.0.1-essentials_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 13.2.0 (Rev5, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
libavutil 59. 8.100 / 59. 8.100
libavcodec 61. 3.100 / 61. 3.100
libavformat 61. 1.100 / 61. 1.100
libavdevice 61. 1.100 / 61. 1.100
libavfilter 10. 1.100 / 10. 1.100
libswscale 8. 1.100 / 8. 1.100
libswresample 5. 1.100 / 5. 1.100
libpostproc 58. 1.100 / 58. 1.100
Formats:
D.. = Demuxing supported
.E. = Muxing supported
..d = Is a device
---
D 3dostr 3DO STR
E 3g2 3GP2 (3GPP2 file format)
E 3gp 3GP (3GPP file format)
D 4xm 4X Technologies
E a64 a64 - video for Commodore 64
D aa Audible AA format files
D aac raw ADTS AAC (Advanced Audio Coding)
D aax CRI AAX
DE ac3 raw AC-3
DE ac4 raw AC-4
D ace tri-Ace Audio Container
D acm Interplay ACM
D act ACT Voice file format
D adf Artworx Data Format
D adp ADP
D ads Sony PS2 ADS
E adts ADTS AAC (Advanced Audio Coding)
DE adx CRI ADX
DE aea MD STUDIO audio
D afc AFC
DE aiff Audio IFF
D aix CRI AIX
DE alaw PCM A-law
D alias_pix Alias/Wavefront PIX image
DE alp LEGO Racers ALP
DE amr 3GPP AMR
D amrnb raw AMR-NB
D amrwb raw AMR-WB
E amv AMV
D anm Deluxe Paint Animation
D apac raw APAC
D apc CRYO APC
D ape Monkey's Audio
//后面还有很多,这里不写出来了
设置视频码率
视频码率是什么
视频码率是指视频数据的传输速率,也就是每秒钟传输的数据量。它通常以比特每秒(bps)或千比特每秒(kbps)为单位来表示。
举个例子,如果一个视频的码率是500 kbps,那么这意味着每秒钟这个视频会传输500千比特的数据。
视频码率对视频质量有很大的影响。一般来说,码率越高,视频质量越好,因为每秒钟传输的数据量更大,能够展示更多的细节。但是,高码率的视频也会占用更多的存储空间和带宽。
所以,选择合适的视频码率是一个平衡的过程,需要在视频质量和存储空间/带宽之间做出权衡。
设置视频的码率
bash
ffmpeg -i test2.mp4 -b:v 2048k -bufsize 2048k out2.mp4
这个命令是使用FFmpeg将一个输入的视频文件input.avi
转换为输出的视频文件output.mp4
,并在转换过程中设置视频流的码率和缓冲区大小。
具体来说,这个命令的各个部分的含义如下:
-
ffmpeg
:这是调用FFmpeg程序的命令。 -
-i input.avi
:-i
选项后面跟的是输入文件的名称,这里是input.avi
。 -
-b:v 2048k
:这是设置视频流的码率为2048kbps(千比特每秒)。-b:v
是指定视频码率的选项,2048k
是码率的值。码率越大,视频质量越好,但文件大小也会越大。 -
-bufsize 2048k
:这是设置码率控制缓冲区的大小,这里是2048kbps。缓冲区大小可以影响视频的质量和文件大小。 -
output.mp4
:这是输出文件的名称,这里是output.mp4
。
设置文件帧数率
帧数率是什么
帧率,也被称为帧频,是用来衡量视频播放流畅度的一个参数。它表示的是每秒钟能够显示的图片的数量,单位通常是FPS(Frames Per Second,每秒帧数)。
举个例子,如果一个视频的帧率是30 FPS,那就意味着每秒钟这个视频会播放30张图片。这些图片以足够快的速度连续播放,使人眼看起来就像是连续的动画。
一般来说,帧率越高,视频看起来就越流畅。例如,大多数电影的帧率是24 FPS,而电视节目可能会使用30 FPS或60 FPS。然而,更高的帧率也意味着需要更多的存储空间和更高的播放要求。
总的来说,帧率是决定视频播放质量的重要因素之一。
ffmpeg设置帧数率
使用-r
选项强制设置帧数率:
bash
ffmpeg -i test2.mp4 -r 144 out3.mp4
过程:
bash
frame= 46 fps=0.0 q=33.0 size= 0KiB time=00:00:00.30 bitrate= 1.3kbits/s dup=73 drop=0 speed=0.5frame= 135 fps=130 q=33.0 size= 256KiB time=00:00:00.92 bitrate=2271.0kbits/s dup=125 drop=0 speed=0.frame= 231 fps=149 q=33.0 size= 512KiB time=00:00:01.59 bitrate=2637.7kbits/s dup=181 drop=0 speed=1.frame= 318 fps=154 q=33.0 size= 768KiB time=00:00:02.19 bitrate=2867.2kbits/s dup=231 drop=0 speed=1.frame= 410 fps=159 q=33.0 size= 1280KiB time=00:00:02.83 bitrate=3701.0kbits/s dup=286 drop=0 speed= 1frame= 509 fps=164 q=33.0 size= 1536KiB time=00:00:03.52 bitrate=3574.0kbits/s dup=343 drop=0 speed=1.frame= 608 fps=168 q=33.0 size= 1792KiB time=00:00:04.20 bitrate=3488.4kbits/s dup=400 drop=0 speed=1.frame= 697 fps=169 q=33.0 size= 2048KiB time=00:00:04.82 bitrate=3476.2kbits/s dup=452 drop=0 speed=1.frame= 797 fps=172 q=33.0 size= 2560KiB time=00:00:05.51 bitrate=3803.5kbits/s dup=511 drop=0 speed=1.frame= 889 fps=172 q=33.0 size= 2816KiB time=00:00:06.15 bitrate=3745.1kbits/s dup=564 drop=0 speed=1.
//省略
[out#0/mp4 @ 0000023746653900] video:14502KiB audio:477KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.512872%
frame= 4330 fps=165 q=-1.0 Lsize= 15056KiB time=00:00:30.00 bitrate=4111.3kbits/s dup=2526 drop=0 speed=1.14x
[libx264 @ 000002374665af80] frame I:67 Avg QP:18.77 size: 18885
[libx264 @ 000002374665af80] frame P:1160 Avg QP:23.94 size: 8734
[libx264 @ 000002374665af80] frame B:3103 Avg QP:22.95 size: 1113
[libx264 @ 000002374665af80] consecutive B-frames: 1.9% 4.4% 9.8% 83.9%
[libx264 @ 000002374665af80] mb I I16..4: 14.1% 80.9% 5.0%
[libx264 @ 000002374665af80] mb P I16..4: 4.0% 13.5% 1.1% P16..4: 10.2% 2.8% 0.7% 0.0% 0.0% skip:67.7%
[libx264 @ 000002374665af80] mb B I16..4: 0.1% 0.2% 0.0% B16..8: 9.5% 0.4% 0.0% direct: 0.1% skip:89.6% L0:46.4% L1:53.0% BI: 0.6%
[libx264 @ 000002374665af80] 8x8 transform intra:73.9% inter:73.4%
[libx264 @ 000002374665af80] coded y,uvDC,uvAC intra: 12.4% 19.1% 3.2% inter: 0.7% 0.7% 0.0%
[libx264 @ 000002374665af80] i16 v,h,dc,p: 49% 31% 11% 9%
[libx264 @ 000002374665af80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 48% 15% 30% 1% 1% 1% 1% 1% 1%
[libx264 @ 000002374665af80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 39% 15% 20% 4% 5% 6% 4% 5% 2%
[libx264 @ 000002374665af80] i8c dc,h,v,p: 69% 13% 15% 2%
[libx264 @ 000002374665af80] Weighted P-Frames: Y:0.6% UV:0.2%
[libx264 @ 000002374665af80] ref P L0: 68.4% 6.5% 17.6% 7.4% 0.1%
[libx264 @ 000002374665af80] ref B L0: 84.6% 12.3% 3.0%
[libx264 @ 000002374665af80] ref B L1: 97.7% 2.3%
[libx264 @ 000002374665af80] kb/s:3950.77
[aac @ 0000023746669ac0] Qavg: 910.307
总结
通过本文的学习,我们了解了如何使用ffmpeg进行媒体流的重新编码、设置码率和设置帧速率等操作。虽然ffmpeg的命令行参数众多,但是只要掌握了一些基本的命令和概念,就能够灵活地处理各种媒体文件。希望本文能够帮助你入门ffmpeg,为你的媒体处理工作提供帮助。在实际使用中,你可能还需要根据自己的需求去查阅更多的ffmpeg命令和参数,不断提高自己的技能。祝你学习愉快!