ffmpe 1 命令行操作概述

ffmpeg工具包含 ffmpeg ffprobe和ffplayer,此处归纳总结前两个的常用用法,对于ffplayer 本文不加叙述。

ffmpeg 音视频处理工具

ffprobe 音视频分析工具,分析指定音视频的格式,

ffplayer 音视频播放工具

本文工具所运行的环境均为Linux环境。

本文主要解析ffmpeg的操作,ffprobe简要叙述

一 ffprobe

1.命令格式

ffprobe [options] [input_url]

options:

要操作的选项,如果时查询ffprobe的信息,则后面input_url可以为空

input_url

要分析的视频对象,可以是一个视频播放地址,也可以是一个文件名

2.查看当前ffprobe信息

-L 显示当前ffprobe的license

-h 显示帮助信息

-h [arg] 显示指定的帮助信息

arg

decoder=name 显示指定的解码器信息

encoder=name 显示指定的编码器信息

demuxer=name 显示指定的解封装格式信息

muxer=name 显示指定的封装格式信息

filter=name 显示指定的滤镜信息

bsf=name 显示指定的流过滤器信息

protocol=name 显示指定的网络协议信息

-version 显示指定的版本信息

-formats 显示当前支持的格式

-demuxers 显示当前支持的编码器

-muxers 显示当前的编码器

-devices 显示当前可用的设备

-codecx 显示当前支持的编码器

-decoders 显示当前可用的解码器

-bsfs 显示当前可用的流过滤器

-protocols 显示当前支持的网络协议

-filters 显示当前的滤镜

-pix_fmts 显示当前知道hi的像素格式

-samples 显示当前支持的采样率

-layouts 显示当前支持的通道名称和通道布局

3.查看音视频信息

-f format 强制使用指定的format去分析视频

-unit 显示当前所显示值的单位

-prefix 对显示的值使用SI前缀。除非使用了“-byte_binary_prefix”选项,否则所有前缀都是十进制的。

-byte_binary_prefix 强制使用二进制前缀显示字节值

-sexagesimal 使用sexagesimal格式显示时间值HH:MM:SS.MICROSECONDS

-pretty 优化当前显示值得格式,它对应于选项“-unit -prefix -byte_binary_prefix -sexagesimal”。

-of -print_format writer_name 以指定格式去打印数据,入-print_format jason

-sections 打印结构和机构信息,然后推出。输出并不意味着由机器进行解析

-select_streams stream_specifier 仅选择stream_specifier指定的流。这个选项只影响与流相关的选项(例如show_streams, show_packet等)。

-show_data 以十六进制和ASCII转储的形式显示有效负载数据

-show_data_hash algorithm 显示当前负载数据得哈希值,对packets要带上-show_packets,对编码extradata,要带上-show_streams

-show_format 显示当前视频格式

-show_packets 显示每个数据包得信息,

-show_frames 显示每个数据帧得具体信息

-show_streams 显示数据流得信息

-show_programs 显示包含在多媒体流中的程序信息和数据流

-show_chapters 显示格式中的每个存储章节的信息

-show_private_data 显示私有数据,这些数据取决于当先展示的元素格式, 这个选项默认被使能,但是你需要关闭它对于一些特殊的使用,例如当创建XSD-compliant XML的输出时

-i 读取输入,可以是一个文件路径,或者一个视频的url

二 ffmpeg

1.命令格式

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

global_options :全局变量

input_file_options :针对输入文件的选项

input_url:输入的多媒体文件,可以是一个文件的绝对/相对路径,也可以是一个URL,输入文件前用 -i 来标识这是输入文件

output_file_options :针对输出文件的选项

out_url:输出文件的路径,可以是一个绝对/相对路径,也可以是一个URL

 

2.滤镜

图示如下:

1.简单滤镜

一个简单的滤镜流程如下:

decoded frames ----(simple filtergraph)---->filtered frames----(encoder)---->encoded data packets

简单滤镜在使用是使用 -filter选项

2. 复杂滤镜流程

 

复杂滤镜在使用时使用 -fileter-complex

2.流的复制

流程如下:

 

流的复制时使用 -copy选项后面跟上指定的参数

3.流的选择

ffmpeg 使用-map选项来手动选择要输出到输出文件中的文件流。同样的,也可以跳过-map选项,使用-vn/-an/-sn/-dn选项来跳过视频/音频/字幕/数据流。

