FFMpeg安装、测试及相关属性介绍

前言

ffmpeg是一个源于Linux的工具软件,是FLV视频转换器,可以轻易地实现FLV向其它格式avi、asf、 mpeg的转换或者将其它格式转换为flv。

ffmpeg设备相关的操作取决于操作系统,MAC和WIN是不统一的。

相关地址

注意

本文使用最新的FFmpeg6.0进行测试,早期版本录制桌面有BUG,如果电脑缩放不是100%,就会录制不全,建议使用新版本。

参数获取

查看音频和视频设备列表

Win

1
ffmpeg -f dshow -list_devices true -i dummpy

Mac

1
ffmpeg -f avfoundation -list_devices true -i dummpy

查看Dshow/Avfoundation库支持参数

WIN :

1
ffmpeg -h demuxer=dshow

MAC :

1
ffmpeg -h demuxer=avfoundation

查看 avfoundation 的可支持的具体命令,比如avfoundation 就不支持dshow的 list_options 命令

视频源

获取视频源支持的分辨率

1
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"

音频源

1
ffmpeg -f dshow -list_options true -i audio="麦克风 (Realtek(R) Audio)"

音视频处理

视频处理

缩放

设置目标分辨率

1
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -vf scale=1280:720 -y D:\mp4\test04.mp4

高度等比缩放

为了让FFmpeg按比例设置高度自适应,可以在scale滤镜表达式中指定带有-1的参数。

1
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -vf scale=1280:-1  -y D:\mp4\test04.mp4

其中

-video_size 1920x1080是设置的源分辨率(不是缩放后的分辨率),跟采集的源有关,不能随意设置。

-vf scale=1280:720是设置目标分辨率,可以随意设置。

裁剪

1
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -filter:v "crop=1280:360:0:0" -y D:\mp4\test04.mp4

配置项

-filter:v "crop=<width>:<height>:<x>:<y>" 其中<width><height>是需要裁剪的宽度和高度,<x><y>是裁剪左上角的坐标。

裁剪后缩放

1
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -filter:v "crop=1280:720:0:0,scale=800:-1" -y D:\mp4\test04.mp4

裁剪和缩放操作和我们配置项的先后有关系。

缩放后裁剪

1
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -filter:v "scale=1280:-1,crop=1280:360:0:0" -y D:\mp4\test04.mp4

音频混音

1
-filter_complex amix=inputs=2:duration=longest:dropout_transition=0:weights="1 0.25":normalize=0

捕获Electron界面

这是因为 Electron 使用了 GPU 加速的界面渲染,ffmpeg 的 gdigrab 无法捕获这样的界面。
有几种解决方法:

  1. 在 Electron 中禁用 GPU 加速,使其使用 CPU 渲染界面。可以在 app.disableGpu 属性中设置:
1
2
const app = require('electron').app
app.disableGpu = true

这样 gdigrab 就可以捕获界面了,但是会对 Electron 的性能有些影响。

  1. 不使用 gdigrab,而使用 Electron 提供的屏幕截图 API。可以这样实现:
1
2
3
4
5
6
7
8
const electron = require('electron')

const browserWindow = electron.BrowserWindow.getFocusedWindow()
browserWindow.capturePage(image => {
require('fs').writeFile('screenshot.png', image.toPNG(), err => {
if (err) throw err
})
})
  1. 使用第三方屏幕录制工具,比如 OBS Studio,它可以捕获 Electron 的界面。
  2. 如果是为了录制屏幕视频,可以使 Electron 窗口一直处于最顶层,然后使用 OBS 或 ffmpeg 对整个屏幕进行录制,这样就捕获到了 Electron 窗口的视频。

所以总的来说,要捕获 Electron 的界面,最好的方法是使用 Electron 自己提供的 APIs,而不是依赖 ffmpeg 的 gdigrab。

WIN音视频操作

获取设备名称

1
ffmpeg -list_devices true -f dshow -i dummy

我们可以在设备管理器中查看设备的名称

旧版本获取的设备名称中文是乱码的,新版本已经没有这个问题

麦克风录制

测试设备

1
ffplay -f dshow -i audio="麦克风 (Realtek(R) Audio)"

录制

1
ffmpeg -f dshow -i audio="麦克风 (Realtek(R) Audio)" -acodec libmp3lame -ac 1 -ar 44100 -vn D://mp4/maikefeng.mp3

扬声器录制

首先需要安装一个软件:screen capture recorder

