最近项目有ffmpeg相关的处理,特意查了很多资料,总结一下ffmpeg的命令及作用,方便以后查看。
qscale的取值可以是0.01-255但实际使用超过50就很糟糕了ffmpeg的cbr模式可以把码率控制的不错,但是vbr无法限制最高码率(虽然有max的设置,但是程序没有实现)
x264标准的封装是x264+aac in flv或者x264+aac in MP4
接下来说明下ffmpeg命令行的语法规则:
语法规则结构:
ffmpeg [[infile options][`-i’infile]]… {[outfile options]outfile}…
一个最简单的命令形式:
ffmpeg -i input.avi -b 64k output.avi
这个命令把视频以64k的码率重编码。输入文件前面要加一个-i选项
-formats 参数。会显示你机器当前支持的封装、编码、解码器的信息
-y 参数,会指示ffmpeg覆盖输出文件
-fs 指定输出文件大小的限制
-ss 指定开始的时间,和-t的单位一样
-target 直接设定你想要转成的目标格式,所有的相关设置都会采用内设值,当然也你也可以加上自己要修改的参数。可用的选择有:”vcd”, “svcd”, “dvd”, “dv”, “dv50”, “pal-vcd”, “ntsc-svcd”, …
这个例子把视频转换成vcd的格式
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
接下来介绍视频选项:
-b 指定码率注意单位是bit/s,所以我们一般要加k,比如 -b 1000k 就是1000kb/s
-g 设置组的大小
-vframes 指定要编码的帧数,比如-vframes 1 就是编码1帧,截图的时候就这样写.
-r 指定帧率,默认是25
-s 指定图像分辨率,用wxh的格式,比如320×240
-aspect 指定宽高比 可以些16:9这种,也可以写小数比如1.3333
-croptop 指定顶部裁减多少像素,类似的还有
-cropleft -cropright -cropbuttom
-bt 设置比特率容许的误差,默认4000k,在第一阶段时使用这个参数会告诉码率控制器能够偏移平均码率多远,这个选项和最大最小码率无关.设太小了不利于质量
-maxrate 和-minrate 指定允许的最大和最小码率,一般如果要用cbr模式编码的话会用这个:
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v 否则用处不大
-vcodec 强制使用某种编码器
-sameq 使用和源文件相同的质量,这个选项是动态码率的
-pass 指定编码阶段,这个只有1和2,第一阶段的时候应该不处理音频,并且把输出导向空,比如: ffmpeg -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y NULffmpeg -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y /dev/null
-qscale 使用固定量化因子来量化视频这个是在vbr模式的,前面有提到,越小质量越好,不要超过50,相关的参数还有
-qmin –qmax用来设定最大最小可使用的量化值
-qdiff 指定固定量化器因子允许的最大偏差
-qblur 指定量化器模糊系数,可用范围是0.0-1.0越大使得码率在时间上分配的越平均
-qcomp 指定视频量化器压缩系数,默认0.5
-me_method 指定运动估计方法(motion estimation method),可用的选择从垃圾到好排列如下:
zero (0向量)
phods
log
x1
hex
umh
epzs (默认)
full (完全搜索,很慢又好不到哪里去)
-mbd 设定宏模块决策,可用的值:
0 使用mb_cmp,不知道是什么东西,所以这些参数我参考一下mencoder里面的
1 选用需要比特最少的宏块模式
2 选用码率失真最优的宏块模式
-4mv 使用宏块的4个运动向量,只支持mpeg4 -part 使用数据划分,只支持mpeg4
-ilme 强制允许交错的编码,只支持mpeg2和mpeg4,你可以选择用-deinterlace来去交错
音频部分:
-ar 设置采样频率,默认44100hz
-ab 设置比特率,默认64k
-an 禁用音频录制
-acodec 指定音频编码器
从另一个地方copy过来的一些命令
-L 查看许可证
-h 显示说明
-version 显示版本
-formats 显示可用的格式,编解码器,协议…
-f fmt 输出格式
-i filename 输入文件名称
-y 覆盖输出文件
-t duration 设定录音时间
-fs limit_size 设置限制文件大小
-ss time_off 设置开始时间偏移
-itsoffset time_off 设置输入时间偏移
-title string 设置标题
-timestamp time 设定时间戳记
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-album string 设置相册
-v verbose 控制总额日志
-target type 指定的目标文件类型 (“vcd”, “svcd”, “dvd”, “dv”, “dv50″, “pal-vcd”, “ntsc-svcd”, …)
-dframes number 设置数据帧的记录
-scodec codec 强制字幕编码器 (‘copy’ to copy stream)
-newsubtitle 添加一个新的字幕流,以目前的输出流
-slang code 设置ISO 639语言代码(3 字母)目前字幕高级视频设置:
-vframes number 设置视频帧记录
-r rate 设置帧比率(Hz value, fraction or abbreviation)
-s size 设置帧大小 (WxH or abbreviation)
-aspect aspect 设置的长宽比 (4:3, 16:9 or 1.3333, 1.7777)
-croptop size 设置顶端作频率的大小 (in pixels)
-cropbottom size 设置底端作频率的大小 (in pixels)
-cropleft size 设置左端作频率的大小 (in pixels)
-cropright size 设置右端作频率的大小(in pixels)
-padtop size 设置顶端频率的大小 (in pixels)
-padbottom size 设置底部频率的大小(以像素)
-padleft size 设置左频率的大小(以像素)
-padright size 设置右频率的大小(以像素)
-padcolor color 设置颜色的频率(十六进制000000通过ffffff )
-vn 禁用视频
-vcodec codec 强制视频编码器 (‘copy’ to copy stream)
-sameq 使用相同视频质量作为源(implies VBR)
-pass n 选择通过数量(1 or 2)
-passlogfile file 选择两个通过日志文件名称
-newvideo 添加一个新的视频流,以目前的输出高级视频流选项:
-pix_fmt format 设置像素格式
-intra 使用内部帧
-vdt n 放弃起增点
-qscale q 使用固定的视频量化规模(VBR)
-qdiff q 最大值之间的差异量化表(VBR)
-rc_eq equation 设置速率控制方程
-rc_override override 速率控制特定间隔覆盖
-me method 设置运动估计方法
-me_threshold 运动估计起增点
-strict strictness 如何严格按照标准
-deinterlace 反交错图片
-psnr 计算的PSNR压缩帧
-vstats 转储视频编码统计文件
-vhook module 插入视频处理模块
-intra_matrix matrix 指定内部矩阵系数
-inter_matrix matrix 指定跨矩阵系数
-top top=1/bottom=0/auto=-1 场首要
-dc precision 内直流精度
-vtag fourcc/tag 强制视频四字符代码/标记
-qphist 显示 QP 柱形统计图
-vbsf bitstream filter 流过滤器的音频选项:
-aframes number 设置音频帧记录
-ab bitrate 设置音频比特率(在kb的速率/秒)
-aq quality 设定质量的音频质量(编解码器的具体)
-ar rate 设定音频采样率(赫兹)
-ac channels 指定数目的音频通道
-an 禁用音频
-acodec codec 强制音频编码 (‘copy’ to copy stream)
-vol volume 改变声音大小 (256=normal)
-newaudio 增加一个新的音频流到当前输出流
-alang code 设置ISO 639语言代码(3 字母)目前字幕高级音频设置:
-atag fourcc/tag 强制音频四字符代码/标记
-absf bitstream filter 过滤比特流子标题选项
-scodec codec 强制子标题编码(‘copy’ to copy stream)
-newsubtitle 增加一个新的子标题流到当前输出流
-slang code 设置ISO 639语言代码(3 字母)目前字幕音频流/视频抓取设置:
-vd device 设置音频抓取设备
-vc channel 设置视频抓取频道(DV1394 only)
-tvstd standard 设置电视标准 (NTSC, PAL (SECAM))
-ad device 设置音频设备
-grab format 设置抓取用的格式
-gd device 设置高级抓取设备选项:
-map file:stream[:syncfile:syncstream] 设置输入数据流
-map_meta_data outfile:infile 设置中继数据信息从输入文件到输出文件
-benchmark 添加基准时间
-dump 转储每个输入数据包
-hex 当转储数据包时,也转储载重量
-re 在本帧读入。比率
-loop_input 回路(目前只有工程与图片)
-loop_output 多少次循环的输出格式,支持循环( 0循环永远)
-threads count 线程计数
-vsync 视频同步方法
-async 音频同步方式
-vglobal 全球视频头存储类型
-copyts 复制时间戳
-shortest 最快完成输入编码
-dts_delta_threshold转换过程中数据包的大小, 即数据缓冲区的大小按照本意, 数据缓冲区越大转换速度越快, 但这与系统的运行状态有关
-ps size 设置数据包大小
-muxdelay seconds 设定最高解复用器-解码延迟
-muxpreload seconds 设置初始解复用器-解码延迟
首先提现说说一些下面指令的顺序,-t一定要写在inPath后,后多少都行,就是要在后面。
outPath = “image%04d.jpeg”;
com = new String[]{“ffmpeg”, “-y”, “-i”, InPath, “-strict”, “experimental”, “-r”, “1”, “-ss”, “00:00:00”, “-t”, durationTime, outPath};
(-acodec aac 是ffmpeg自制的AAC编码器,处在实验阶段,需要开启”-strict experimental”参数,可以加可以不加)
inpath是你的视频地址,注意地址是要写到视频名称才算,不是文件夹地址,是文件地址,outpath同理也要写到图片名称。
-r,1:代表每一秒取一帧做为图片
时间要00:00:00这样的格式
-t,durationTime:这个是从-ss开始算时间,向后播放多少时长,不是说你到durationTime这个时间,而是延长多少时间。
最后取图片:
List
for (int i = 1; i <= duration; i++) {
imageList.add(BitmapFactory.decodeFile(String.format(outPath, i)));
}
获取某一帧的图片,其实就是把开始时间和结束时间改改就行了。
com = new String[]{“ffmpeg”, “-ss”, startSecTime, “-t”, stopSecTime, “-i”, path, “-acodec”, “copy”, “-vcodec”, “copy”, desPath};
这个就比较简单的剪切了,视频音频都是用从copy,时间要用00:00:00格式,其他没什么说的了
,地址都要写到视频文件名称。
合并视频最好两个视频格式一样,如果不一样就先转换:
1). 首先将各个视频全部转换为mpeg格式:
com = new String[]{“ffmpeg”, “-i”, path,”-f”,”mpeg” ,”-acodec”, “copy”, “-vcodec”, “copy”, desPath};
-f是想要转换从什么格式的视频,avi,mp4,mpeg等。地址最好用个cache文件夹装这些临时的视频,合并完以后删除节省空间。
2). 通过命令合并视频:
ffmpeg -i D:/MyVideo1.avi -i D:/MyVideo2.avi -f mp4 -acodec libfaac -vcodec libx264 -sameq D:/Result.avi
com = new String[]{“ffmpeg”, “-i”, path1, “-i”, path2,”-f”,”mpeg” ,”-acodec”, “copy”, “-vcodec”, “copy”,”-sameq”,desPath};
acodec的参数可以是libfaac,不过听说已经废弃了,vcodec参数可以是libx264,这个比较常用。
现在是两段视频合并,如果更多视频,就多写几个-i加视频地址就好了,都会合并到desPath的。