1.自动选择

当未使用选项时,ffmpeg会自动选择合适的选项

  • 对与视频流,自动选择最高分辨率的视频流
  • 对于音频流,自动选择通道数最多的视频流
  • 对于字幕,这是找到的第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本或基于图像的,并且只会选择相同类型的字幕流

2.手动选择

使用-map时,该输出文件中仅包含用户映射的流,

3.示例

数据源:

input file 'A.avi'
    stream 0: video 640x360
    stream 1: audio 2 channels 
input file 'B.mp4'
    stream 0: video 1920x1080
    stream 1: audio 2 channels
    stream 2: subtitles (text)
    stream 3: audio 5.1 channels
    stream 4: subtitles (text) 
input file 'C.mkv'
    stream 0: video 1280x720
    stream 1: audio 2 channels
    stream 2: subtitles (image)

 

自动选择视频源:

ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

此处有三个输出文件

对于输出文件out1.mkv,该格式是一个Matroska容器,可以接收视频,音频和字母数据。此时ffmpeg自动为该容器选择每种格式的最合适的数据流。视频,选择B.mp4中的stream 0,此路视频流在输入中的所有数据流中分辨率最高;音频,选择B.mp4中的stream 3,此路音频流在所有数据流中通道数最多;字幕,选择B.mp4的stream 2,此路字幕流是输入中解析到的第一路字幕流

对于输出文件out2.wav,他只接受音频流,因此选择了通道数最多的B.mp4中的stream 3 输出到该文件中。

对于输出文件out3.mov,因为有一个-map 1:a 选项,因此会选择B.MP4中所有的音频流文件到该输出文件中

对于前两个输出文件,所有数据流都会被重新编码,编码器由ffmpe选择对应格式的默认编码器。对于输出文件3,由于有

-c:a copy,因此不会有重编码操作,该音频流会直接拷贝

 

自动/手动选择字幕源

ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

尽管mkv容器能接受字幕信息,但是由于它只接受基于text格式的字幕,而C.mkv中的字幕是基于image的,因此在ou1.mkv中默认不会输出字幕。对于out2.mkv 由于有选项 -c:s 因此字幕数据流仍会被输出到该文件中,同时由于设置了选项 -an,因此在该文件汇总不会存在音频流

 

无标签的滤镜输出

 

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

此处使用了一个“overlay”滤镜,该滤镜要求至少有两路输入视频流,因为没有指定视频输入,因此两路视频流均会被使用到。由于过滤器没有标签,因此会被用于out1.mp4。

 

有标签的滤镜输出

 

4 操作

1.流说明符

一些选项被用于每一个流,如二进制流和编码器。流说明符用于精确指定得每一路数据流得属性。流说明符是一个字符串,通常来说附加在操作选项得名字后用一个冒号隔开。如 -codec:a:1 ac3 包含了a:1流说明符。另一方面,一个流说明符也可以匹配多个数据流,如 -b:a 128k指定了所有得音频数据流。如 -codec copy将应用与所有得数据流。

可能用到得流说明符如下:

stream_index:

数据流得序号。用指定得序号来匹配数据流。

stream_type:

流得类型,如a代表音频 v或V代表视频(v匹配所有得视频流V只匹配不携带艺术封面或图片得视频流),s代表字幕等

p:program_id:

匹配程序中id为program_id的shu'ju'liu

#stream_id 或者i:stream_id:

通过id来匹配数据流

2.通用选项

此处通用选项针对所有ffmpeg工具,可参考ffprobe

3.音视频选项

这些选项由libavformat,libavdevice和libavcodec来提供,如果需要查询具体可用的选项,可以通过 -help 来查看。这些选项大致可分为两类:

generic:

这些选项可以用于所有的容器,设备和编码。常规选项在容器/设备的AVFormatContext选项下和编解码器的AVCodecContext选项下列出

private:

和通用选项相同,可以用于容器设备和编码。专用选项在其相应的容器/设备/编解码器下列出。

如将MP3的头由ID3v2.3改为ID3V2.4

ffmpeg -i input.flac -id3v2_version 3 out.mp3

所有的音视频选项都是按流来操作的,因此需要将他们匹配到每一个流

ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4

