ffmpeg

简介

FFmpeg 的主要组成部分:

  1. libavcodec:一个包含了所有FFmpeg音视频编解码器的库。
  2. libavformat:一个包含了所有的普通音视格式的解析器和产生器的库。

三个实例程序(这三个实例基本可以作为API使用手册):

  • ffmpeg:命令行的视频格式转换程序。
  • ffplay:视频播放程序。(需要SDL支持)
  • ffserver:多媒体服务器

了解了它的大体组织结构,就明确了ffmpeg是视频格式压缩转换的第一选择!

一些地址

安装

windows 安装

windows 安装包下载地址

下载之后,解压安装包会得到如下目录:

1
2
3
bin
doc
LICENSE.txt

进入bin目录并获取路径

添加到环境变量

在此电脑界面下右击选择属性 > 高级系统设置 > 环境变量

在用户环境变量双击path,选择新建(注意不要更改其他环境变量),将刚才的bin路径粘贴进去

记得点下方的确定,再关闭当前窗口再点确定以保存

到这里,ffmpeg的配置就差不多了,调用命令行(windows+R输入cmd)输入“ffmpeg –version”,如果出现如下说明配置成功

1
2
3
4
5
6
7
8
9
10
11
ffmpeg version n4.4.1-50-ga4e1dd6940-20220324 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 11.2.0 (crosstool-NG 1.24.0.533_681aaef)
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --disable-frei0r --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librist --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --disable-vulkan --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20220324
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100

Linux 安装

1、下载解压

1
2
wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz
tar -xvf ffmpeg-3.1.tar.gz

2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录

1
2
3
cd ffmpeg-3.1
./configure --prefix=/usr/local/ffmpeg
make && make install

3、配置变量

1
2
3
4
5
6
7
vi /etc/profile
# 在最后PATH添加环境变量:
export PATH=$PATH:/usr/local/ffmpeg/bin

# 保存退出,查看是否生效
# 设置生效
source /ect/profile

4、查看版本

1
ffmpeg -version    查看版本

注意:

若安装过程中出现以下错误:

yasm/nasm not found or too old. Use –disable-yasm for a crippled build. If you think configure made a mistake, make sure you are using the latest version from Git. If the latest version fails, report the problem to the ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net. Include the log file “config.log” produced by configure as this will help solve the problem.

需要安装 yasm

1
2
3
4
5
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make && make install

常用命令

0.命令格式