编译好的下载地址是:

http://sourceforge.net/projects/screencapturer/files/

安装完了之后,在命令行执行:

1
ffmpeg -list_devices true -f dshow -i dummy

就会看到多了两个设备

  • screen-capture-recorder 这个就是桌面捕获设备

  • virtual-audio-capturer 这个是音频捕获设备(这个录制的不是麦克风的声音,是系统输出的声音)

注册audio_sniffer.dllaudio_sniffer-x64.dll

打开CMD窗口,执行以下命令:

1
2
regsvr32 "D:\Tools\ffmpeg\dll\virtual-audio\audio_sniffer.dll"
regsvr32 "D:\Tools\ffmpeg\dll\virtual-audio\audio_sniffer-x64.dll"

测试设备

1
ffplay -f dshow -i audio="virtual-audio-capturer"

录制

1
ffmpeg -f dshow -i audio="virtual-audio-capturer" -acodec libmp3lame -ac 1 -ar 44100 -vn D://mp4/test01.mp3

取消注册

1
2
regsvr32 /u "D:\Tools\ffmpeg\dll\virtual-audio\audio_sniffer.dll"
regsvr32 /u "D:\Tools\ffmpeg\dll\virtual-audio\audio_sniffer-x64.dll"

摄像头录制

查看摄像头视频

1
ffplay -f dshow -i video="Integrated Webcam"

保存文件

1
ffmpeg -f dshow -i video="Integrated Webcam" -vcodec libx264 -preset:v ultrafast -pix_fmt yuv420p D:\mp4\test01.mp4

服务器推流

1
ffmpeg -f dshow -i video="Integrated Webcam" -vcodec libx264 -b:v 512k  -preset:v ultrafast -f flv rtmp://39.104.23.195:1935/live/xiaoming

桌面录制

使用gdigrab

查看

1
ffplay -f gdigrab -i desktop

录制屏幕

多屏时会出现录制不全的情况新版本下没有出现

示例

1
ffmpeg -f gdigrab -i desktop -pix_fmt yuv420p -framerate 30 -vcodec libx264 -preset ultrafast -y D:\mp4\test01.mp4

只录制主屏

1
ffmpeg -f gdigrab -framerate 30 -offset_x 0 -offset_y 0 -video_size 1920x1080 -i desktop -c:v libx264 -preset ultrafast -pix_fmt yuv420p -y D:\mp4\zhuping.mp4

服务器推流

1
ffmpeg -f gdigrab -i desktop -framerate 30 -vcodec libx264 -b:v 512k -preset ultrafast -pix_fmt yuv422p -f flv rtmp://39.104.23.195:1935/live/xiaoming

窗口

1
ffplay -f gdigrab -i title="码客-AI助理 v 1.1"

获取窗口Title

要使用CMD获取当前激活窗口的标题,可以按照以下步骤:

  1. 打开命令提示符(CMD):按下Win+R,输入”cmd”后按回车键即可打开CMD窗口。

  2. 输入以下命令并按回车键:

1
wmic path Win32_Process get Caption,ProcessId
  1. 在CMD窗口中,最后启动的应用程序将具有最高的ProcessID。请记下进程ID(PID)。

  2. 输入以下命令并按回车键,替换PID为上一步得到的PID:

1
2
3
tasklist /v /fi "pid eq PID" /fo list | findstr /i "窗口标题"

tasklist /v /fi "PID eq 21120" /fo list | findstr /i "窗口标题"
  1. 此命令将输出正在运行的进程的详细信息,包括窗口标题。

注意:此方法仅适用于Windows操作系统。

使用screen-capture-recorder

这种方式的优点是

  • 只录制主屏
  • 不会出现鼠标闪烁

步骤

注册screen-capture-recorder.dllscreen-capture-recorder-x64.dll

注意

必须用管理员身份注册。

打开CMD窗口,执行以下命令:

1
2
regsvr32 "D:\Tools\ffmpeg\dll\screen-capture-recorder\screen-capture-recorder.dll"
regsvr32 "D:\Tools\ffmpeg\dll\screen-capture-recorder\screen-capture-recorder-x64.dll"

解决光标录制时闪烁

1
ffmpeg -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -y D:\mp4\test04.mp4

注意

-video_size 1920x1080这个参数必须设置,并且尺寸必须要和屏幕的实际分辨率完全一样,否则会报错。

取消注册