在上面的示例中,多通道音频流被映射两次以进行输出。第一个实例使用编解码器ac3和比特率640k进行编码。第二个实例降混到2个通道,并使用编解码器aac进行编码。使用输出流的绝对索引为其指定了128k的比特率。

4.主要选项

-f fmt 对输出/输出用指定的fmt格式来解析

-i url 指定输入文件的url

-y 覆盖输出文件不需要询问

-n 输出文件不要覆盖已经存在的文件,若输出的文件已经存在,则立即推出

-stream_loop number 设定输入数据流的循环次数,0待变不循环,-1待变

-codec[:stream_sercifier]

-c[:stream_sercifier] 只当编码器,针对的每一路数据流 如果不需要更改格式,后面可使用copy参数

ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

ffmpeg -i INPUT -map 0 -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

-t duration 当用作输入选项时(-i之前),请限制从输入文件读取数据的持续时间

当用作输出选项时(在输出URL之前),请在持续时间达到持续时间后停止写入输出

duration必须是一个持续时间规范

-fs limit_size 设置输出文件的大小

-ss position 对于输入,如果在-i 之前对于输入文件,在poiont之前的部分被丢弃,对于输出文件,在point之前的部分,

解码但是丢弃数据

-itsscale scale 重新调整输入时间戳。标度应为浮点数

-timestamp date 设置记录的时间戳

-metadata[:metadata_specifier] key=value 设置元数据键值对可以提供可选的metadata_specifier来设置流,章节或程序上

的元数据。有关详细信息,请参见-map_metadata文档。此选项将覆盖使用-map_metadata设置的元数据。也可以通过使用空值来删除元数据。

ffmpeg -i in.avi -metadata title="my title" out.flv

-disposition[:stream_specifier] value 设置流的处置,此选项将覆盖从输入流复制的处置。通过将其设置为0,也可以删除

该处置。以下的选项将被识别:

default

dub

original

comment

lyrics

karaoke

forced

hearing_impaired

visual_impaired

clean_effects

attached_pic

captions

descriptions

dependent

metadata

将第二路码流设置为默认码流ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv

将第二路字幕设置为默认字幕,并取消第一路字幕的默认配置

ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv

-dn 作为输入选项时,阻止所有的数据流被过滤或被自动选择为输出。如果需要手动禁止某一轮数据流,参考-

discard的用法;作为输出时,禁止数据记录

-dframes number 设置要输出的数据帧的数量

-q[:stream_apecifier] q

-qscale[:stream_apecifier] q 使用固定质量量表(VBR)。 q / qscale的含义取决于编解码器。如果在不使用

 

5.视频选项

-vFrames number 设置要输出的数据帧的数量

-s[:stream_specifier] size 设置数据帧的大小,作为输入选项时这是video_size私有选项的快捷方式,已被某些多路分解器

识别,其帧大小未存储在文件中或可配置;作为输出选项时,这将会对视频做一个裁剪滤镜并输

出到结果中

-r[:stream_specifier] fps 设置帧率

-aspect[:stream_specifier] aspect 设置播放的纵横比 如设置16:9或者1.7777都是合法的

-vn 作为输入选项,阻止文件的所有视频流被过滤或为任何输出自动选择或映射

-vcodec codec 设置视频编码器和-c:v 以及-codec:v作用相同

-vf filtergraph 设置视频滤镜

-autorotate 设置视频源的自动旋转

-autoscale 设置自动裁剪

6.音频选项

-aframes number 设置要输出的音频帧数量

-ar[:stream_specifier] freq 设置音频的采样率适用于输入和输出

-aq q 设置音频的质量(特定编码器的vbr)

-ac[:stream_specifier] 设置音频通道数

-an 作为输出时,禁止所有音频流,作为输出时,禁止所有的音频记录

-acodec codec 指定编码器,和-codec:a以及-c:a含义相同

-sample_fmt[:stream_specifier] sample_fmt 指定音频格式,可以使用 -sample_fmt来获取当前支持的格式列表

-af filtergraph 指定音频滤镜

7.字幕选项

-scodec codec 设置编码器,和-codec:s以及-c:s作用相同

-sn 作为输出,禁止所有的字幕流,作为输出时,禁止所有的字幕流记录

-sbsf bitstream_filter 不推荐使用,参考-bsf

知乎

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值