基本使用方式:ffmpeg [[options][`-i’ input_file]] {[options] output_file}

通用选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-L license
-h 帮助
-fromats 显示可用的格式,编解码的,协议的。。。
-f 设定输出格式:
-f fmt 强迫采用格式fmt

-i filename 输入流
-y 覆盖输出文件(即如果test.***文件已经存在的话,不经提示就覆盖掉了)
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 任务开始的时间 [-]hh:mm:ss[.xxx]的格式也支持。
使用-ss参数的作用,可以从指定时间点开始转换任务,-ss后的时间单位为秒

-title string 设置标题(比如PSP中显示影片的标题)
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了
ffmpeg -i myfile.avi -target vcd vcd.mpg

-hq 激活高质量设置
-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持。

视频选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-b bitrate 设置比特率,视频流量(码率),缺省200kb/s
-vb bitrate set bitrate (in bits/s)
-vframes number 设置要编码多少帧
-r fps 设置帧频,帧速率, 缺省25
-s size 设定画面的宽与高,帧大小 格式为W*H 缺省160X128.也可以直接使用简写,也认:Sqcif qcif cif 4cif 等
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop size 设置顶部切除带大小 像素单位
-cropbottom size -cropleft size -cropright size
-padtop size 设置顶部补齐的大小 像素单位
-padbottom size -padleft size -padright size -padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
-vn 不做视频记录,不处理视频
-bt tolerance 设置视频码率容忍度kbit/s (固定误差)
-maxrate bitrate设置最大视频码率容忍度 (可变误差)
-minrate bitreate 设置最小视频码率容忍度(可变误差)
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用codec编解码方式,如-vcodec xvid 使用xvid压缩 如果用copy表示原始编解码数据必须被拷贝。
-sameq 使用同样视频质量作为源(VBR)
-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file 选择两遍的纪录文件名为file

高级视频选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
-g gop_size 设置图像组大小 这里设置GOP大小,也表示两个I帧之间的间隔
-intra 仅适用帧内编码
-qscale q 使用固定的视频量化标度(VBR) 以<q>质量为基础的VBR,取值0.01-255,约小质量越好,即qscale 4和-qscale 64的质量比6高 。此参数使用次数较多,实际使用时发现,qscale是种固定量化因子,设置qscale之后,前面设置的-b好像就无效了,而是自动调整了比特率。
-qmin q 最小视频量化标度(VBR) 设定最小质量,与-qmax(设定最大质量)共用
-qmax q 最大视频量化标度(VBR) 使用了该参数,就可以不使用qscale参数
-qdiff q 量化标度间最大偏差 (VBR)
-qblur blur 视频量化标度柔化(VBR)
-qcomp compression 视频量化标度压缩(VBR)
-rc_init_cplx complexity 一遍编码的初始复杂度
-b_qfactor factor 在p和b帧间的qp因子
-i_qfactor factor 在p和i帧间的qp因子
-b_qoffset offset 在p和b帧间的qp偏差
-i_qoffset offset 在p和i帧间的qp偏差
-rc_eq equation 设置码率控制方程 默认tex^qComp
-rc_override override 特定间隔下的速率控制重载
-me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 设置dct的算法 可用:
0 FF_DCT_AUTO 缺省的DCT
1 FF_DCT_FASTINT
2 FF_DCT_INT
3 FF_DCT_MMX
4 FF_DCT_MLIB
5 FF_DCT_ALTIVEC

-idct_algo algo 设置idct算法。可用的有:
0 FF_IDCT_AUTO 缺省的IDCT
1 FF_IDCT_INT
2 FF_IDCT_SIMPLE
3 FF_IDCT_SIMPLEMMX
4 FF_IDCT_LIBMPEG2MMX
5 FF_IDCT_PS2
6 FF_IDCT_MLIB
7 FF_IDCT_ARM
8 FF_IDCT_ALTIVEC
9 FF_IDCT_SH4
10 FF_IDCT_SIMPLEARM

-er n 设置错误残留为n
1 FF_ER_CAREFULL 缺省
2 FF_ER_COMPLIANT
3 FF_ER_AGGRESSIVE
4 FF_ER_VERY_AGGRESSIVE

-ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames个B 帧,支持mpeg1,mpeg2,mpeg4(即如果-bf 2的话,在两个非b帧中间隔的b帧数目为2,即IBBPBBPBBP结构)
-mbd mode 宏块决策
0 FF_MB_DECISION_SIMPLE 使用mb_cmp
1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD

-4mv 使用4个运动矢量 仅用于mpeg4
-part 使用数据划分 仅用于mpeg4
-bug param 绕过没有被自动监测到编码器的问题
-strict strictness 跟标准的严格性
-aic 使能高级帧内编码 h263+
-umv 使能无限运动矢量 h263+
-deinterlace 不采用交织方法
-interlace 强迫交织法编码 仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
-psnr 计算压缩帧的psnr
-vstats 输出视频编码统计到vstats_hhmmss.log
-vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开
-bitexact 使用标准比特率
-max_qdiff 视频中所有桢(包括i/b/P)的最大Q值差距
-b_qfactor 表示i/p与B的Q值比例因子,值越大B桢劣化越严重
-b_qoffset 表示1/p与B的Q值比例的偏移量,值越大B桢劣化越严重.如果大于0,那么下一个B的Q=前一个P的Q乘以b_quant_factor再加上offset,如果小于0,则B的Q=负的normal_Q乘以factor加上offset.
-i_qfactor p和i的Q值比例因子,越接近1则P越优化.
-i_qoffset p和i的Q的偏移量

音频选项

1
2
3
4
5
6
7
8
9
-ab bitrate 设置音频码率
-ar freq 设置音频采样率
-ac channels 设置通道 缺省为1,即单通道
-an 不使能音频纪录,不处理音频
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-acodec codec 使用codec编解码
-acodec AAC 使用AAC音频编码
-acodec copy 使用源格式编解码
`

1. 视频格式转换

(其实格式转换说法不太准确,但大家都这么叫,准确的说,应该是视频容器转换)

比如一个avi文件,想转为mp4,或者一个mp4想转为ts。

1
2
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts

2 保存 m3u8 类型文件

某天我在知乎上看到一段视频,想转给微信好友看,怎么操作呢。

参考如何全自动下载知乎上的视频到本地(注意不要滥用)

先打开要观看的视频页面,再F12清空,然后开始播放视频,不用理会那堆TS文件,我们只需找出来类似这种 https://vdn.vzuu.com/Act-ss-m3u8...... 链接即可,m3u8是里面的关键文件,关于m3u8大家可以自网上行搜索.

这是一种将零散的视频资源组织起来的视频格式,也就是说那几十一百个TS文件都被这一个m3u8文件管理起来了,我们只需要找到其中的m3u8,FFmpeg就可以帮我们自动下载好全部的ts文件并按顺序合并成一个视频!对整个过程都是全自动,命令行界面输入

1
ffmpeg - i "href="https://vdn.vzuu.com/Act-ss-m3u8/(此处省略后面)" test.mp4

一杯茶的时间,最终的视频就会生成在你打开命令行所在的文件夹下

3. 提取音频

比如我有一个“晓松奇谈”,可是我不想看到他的脸,我只想听声音, 地铁上可以听,咋办?

1
2
3
4
5
6
ffmpeg -i 晓松奇谈.mp4 -acodec copy -vn output.aac
# - vn 不处理视频
# -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
# -acodec codec 使用codec编解码
# -acodec AAC 使用AAC音频编码
# -acodec copy 使用源格式编解码

上面的命令,默认mp4的audio codec是aac,如果不是会出错,咱可以暴力一点,不管什么音频,都转为最常见的aac。

1
ffmpeg -i 晓松奇谈.mp4 -acodec aac -vn output.aac

4. 提取视频

有些IT员工,特别是做嵌入式的,比如机顶盒,想debug一下,没有音频的情况下,播放一个视频几天几夜会不会crash,这时候你需要一个纯视频文件,可以这么干。

1
2
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
# -an 不处理音频

5. 视频剪切

经常要测试视频,但是只需要测几秒钟,可是视频却有几个G,咋办?切啊!

下面的命令,就可以从时间为00:00:15开始,截取5秒钟的视频。

1
2
3
4
5
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
# -vcodec 视频编码
# -acodec 音频编码
# -ss 表示开始切割的时间
# -t 表示要切多少。

摘自使用 MediaSource 搭建流式播放器

注意一个问题,ffmpeg 在切割视频的时候无法做到时间绝对准确,因为视频编码中关键帧(I帧)和跟随它的B帧、P帧是无法分割开的,否则就需要进行重新帧内编码,会让视频体积增大。所以,如果切割的位置刚好在两个关键帧中间,那么 ffmpeg 会向前/向后切割,所以最后切割出的 chunk 长度总是会大于等于应有的长度。

6. 码率控制

码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。

那么,什么是码率?很简单: bitrate = file size / duration

比如一个文件20.8M,时长1分钟,那么,码率就是:

biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps

一般音频的码率只有固定几种,比如是128Kbps, 那么,video的就是

video biterate = 2831Kbps -128Kbps = 2703Kbps。

说完背景了。好了,来说ffmpeg如何控制码率。 ffmpg控制码率有3种选择,-minrate -b:v -maxrate

  • -b:v主要是控制平均码率。 比如一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率。 ffmpeg -i input.mp4 -b:v 2000k output.mp4上面把码率从原码率转成2Mbps码率,这样其实也间接让文件变小了。目测接近一半。

  • 不过,ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize
    -bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好) ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4

  • -minrate -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。
    ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4

7. 视频编码格式转换

比如一个视频的编码是MPEG4,想用H264编码,咋办?

ffmpeg -i input.mp4 -vcodec h264 output.mp4

相反也一样

ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

当然了,如果ffmpeg当时编译时,添加了外部的x265或者X264,那也可以用外部的编码器来编码。(不知道什么是X265,可以Google一下,简单的说,就是她不包含在ffmpeg的源码里,是独立的一个开源代码,用于编码HEVC,ffmpeg编码时可以调用它。当然了,ffmpeg自己也有编码器)

ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4

8. 只提取视频ES数据

这个可能做开发的人会用到,顺便提一下吧。

ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264

9. 过滤器的使用

这个我在另一篇博客提到了,具体参考ffmpeg filter过滤器 基础实例及全面解析

9.1 将输入的1920x1080缩小到960x540输出:

ffmpeg -i input.mp4 -vf scale=960:540 output.mp4

//ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。

比如,我有这么一个图片

想要贴到一个视频上,那可以用如下命令:

./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4

结果如下所示:

10. 抓取视频的一些帧,存为jpeg图片

比如,一个视频,我想提取一些帧,存为图片,咋办?

1
2
3
4
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

# -r 表示每一秒几帧
# -q:v表示存储jpeg的图像质量,一般2是高质量。

如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。60张?什么?这么多?不要不要。。。。。不要咋办?? 可以设置开始的时间,和你想要截取的时间呀。

1
2
3
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
# -ss 表示开始时间
# -t表示共要多少时间。

如此,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。

11.输出YUV420原始数据

对于做底层编解码的人来说,有时候常要提取视频的YUV原始数据。 怎么做?很简单: ffmpeg -i input.mp4 output.yuv怎么样,是不是太简单啦?!!!哈哈(如果你想问yuv的数据,如何播放,我不会告诉你,RawPlayer挺好用的!!)

那如果我只想要抽取某一帧YUV呢? 简单,你先用上面的方法,先抽出jpeg图片,然后把jpeg转为YUV。 比如: 你先抽取10帧图片。 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

结果:

1
2
3
4
5
6
7
8
9
10
-rw-rw-r-- 1 chenxf chenxf    296254  720 16:08 pic-001.jpeg
-rw-rw-r-- 1 chenxf chenxf 300975 720 16:08 pic-002.jpeg
-rw-rw-r-- 1 chenxf chenxf 310130 720 16:08 pic-003.jpeg
-rw-rw-r-- 1 chenxf chenxf 268694 720 16:08 pic-004.jpeg
-rw-rw-r-- 1 chenxf chenxf 301056 720 16:08 pic-005.jpeg
-rw-rw-r-- 1 chenxf chenxf 293927 720 16:08 pic-006.jpeg
-rw-rw-r-- 1 chenxf chenxf 340295 720 16:08 pic-007.jpeg
-rw-rw-r-- 1 chenxf chenxf 430787 720 16:08 pic-008.jpeg
-rw-rw-r-- 1 chenxf chenxf 404552 720 16:08 pic-009.jpeg
-rw-rw-r-- 1 chenxf chenxf 412691 720 16:08 pic-010.jpeg

然后,你就随便挑一张,转为YUV: ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv如果-s参数不写,则输出大小与输入一样。当然了,YUV还有yuv422p啥的,你在-pix_fmt 换成yuv422p就行啦!

12.H264编码profile & level控制

举3个例子吧

1
2
3
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4

如果ffmpeg编译时加了external的libx264,那就这么写:

ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4

从压缩比例来说,baseline< main < high,对于带宽比较局限的在线视频,可能会选择high,但有些时候,做个小视频,希望所有的设备基本都能解码(有些低端设备或早期的设备只能解码baseline),那就牺牲文件大小吧,用baseline。自己取舍吧!

13.旋转视频

在手机上录的视频,在电脑放,是颠倒的,需要旋转90度。使用格式工厂失败了……

参考ffmpeg视频的翻转vflip、hflip,旋转rotate、transpose

使用ffmpeg -i 3.mp4 -vf rotate=PI/2 rotate8.mp4画面确实旋转过来了,但是尺寸不对,变成横屏后,两侧的画面看不到了。改用ffmpeg -i 3.mp4 -vf transpose=1 rotate8.mp4解决了问题

14.dshow

参考FFMPEG学习(一)—【命令行】采集视频和音频

Windows DirectShow输入设备,用于采集windows下的视频和音频设备。

通过命令 ffmpeg -list_devices true -f dshow -i dummy 查看支持的设备列表,包含设备名称,设备类型等信息。

得到如下结果

1
2
3
4
5
6
7
8
9
[dshow @ 0000022890f18f40] DirectShow video devices (some may be both video and audio devices)
[dshow @ 0000022890f18f40] "HP TrueVision HD Camera"
[dshow @ 0000022890f18f40] Alternative name "@device_pnp_\\?
\usb#vid_0408&pid_5365&mi_00#6&193fc2d2&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 0000022890f18f40] DirectShow audio devices
[dshow @ 0000022890f18f40] "麦克风阵列 (英特尔® 智音技术)"
[dshow @ 0000022890f18f40] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-
00A0C911CE86}\wave_{1F376599-992B-457F-A4B1-45C06BD5C148}"
dummy: Immediate exit requested