1
2
regsvr32 /u "D:\Tools\ffmpeg\dll\screen-capture-recorder\screen-capture-recorder.dll"
regsvr32 /u "D:\Tools\ffmpeg\dll\screen-capture-recorder\screen-capture-recorder-x64.dll"

摄像头+麦克风

保存文件

1
ffmpeg -f dshow -i video="Integrated Webcam":audio="麦克风 (Realtek(R) Audio)" -vcodec libx264 -acodec copy -preset:v ultrafast -f flv test3.flv

推流

1
ffmpeg -f dshow -i video="Integrated Webcam":audio="麦克风 (Realtek(R) Audio)" -vcodec libx264 -b:v 512k -b:a 16k -r 25 -acodec copy -preset ultrafast -f flv rtmp://39.104.23.195:1935/live/xiaoming

桌面+麦克风

保存文件

1
ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (Realtek(R) Audio)" -vcodec libx264 -acodec copy -preset:v ultrafast -f flv test4.flv

推流

1
ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (Realtek(R) Audio)" -vcodec libx264 -preset ultrafast -b:v 800k -b:a 100k -acodec libmp3lame -pix_fmt yuv422p  -f flv rtmp://39.104.23.195:1935/live/xiaoming

桌面+扬声器

首先需要安装一个软件:screen capture recorder

编译好的下载地址是:

http://sourceforge.net/projects/screencapturer/files/

安装完了之后,在命令行执行:

1
ffmpeg -list_devices true -f dshow -i dummy

就会看到多了两个设备

  • screen-capture-recorder 这个就是桌面捕获设备

  • virtual-audio-capturer 这个是音频捕获设备(这个录制的不是麦克风的声音,是系统输出的声音)

保存文件

1
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="virtual-audio-capturer" -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -y test5.mp4

推流

1
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -preset:v ultrafast -pix_fmt yuv422p -f flv rtmp://39.104.23.195:1935/live/xiaoming

其中

  • -rtbufsize指定了输入/输出对象的缓冲区大小,单位为字节。如果输入文件过大或者输出文件需要压缩,设置缓冲区大小可以提高转换的效率和稳定性。

  • -thread_queue_size指定输入线程队列的最大大小,单位为包的数量。如果输入流的速率不匹配处理速率,设置较大的队列可以减少由于输入流速率过快而导致的帧丢失,提高转换质量。

桌面+扬声器+麦克风

使用gdigrab

1
ffmpeg -f dshow -i audio="virtual-audio-capturer" -f dshow -i audio="麦克风 (Realtek(R) Audio)" -filter_complex amix=inputs=2:duration=first:dropout_transition=2  -f gdigrab -framerate 25 -offset_x 0 -offset_y 0 -video_size 1920x1080 -i desktop -pix_fmt yuv420p -vf scale=trunc(iw/2)*2:trunc(ih/2)*2 -vcodec libx264 -preset:v ultrafast  -acodec aac D:/mp4/1.mp4

trunc(expr)表达式

对expr的值向0取整。例如trunc(-1.5) = -1.0

使用screen-capture-recorder

打开CMD窗口,执行以下命令:

1
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="麦克风 (Realtek(R) Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -rtbufsize 1000M -thread_queue_size 1024 -f dshow -video_size 1920x1080 -i video="screen-capture-recorder" -an -c:v libx264 -r 30 -pix_fmt yuv420p -preset:v ultrafast -y D:\mp4\luping.mp4

结束录制:

在CMD窗口中输入q

混音处理

1
ffmpeg -i INPUT1 -i INPUT2 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 OUTPUT

amix参数:

  • inputs 输入的数量,如果没有指明,默认为2.

  • duration 决定了流的长度

    • longest 最长输入的持续时间

    • shortest 最短输入的持续时间

    • first 第一个输入的持续时间

  • dropout_transition 输入流结束时用于体积重整的转换时间(以秒为单位)。 默认值为2秒。

桌面+摄像头+麦克风

用户头像在右下角

1
ffmpeg -f gdigrab -i desktop -f dshow -i video="Integrated Webcam" -f dshow -i audio="麦克风 (Realtek(R) Audio)" -c:v libx264 -preset ultrafast -filter_complex overlay=W-w:H-h -acodec libmp3lame -ar 44100 -ac 1  -f flv mytest.flv

头像在右上角并缩放

