前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FFmpeg常用操作

FFmpeg常用操作

作者头像
码客说
发布2019-10-21 17:15:52
3.3K0
发布2019-10-21 17:15:52
举报
文章被收录于专栏:码客

前言

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

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

相关地址

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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Yum安装
  • 官方编译
  • 自己编译
  • 参数
    • 常用参数
      • 通用参数
        • 视频参数
          • 音频参数
          • 通用命令
            • 压缩视频
              • 获取封面
                • 视频文件推流
                  • 拉流保存文件
                    • 转流(rtsp转rtmp)
                      • 抽取音频流
                        • 抽取视频流
                          • 转格式
                            • 音视频合并
                              • 添加水印
                              • WIN音视频操作
                                • 获取设备名称
                                  • 摄像头录制
                                    • 摄像头+麦克风
                                      • 桌面录制
                                        • 桌面+麦克风
                                          • 桌面+系统声音
                                            • 桌面+摄像头+麦克风
                                              • 推RTSP流
                                              • MAC音视频操作
                                                • 安装
                                                  • 查看设备
                                                    • 摄像头录制
                                                      • 桌面录制
                                                        • 桌面+麦克风录制
                                                          • 桌面+麦克风+摄像头录制
                                                            • 音频录制
                                                              • 录制音频裸数据
                                                              相关产品与服务
                                                              云直播
                                                              云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
                                                              领券
                                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档