前言
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