1
ffmpeg -y -f gdigrab -i desktop -f dshow -i video="Integrated Webcam" -f dshow -i audio="麦克风 (Realtek(R) Audio)" -c:v libx264 -preset ultrafast -filter_complex "[1:v]scale=w=200:h=300:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w:y=0" -acodec libmp3lame -ar 44100 -ac 1  -f flv mytest.flv

661949-8ba3d73e23a46fe6

左上角

1
-filter_complex overlay=0:0

右上角

1
-filter_complex overlay=W-w:0

左下角

1
-filter_complex overlay=0:H-h

右下角

1
-filter_complex overlay=W-w:H-h

推RTSP流

1
ffmpeg -f dshow -i video="Integrated Webcam":audio="麦克风 (Realtek(R) Audio)" -vcodec libx264 -acodec libvo_aacenc -preset:v ultrafast -f rtsp rtsp://127.0.0.1/abcd.sdp

设置帧率

1
ffmpeg -f dshow -i video="USB2.0 Camera":audio="麦克风 (USB2.0 Camera)" -vcodec libx264 -acodec libvo_aacenc -b 1080k -r 20 -preset:v ultrafast -f rtsp rtsp://127.0.0.1/abcd.sdp

MAC音视频操作

MAC上录制摄像头和麦克风都需要申请权限,直接在命令行中获取摄像头和麦克风都会报错,不能推流。

这个折腾了我好长时间才找到原因,网上也没说这种情况的原因,希望看到这个博客的同学别再踩这个坑。

安装

1
brew install ffmpeg

查看设备

1
ffmpeg -f avfoundation -list_devices true -i ""

摄像头录制

需要获取录制权限

1
ffmpeg -y -framerate 30 -f avfoundation -r 30 -i 0 out.mp4

-framerate 限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。
-f:指定使用使用 avfoundation库(mac系统下) 来录制
-i:指定输入设备 1:设备索引值,1代表屏幕,0代表摄像头,等等
-r:指定帧率为30

flv

1
ffmpeg -y -framerate 30 -f avfoundation -r 30 -i 0 -f flv test01.flv

播放命令:

1
ffplay out.mp4

桌面录制

1
ffmpeg -y -f avfoundation -i "1" -framerate 30 -video_size 640x480 -vcodec libx264 -preset ultrafast -f flv test2.flv

-t 录制时间,单位miao

推流

1
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -f flv rtmp://119.3.212.205:1935/live/xiaoming

桌面+麦克风录制

1
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv mytest.flv

或者

1
ffmpeg -f avfoundation -i "1:0" -r 29.97 -c:v libx264 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k out.flv

-i 1:0 冒号前面的 “1” 代表的屏幕索引号。冒号后面的”0”代表的声音索相号。
-c:v 与参数 -vcodec 一样,表示视频编码器。c 是 codec 的缩写,v 是video的缩写。
-crf 是 x264 的参数。 0 表式无损压缩。
-c:a 与参数 -acodec 一样,表示音频编码器。
-profile 是 fdk_aac 的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据。
-b:a 指定音频码率。 b 是 bitrate的缩写, a是 audio的缩写。

推流

1
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://119.3.212.205:1935/live/xiaoming

桌面+麦克风+摄像头录制

1
2
3
4
ffmpeg -f avfoundation -framerate 30 -i "1:0" \
-f avfoundation -framerate 30 -video_size 640x480 -i "0" \
-c:v libx264 -preset ultrafast \
-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv mytest.flv

推流

1
2
3
4
ffmpeg -f avfoundation -framerate 30 -i "1:0" \
-f avfoundation -framerate 30 -video_size 640x480 -i "0" \
-c:v libx264 -preset ultrafast \
-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://119.3.212.205:1935/live/xiaoming

音频录制

1
ffmpeg -f avfoundation -i :0 out.wav
  • -f 指定使用 avfoundation 采集数据。
  • -i 指定从哪儿采集数据,它是一个文件索引号。
  • :冒号前面的是视频采集索引号,冒号后面是音频采集索引号

播放声音的命令:

1
ffplay out.wav

录制音频裸数据

1
ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm

C#注册DLL

在C#中,可以使用System.Runtime.InteropServices.RegistrationServices类的RegisterAssembly方法来注册DLL。

使用此方法需要注意以下几点:

  1. 确保你的DLL是COM可调用的。

  2. 确保你的C#程序有管理员权限,以便进行注册。

以下是一个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Runtime.InteropServices;

// ...

// Load the DLL to be registered
Assembly asm = Assembly.LoadFrom("MyDLL.dll");

