最新消息:重新回归WordPress,我要比较认真的开始更新我的博客了。

ffmpeg安装使用小结

杂七杂八 hanlei 2041浏览

功能强大,功能全。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安装使用小结