使用以下命令录制视频或音频,按Q可以停止。

1
2
ffmpeg -f dshow -i video="HP TrueVision HD Camera" -vcodec libx264 001.mp4
ffmpeg -f dshow -i audio="麦克风阵列 (英特尔® 智音技术)" -ar 16000 -ac 1 lib.wav

音视频联合录制

1
2
ffmpeg -f dshow -i video="HP TrueVision HD Camera":audio="麦克风阵列 (英特尔® 智音技术)" 
-s 640x360 -b:v 1000k -b:a 128k output.mkv

音视频推流

1
2
ffmpeg -f dshow -i video="HP TrueVision HD Camera":audio="麦克风阵列 (英特尔® 智音技术)" 
-vcodec libx264 -r 25 -preset:v ultrafast -tune:v zerolatency -f rtsp rtsp://127.0.0.1/test

15.FFmpeg使用gdigrab采集窗口

FFmpeg采集设备(3)

三、小丸工具箱

小丸工具箱是一款用于处理音视频等多媒体文件的软件。是一款x264、ffmpeg等命令行程序的图形界面。它的目标是让视频压制变得简单、轻松。

主要功能:

  • 高质量的H264+AAC视频压制
  • ASS/SRT字幕内嵌到视频
  • AAC/WAV/FLAC/ALAC音频转换
  • MP4/MKV/FLV的无损抽取和封装