// Register the DLL
RegistrationServices regsrv = new RegistrationServices();
bool result = regsrv.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);

if (result)
{
Console.WriteLine("Registration succeeded");
}
else
{
Console.WriteLine("Registration failed");
}

在这个例子中,我们首先从MyDLL.dll文件中加载了DLL,然后通过RegistrationServices类的RegisterAssembly方法注册了该DLL。如果注册成功,将输出“Registration succeeded”;否则将输出“Registration failed”。

Linux上安装

Yum安装

Yum中最新只能安装2.8版本

安装EPEL Release

因为安装需要使用其他的repo源,所以需要EPEL支持

1
sudo yum install -y epel-release rpm

安装Nux-Dextop源

1
2
3
4
5
6
7
8
# 导入一个Code
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

# 安装nux-dextop 源
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

# 查看repo源是否安装成功
sudo yum repolist

安装ffmpeg

1
2
yum list ffmpeg
sudo yum install -y ffmpeg

查看版本

1
ffmpeg -version

官方编译

下载列表地址:https://johnvansickle.com/ffmpeg/

下载

1
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz

解压

1
tar xvJf ffmpeg-release-amd64-static.tar.xz

查看

1
2
cd ffmpeg-4.2.1-amd64-static/
./ffmpeg -version

显示信息

ffmpeg version 4.2.1-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2019 the FFmpeg developers

built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516

configuration: –enable-gpl –enable-version3 –enable-static –disable-debug –disable-ffplay –disable-indev=sndio –disable-outdev=sndio –cc=gcc-6 –enable-fontconfig –enable-frei0r –enable-gnutls –enable-gmp –enable-libgme –enable-gray –enable-libaom –enable-libfribidi –enable-libass –enable-libvmaf –enable-libfreetype –enable-libmp3lame –enable-libopencore-amrnb –enable-libopencore-amrwb –enable-libopenjpeg –enable-librubberband –enable-libsoxr –enable-libspeex –enable-libsrt –enable-libvorbis –enable-libopus –enable-libtheora –enable-libvidstab –enable-libvo-amrwbenc –enable-libvpx –enable-libwebp –enable-libx264 –enable-libx265 –enable-libxml2 –enable-libdav1d –enable-libxvid –enable-libzvbi –enable-libzimg

官方编译的可能没有我们需要的编码器,下面是我们自己编译的方式

自己编译

安装编译环境

1
2
yum install -y automake autoconf libtool gcc gcc-c++ 
yum install make

安装yasm插件

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

安装nasm

查看nasm的版本

1
nasm -version

版本低于2.13安装编译x264会报错 版本满足条件可跳过

Found no assembler
Minimum version is nasm-2.13

安装nasm

1
yum list nasm

发现只有2.10.07-7.el7版本 看来只能自己编译了

下载列表地址:https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/

1
2
3
4
5
6
7
cd ~
wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz
tar -zxvf nasm-2.14.02.tar.gz
cd nasm-2.14.02
./configure
make && make install
cd ..

安装x264视频编码器

1
2
3
4
5
6
wget https://code.videolan.org/videolan/x264/-/archive/stable/x264-stable.tar.gz
tar -zxvf x264-stable.tar.gz
cd x264-stable
./configure --enable-static --enable-shared
make && make install
cd ..

安装完成后路径

1
whereis libx264.a

libx264: /usr/local/lib/libx264.a

安装fdk-aac音频编码器

1
2
3
4
5
6
wget https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.5.tar.gz
tar -zxvf fdk-aac-0.1.5.tar.gz
cd fdk-aac-0.1.5
./configure
make && make install
cd ..

安装ffmpeg

查看所有可下载版本

网址:http://www.ffmpeg.org/releases/

1
2
3
4
5
wget https://ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz
tar zxvf ffmpeg-4.1.3.tar.gz
cd ffmpeg-4.1.3
./configure --enable-gpl --enable-libx264 --enable-nonfree --enable-libfdk-aac
make && make install

或者下载源码后按照上面步骤安装

1
2
yum install git
git clone https://github.com/FFmpeg/FFmpeg.git

安装完成后路径

1
whereis ffmpeg

ffmpeg: /usr/local/bin/ffmpeg

自定义安装位置

默认不添加–prefix 这相当于

1
./configure --prefix=/usr/local

安装后的文件就会遍布在/usr/local的子文件夹中

我们可以按照下面写法自定义位置

1
./configure --prefix=/usr/local/ffmpeg

