功能强大,功能全。linux上不可或缺的多媒体处理软件。可以编解码视频文件,也可以读取视频设备和流媒体文件。现在将以前收藏的一些教程整理发布,方便自己查看。
安装
网上找的大多都是编译安装,原文链接:https://blog.csdn.net/jklinux/article/details/72367829
原作者分享的编码库文件https://pan.baidu.com/s/1ctkhC6 密码:3v49
一.
安装yasm库(有助于提高ffmpeg的编解码效率)
1). 解包yasm-1.3.0.tar.gz
进入yasm-1.3.0目录
2). 执行./configure产生Makefile
3). make && make install
/////////////
安装cmake工具(编译c++源码工程的工具, 编译libx265库用到)
yum install cmake*
安装好后,检查cmake的版本
cmake --version 如果大于3.5.1则不需安装cmake-3.14.5
否则需安装cmake-3.14.5
1). 解包cmake-3.14.5.tar.gz
进入cmake-3.14.5目录
2). 执行./configure产生Makefile
configure完成后, 通过"echo $?"查看执行结果是否成功.
如果不是0,则不成功, 不能作下一步.
3). 执行make && make install
二. 编译h264编解码库
1). 解包last_x264.tar.bz2
进入x264-snapshot-20160319-2245目录
2). 执行"./configure --enable-shared"
// enable-shared 加上编译出动态库的支持
// enable-static 加上编译出静态库的选项
3). make && make install
安装完成后, h264库的头文件在/usr/local/include
动静态库在/usr/local/lib
x264.pc库的配置文件在/usr/local/lib/pkgconfig
三. 编译h265编解码库
1). 解包x265_1.9.tar.gz
进入x265_1.9目录里的build/linux目录
2). 在终端下执行目录下的make-Makefiles.bash脚本文件
执行时会弹出界面选项, 按'c'再按'g'键保存退出
3). make
如出现如下错误信息:
x265_1.9/source/common/param.cpp:55: 错误:‘char* strtok_r(char*, const char*, char**)’先被声明为‘extern’后又被声明为‘static’
修改x265_1.9/source/common/param.cpp的55行, 把"static"关键字去掉
4). make install
h265库的头文件在/usr/local/include
动静态库在/usr/local/lib
x265.pc库的配置文件在/usr/local/lib/pkgconfig
四. 编译ffmpeg库
1). 解包ffmpeg-3.0.tar.bz2
进ffmpeg-3.0目录里
2). 在终端里输入命令: export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
./configure --disable-debug --enable-libx264 --enable-libx265 --enable-gpl --enable-shared
注意查看输出的信息:
enabled program: 是否有ffplay(没有的话,yum install *SDL*, 后再重新configure)
3). make && make install
完成后,便于使用这个库的程序的执行,增加库的路径。
vim /etc/ld.so.conf.d/ffmpeg.conf
写上内容: /usr/local/lib
保存退出后, 再执行:
ldconfig
完成后, 有命令: ffmpeg ffplay
ffmpeg -decoders //列出可用的解码器 H264 H265
ffmpeg -encoders //列出可用的编码器
ffmpeg -devices //列出可支持的设备
使用
原文链接:https://www.jianshu.com/p/ddafe46827b7
常用命令
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量(码率),默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
使用示例
视频格式转换
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
ffmpeg -i "https://vdn.vzuu.com/SD/49c8..." output.mp4
提取音频
ffmpeg -i 晓松奇谈.mp4 -acodec copy -vn output.aac
ffmpeg -i 晓松奇谈.mp4 -acodec aac -vn output.aac
提取视频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
视频剪切
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表示开始切割的时间,-t表示要切多少
码率控制
什么是码率?很简单: bitrate = file size / duration
比如一个文件20.8M,时长1分钟,那么,码率就是:
biterate = 20.8M bit/60s = 20.810241024*8 bit/60s= 2831Kbps
ffmpg控制码率有3种选择,-minrate -b:v -maxrate
-b:v主要是控制平均码率。ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。
-minrate -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
视频编码格式转换
ffmpeg -i input.mp4 -vcodec h264 output.mp4
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
//使用外部编码器
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
只提取视频ES数据
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
改变视频尺寸
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//如果540不写,写成-1,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。
为视频添加logo
ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
抓取视频帧,存为图片
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒几帧
-q:v表示存储jpeg的图像质量,一般2是高质量。
-ss 表示开始时间
-t表示共要多少时间。
-map使用小结
最近碰到多音轨多字幕mkv文件,在emby里播放加载超慢,就转成了mp4文件,然后发现转换个只保留了一条音轨,其它信息都没有了。
例子1:
ffmpeg -i input.mkv \
-map 0:0 -map 0:1 -map 0:1 -map 0:3 \
-c:v copy \
-c:a:0 libmp3lame -b:a:0 128k \
-c:a:1 libfaac -b:a:1 96k \
-c:s copy \
output.mkv
使用“-map 0:0 -map 0:1 -map 0:1 -map 0:3”,我们告诉ffmpeg选择/映射指定的输入流按相应顺序输出。
“-c:a:0”来指定输出的第一路音频流编解码器(codec),且用“-c:a:1”来指定输出的第二路音频流编解码器(codec)
“a:0”指的是输出的第一路音频流(本例中为0:1),“a:1”指的是输出的第二路音频流(也映射到输入流0:1)
例子2:
ffmpeg -i input.mkv -map 0:3 -map 0:2 -map 0:1 -map 0:0 -c copy output.mkv
倒序排列输入流,选项“-c copy”告诉ffmpeg在所有流上使用“复制”操作
例子3:
ffmpeg -i input.mkv -map 0 -c copy -c:v mpeg2video output.mkv
重新编码视频流,但复制所有其他流(如音频、字幕、附件等)
例子4:
ffmpeg -i input.mkv -map 0:1 -map 0:2 -c copy output.mkv
从同一个输入文件中仅提取音频流
例子5:
ffmpeg -i input.mkv -map 0:1 -map 0:2 audios_only.mkv \
-map 0:0 video_only.mkv
使用"-map"命令来创建多路文件输出
例子6:
ffmpeg -i INPUT -filter_complex "[0] scale=100x100[smaller_sized]" -map "[smaller_sized]" out.mp4
使用一个滤镜(filtergraph)做为map参数来控制输出,(不懂)
例子7:
ffmpeg -i input -map 0:v -map 0:a output.mkv
# chooses video and audio from input 0
还有一些流选择快捷方式,比如你也可以使用“0:v”
例子8:
ffmpeg -i input -map 0 output.mp4
# 从一个输入重新编码所有视频和音频通道
ffmpeg -i input -map 0 -c copy output.mp4
# 将所有视频和音频通道从一个输入复制到输出,而不是仅一个视频
字幕添加导出
增加字幕流
ffmpeg -i video.avi -i sub.ass -map 0:0 -map 0:1 -map 1 -c:a copy -c:v copy -c:s copy video.mkv
提取字幕流
1)原始文本输出
ffmpeg -i output.mkv -an -vn -bsf:s mov2textsub -scodec copy -f rawvideo sub.txt
ffmpeg -i output.mkv -an -vn -c:s copy -f rawvideo -map 0:s sub2.txt
2)ass格式输出
ffmpeg -i output.mkv -an -vn -scodec copy sub3.ass
修改mp3文件TAG
基本用法
使用 -metadata 后面跟 = 就可以修改相应的tag了。可以填加多个修改。将tag值置空可以删除 tag。
$ ffmpeg -i track12.mp3 -metadata album="Closer" You\ Raise\ Me\ Up.mp3
$ ffmpeg -i track12.mp3 -metadata album="Closer" -metadata artist="Josh Groban" You\ Raise\ Me\ Up.mp3
$ ffmpeg -i track12.mp3 -metadata genre="" You\ Raise\ Me\ Up.mp3
可见使用 ffmpeg 修改tag是很简单的事,但难的是不知道音乐文件都有什么标签,或者我的音乐文件已经存在哪些标签,Windows上在音乐文件右键查看属性在详细页里有很多属性,iTunes里右键查看也能看到,那么标准的音乐文件都有哪些tag呢:
Windows | iTunes(Info tab) | id3v2.3 | ffmpeg key | ffmpeg 示例 |
---|---|---|---|---|
Title | Title | TIT2 | title | -metadata title=”海阔天空” |
Subtitle | Description(Video tab) | TIT3 | TIT3 | -metadata TIT3=”beyond 20周年纪念版” |
Rating | n/a | n/a | n/a | n/a |
Comments | Comments | COMM | n/a | n/a |
Contributing artists | Artist | TPE1 | artist | -metadata artist=”黄家驹” |
Album artist | Album artist | TPE2 | album_artist | -metadata album_artist=”Josh Groban” |
Album | Album | TALB | album | -metadata album=”Closer” |
Year | Year | TYER | date | -metadata date=”2009” |
# | Track Number | TRCK | track | -metadata track=”3/12”(12首歌中的第3个) |
Genre | Genre | TCON | genre | -metadata genre=”Vocal” |
Publisher | n/a | TPUB | publisher | -metadata publisher=”Heaven Church” |
Encoded by | n/a | TENC | encoded_by | -metadata encoded_by=”Joshua” |
Aythor URL | n/a | WOAR | n/a | n/a |
CopyRight(不可编辑) | n/a | TCOP | copyright | -metadata copyright=”℗ lqsoft” |
Composers | n/a | TCOM | composer | -metadata composer=”Joshua” |
Conductors | n/a | TPE3 | performer | -metadata performer=”Joshua” |
Group description | Grouping | TIT1 | TIT1 | -metadata TIT1=”The Classics” |
Mood | n/a | n/a | n/a | n/a |
Part of set | Disc Number | TPOS | disc | -metadata disc=”1/2” |
Initial key | n/a | TKEY | TKEY | -metadata TKEY=”G” |
Beats-per-minute | BOM | TBPM | TBPM | -metadata TBPM=”120” |
Part of a compilation | Part of a compilation | TCMP | n/a | n/a |
n/a | n/a | TLAN | language | -metadata language=”eng” |
n/a | n/a | TSSE | encoder | -metadata encoder=”iTunes v10” |
进阶使用
1.清除音乐文件所有的tag信息(-map_metadata -1可清除所有metadata信息):
$ ffmpeg -i track12.mp3 -map_metadata -1 out.mp3
2.把音乐文件的metadata信息导出到文件里:
$ ffmpeg -i track12.mp3 -f ffmetadata metadata.txt
可对输出的 metadata.txt 进行修改,完事后重新写入到文件里。ffmetadata文件的格式如下:
;FFMETADATA1
album=专辑
artist=作者
title=标题
album_artist=专辑作者
copyright=hanlei.org
[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=多行\
多行
3.把 metadata.txt 文件写入音乐文件
$ ffmpeg -i track12.mp3 -i metadata.txt -map_metadata 1 -c:a copy -id3v2_version 3 -write_id3v1 1 out.mp3
-map_metadata 1:代表使用输入顺序为1的文件,作为metadata,也就是 metadata.txt,这个数字和 -i的重复的次数有关,从0开始计数。
-c:a codec audio的意思,这里用的是 copy,不写也行,默认值就是。
-id3v2_version 3和-write_id3v1 1是为了对Windows兼容加上的,否则在Windows上会出现问题。
本节参考:https://fooyou.github.io/document/2015/12/03/modify-id3-tags-using-ffmpeg.html
音频转码参数
音频选项:
-ab bitrate 设置音频码率 (128000)
-ar freq 设置音频采样率(16000)
-ac channels 设置通道 缺省为1(1)
-an 不使能音频纪录
-acodec codec 使用codec编解码(pcm_s16le)
示例:
ffmpeg -i input.wma -ac 1 -f s16le -ar 16000 -acodec pcm_s16le output.pcm
图片全成视频
ffmpeg -f image2 -i ./%3d.jpg -vcodec libx264 -r 10 -s 1280x720 test.mp4
图片命名格式“$d”为1,2,3;“$2d”为01,02,03…..
一秒一张图片: -framerate 1
转载请注明:HANLEI'BLOG » ffmpeg安装使用小结