参考自小丸FAQ:小丸工具箱是一个x264(taro编译版,现在是7mod)、MP4Box、ffmpeg、MediaInfo等软件的GUI。工具箱只是一个调用其他程序的程序,自己没有压制功能!只是把平常需要命令行完成的工作图形化了!其实一切转换软件都是这个意思。

四、fluent-ffmpeg

参考自

该nodejs包封装了ffmpeg的命令行调用部分,加强了代码的可读性,若熟悉ffmpeg 命令行使用手册,亦可不使用该包。

1
2
3
npm install --save fluent-ffmpeg
//使用js编码的用户,可以忽略下条命令
npm install --save @types/fluent-ffmpeg

五、使用ffmpeg推RTMP直播流

1.安装nignx环境

参考windows使用nginx配置rtmp,hls,httpflv

2.参考手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流

在上述下载的demo中,看一下conf/nginx.conf配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rtmp {
server {
listen 1935;

application live {
live on;
}

application vod {
play video;
}

application hls {
live on;
hls on;
hls_path temp/hls;
hls_fragment 8s;
}
}
}

其中rtmp就是rtmp服务器模块,端口是1935,application我理解为一个路径。可以通过访问rtmp://localhost/live来访问live这个资源。live on 表示这是实时的传输,这不同于点播,点播就好比我在某视频网站上想看一个视频,无论我什么时候去点击,它会从头开始播放。而实时传输(直播),就是好比看电视,我在19:20去打开电视(打开直播路),视频不会从头开始播放,而是从当前(19:20)的视频数据开始播放。