这样文件的位置就是

1
/usr/local/ffmpeg/bin/ffmpeg

这时我们运行ffmpeg -version 提示

-bash: /usr/local/bin/ffmpeg: No such file or directory

要么我们在安装时直接设置

1
./configure --prefix=/usr/local

这样不方便卸载,因为安装生成的文件在多个文件夹中

要么我们配置一下搜索的路径

1
vi /etc/profile

在开始注释后添加

1
PATH=$PATH:/usr/local/ffmpeg/bin

保存并立即生效

1
source /etc/profile

查看版本

1
ffmpeg -version

卸载

1
make uninstall

测试ffmpeg

1
ffmpeg -version

报错:

ffmpeg: error while loading shared libraries: libx264.so.157: cannot open sh

解决方法

1
vi /etc/ld.so.conf

添加libx264.so所在路径

1
/usr/local/lib

退出后执行

1
ldconfig

参数

常用参数

参数 示例 适用 作用
-vcodec
-c:v
-vcodec libx264
-acodec copy
视频 视频编码
-acodec copy 表示适用文件原有编码
录制时无效 用在文件转码时
-acodec
-c:a
-acodec libmp3lame 音频 音频编码
-preset -preset ultrafast 视频 压缩的预设,决定视频的质量
-b:v -b:v 800k 视频 视频比特率 很重要 影响清晰度
-b:a -b:a 100k 音频 音频比特率 很重要 影响清晰度
-pix_fmt -pix_fmt yuv422p 视频 视频颜色空间 不设置在网页上可能黑屏
-r -r 30 视频 视频 设置帧频 缺省25
-f fmt -f flv 通用
-s size -s 640x320
-s 640x?
视频 设置视频输出尺寸

通用参数

  • -L license
  • -h 帮助
  • -fromats 显示可用的格式,编解码的,协议的。。。
  • -f fmt 强迫采用格式fmt
  • -I filename 输入文件
  • -y 覆盖输出文件
  • -t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
  • -ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
  • -title string 设置标题
  • -author string 设置作者
  • -copyright string 设置版权
  • -comment string 设置评论
  • -target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了:
    ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
  • -hq 激活高质量设置
  • -itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

视频参数

  • -b:v bitrate 设置比特率 如:512k
  • -r fps 设置帧频 缺省25
  • -s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
    Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
  • -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编解码方式。
    如果用copy表示原始编解码数据必须被拷贝。
  • -sameq 使用同样视频质量作为源(VBR)
  • -pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
  • -passlogfile file 选择两遍的纪录文件名为file

音频参数

  • -ab bitrate 设置音频码率
  • -ar freq 设置音频采样率
  • -ac channels 设置通道 缺省为1
  • -an 不使能音频纪录
  • -acodec codec 使用codec编解码

通用命令

压缩视频

1
ffmpeg -i pingcap-intro-converted.mp4 -b:v 64k -r 20 -c:v libx264 -s 640x320 -strict -2 pingcap.mp4

获取封面

1
ffmpeg -ss 00:00:10 -i test1.flv -f image2 -y test1.jpg

视频文件推流

1
ffmpeg -re -i eguid.flv -vcodec copy -acodec copy -f flv -y rtmp://110.3.212.110:1935/live/xiaoming

当然有解决办法

1
ffmpeg -re -stream_loop -1 -i eguid.flv -vcodec copy -acodec copy -f flv -y rtmp://110.3.212.110:1935/live/xiaoming

加了一个-stream_loop -1 -1为无限循环

拉流保存文件

1
ffmpeg -i rtmp://119.3.212.205:1935/live/xiaoming -vcodec h264 -f flv -acodec aac -ac 2 eguid.flv

转流(rtsp转rtmp)

1
ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -rtsp_transport tcp -vcodec h264 -acodec aac -f flv rtmp://119.3.212.205:1935/live/xiaoming

抽取音频流

1
ffmpeg -i input.mp4 -acodec copy -vn out.aac

acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。
vn: v 代表视频,n 代表 no 也就是无视频的意思。

抽取视频流

1
ffmpeg -i input.mp4 -vcodec copy -an out.h264

vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
an: a 代表视频,n 代表 no 也就是无音频的意思。

转格式

1
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv

上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。

音视频合并

1
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4

添加水印

1
ffmpeg -y -i test.mp4 -i logo.png -filter_complex "[1]scale=w=480:h=280[s];[0][s]overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10[ov]" -map "[ov]" output.mp4