FFmpeg常用操作

2019-10-21 17:15:52 浏览数 (1)

前言

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

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

相关地址

  • 库:FFMPEG
  • 播放器: VLC

Yum安装

Yum中最新只能安装2.8版本

安装EPEL Release

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

代码语言:javascript复制
sudo yum install -y epel-release rpm

安装Nux-Dextop源

代码语言:javascript复制
# 导入一个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

代码语言:javascript复制
yum list ffmpeg
sudo yum install -y ffmpeg

查看版本

代码语言:javascript复制
ffmpeg -version

官方编译

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

下载

代码语言:javascript复制
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz

解压

代码语言:javascript复制
tar xvJf ffmpeg-release-amd64-static.tar.xz

查看

代码语言:javascript复制
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

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

自己编译

安装编译环境

代码语言:javascript复制
yum install -y automake autoconf libtool gcc gcc-c   
yum install make

安装yasm插件

代码语言:javascript复制
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的版本

代码语言:javascript复制
nasm -version

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

Found no assembler Minimum version is nasm-2.13

安装nasm

代码语言:javascript复制
yum list nasm

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

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

代码语言:javascript复制
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视频编码器

代码语言:javascript复制
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 ..

安装完成后路径

代码语言:javascript复制
whereis libx264.a

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

安装fdk-aac音频编码器

代码语言:javascript复制
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/

代码语言:javascript复制
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

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

代码语言:javascript复制
yum install git
git clone https://github.com/FFmpeg/FFmpeg.git

安装完成后路径

代码语言:javascript复制
whereis ffmpeg

ffmpeg: /usr/local/bin/ffmpeg

自定义安装位置

默认不添加–prefix 这相当于

代码语言:javascript复制
./configure --prefix=/usr/local

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

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

代码语言:javascript复制
./configure --prefix=/usr/local/ffmpeg

这样文件的位置就是

代码语言:javascript复制
/usr/local/ffmpeg/bin/ffmpeg

这时我们运行ffmpeg -version 提示

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

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

代码语言:javascript复制
./configure --prefix=/usr/local

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

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

代码语言:javascript复制
vi /etc/profile

在开始注释后添加

代码语言:javascript复制
PATH=$PATH:/usr/local/ffmpeg/bin

保存并立即生效

代码语言:javascript复制
source /etc/profile

查看版本

代码语言:javascript复制
ffmpeg -version

卸载

代码语言:javascript复制
make uninstall

测试ffmpeg

代码语言:javascript复制
ffmpeg -version

报错:

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

解决方法

代码语言:javascript复制
vi /etc/ld.so.conf

添加libx264.so所在路径

代码语言:javascript复制
/usr/local/lib

退出后执行

代码语言:javascript复制
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编解码

通用命令

压缩视频

代码语言:javascript复制
ffmpeg -i pingcap-intro-converted.mp4 -b:v 64k -r 20 -c:v libx264 -s 640x320 -strict -2 pingcap.mp4

获取封面

代码语言:javascript复制
ffmpeg -ss 00:00:10 -i test1.flv -f image2 -y test1.jpg

视频文件推流

代码语言:javascript复制
ffmpeg -re -i eguid.flv -vcodec copy -acodec copy -f flv -y rtmp://110.3.212.110:1935/live/xiaoming

当然有解决办法

代码语言:javascript复制
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为无限循环

拉流保存文件

代码语言:javascript复制
ffmpeg -i rtmp://119.3.212.205:1935/live/xiaoming -vcodec h264 -f flv -acodec aac -ac 2 eguid.flv

转流(rtsp转rtmp)

代码语言:javascript复制
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

抽取音频流

代码语言:javascript复制
ffmpeg -i input.mp4 -acodec copy -vn out.aac

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

抽取视频流

代码语言:javascript复制
ffmpeg -i input.mp4 -vcodec copy -an out.h264

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

转格式

代码语言:javascript复制
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv

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

音视频合并

代码语言:javascript复制
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4

添加水印

代码语言:javascript复制
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

WIN音视频操作

获取设备名称

代码语言:javascript复制
ffmpeg -list_devices true -f dshow -i dummy

这里获取的设备名称中文是乱码的

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

摄像头录制

查看摄像头视频

代码语言:javascript复制
ffplay -f dshow -i video="Integrated Camera"

保存文件