然后在nginx.exe路径下命令行运行nginx -s reload重新加载配置。

3.使用ffmpeg推流

参考使用FFmpeg在B站直播的姿势

ffmpeg -re -i 1.mp4 -vcodec copy -f flv rtmp://localhost/live

或者

1
2
ffmpeg -re -i 1.mp4 -vcodec copy -acodec copy
-b:v 800k -b:a 32k -f flv rtmp://localhost/live

-re : 表示使用文件的原始帧率进行读取,因为ffmpeg读取视频帧的速度很快,如果不使用这个参数,ffmpeg可以在很短时间就把video.mp4中的视频帧全部读取完并进行推流,这样就无法体现出视频播放的效果了。官方文档中对这个参数的解释是:

-re (input)
Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).

-vcodec copy : -vcodec表示使用的视频编解码器 ,前缀v表示video。后面紧跟的copy 表示复制使用源文件的视频编解码器,比如原文件的编解码器(codec)是h264,则这里就使用h264。

-acodec copy : -acodec表示使用的音频编解码器,前缀a表示audio。后面的copy 表示使用源文件的音频编解码器。

-b:v 800k : -b:v表示视频的比特率(bitrate) ,为800k。

-b:a 32k : 表示音频的比特率为32k。

-f flv : -f表示format ,就是强制输出格式为flv,这一步其实也叫封装(mux),封装要做的事就是把视频和音频混合在一起,进行同步。紧跟在后面的rtmp://localhost/live 表示输出的”文件名”,这个文件名可以是一个本地的文件,也可以指定为rtmp流媒体地址。指定为rtmp流媒体地址后,则ffmpeg就可以进行推流。

4.可以使用VLC或ffplay进行播放了


ffmpeg
https://flepeng.github.io/工具-11-FFmpeg-ffmpeg/
作者
Lepeng
发布于
2021年3月12日
许可协议