代码语言:javascript复制
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -f flv test1.flv

服务器推流

代码语言:javascript复制
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -b:v 512k  -preset:v ultrafast -f flv rtmp://39.104.23.195:1935/live/xiaoming

摄像头 麦克风

保存文件

代码语言:javascript复制
ffmpeg -f dshow -i video="Integrated Camera":audio="麦克风 (2- High Definition Audio 设备)" -vcodec libx264 -acodec copy -preset:v ultrafast -f flv test3.flv

推流

代码语言:javascript复制
ffmpeg -f dshow -i video="Integrated Camera":audio="麦克风 (2- High Definition 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

桌面录制

查看

代码语言:javascript复制
ffplay -f gdigrab -i desktop

保存文件

代码语言:javascript复制
ffmpeg -f gdigrab -i desktop -framerate 30 -video_size 640x480 -vcodec libx264 -preset ultrafast -f flv test2.flv

服务器推流

代码语言:javascript复制
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

桌面 麦克风

保存文件

代码语言:javascript复制
ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (2- High Definition Audio 设备)" -vcodec libx264 -acodec copy -preset:v ultrafast -f flv test4.flv

推流

代码语言:javascript复制
ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (2- High Definition 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/

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

代码语言:javascript复制
ffmpeg -list_devices true -f dshow -i dummy

就会看到多了两个设备

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

保存文件

代码语言:javascript复制
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -preset:v ultrafast -f flv test5.flv

推流

代码语言:javascript复制
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

桌面 摄像头 麦克风

用户头像在右下角

代码语言:javascript复制
ffmpeg -f gdigrab -i desktop -f dshow -i video="Integrated Camera" -f dshow -i audio="麦克风 (2- High Definition Audio 设备)" -c:v libx264 -preset ultrafast -filter_complex overlay=W-w:H-h -acodec libmp3lame -ar 44100 -ac 1  -f flv mytest.flv

头像在右上角并缩放

代码语言:javascript复制
ffmpeg -y -f gdigrab -i desktop -f dshow -i video="Integrated Camera" -f dshow -i audio="麦克风 (2- High Definition 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

左上角

代码语言:javascript复制
-filter_complex overlay=0:0

右上角

代码语言:javascript复制
-filter_complex overlay=W-w:0

左下角

代码语言:javascript复制
-filter_complex overlay=0:H-h

右下角

代码语言:javascript复制
-filter_complex overlay=W-w:H-h

推RTSP流

代码语言:javascript复制
ffmpeg -f dshow -i video="Integrated Camera":audio="麦克风 (2- High Definition Audio 设备)" -vcodec libx264 -acodec libvo_aacenc -preset:v ultrafast -f rtsp rtsp://127.0.0.1/abcd.sdp

设置帧率

代码语言:javascript复制
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上录制摄像头和麦克风都需要申请权限,直接在命令行中获取摄像头和麦克风都会报错,不能推流。 这个折腾了我好长时间才找到原因,网上也没说这种情况的原因,希望看到这个博客的同学别再踩这个坑。

安装

代码语言:javascript复制
brew install ffmpeg

查看设备

代码语言:javascript复制
ffmpeg -f avfoundation -list_devices true -i ""

摄像头录制

需要获取录制权限

代码语言:javascript复制
ffmpeg -y -framerate 30 -f avfoundation -r 30 -i 0 out.mp4

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

flv

代码语言:javascript复制
ffmpeg -y -framerate 30 -f avfoundation -r 30 -i 0 -f flv test01.flv

播放命令:

代码语言:javascript复制
ffplay out.mp4

桌面录制

代码语言:javascript复制
ffmpeg -y -f avfoundation -i "1" -framerate 30 -video_size 640x480 -vcodec libx264 -preset ultrafast -f flv test2.flv

-t 录制时间,单位miao

推流

代码语言:javascript复制
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -f flv rtmp://119.3.212.205:1935/live/xiaoming

桌面 麦克风录制

代码语言:javascript复制
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv mytest.flv

或者

代码语言:javascript复制
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的缩写。

推流

代码语言:javascript复制
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

桌面 麦克风 摄像头录制

代码语言:javascript复制
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

推流

代码语言:javascript复制
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

音频录制

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

播放声音的命令:

代码语言:javascript复制
ffplay out.wav

录制音频裸数据

代码语言:javascript复制
ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm

0 人点赞