FFmpeg工具

FFmpeg工具,第1张

ffmpeg在做音视频编解码时非常方便,所以很多场景下转码使用的是ffmpeg,通过ffmpeg –-help可以看到ffmpeg常见的命令大概分为六部分:

命令格式如下:

下面罗列一些ffmpeg常用的信息查询命令:

1、查询版本信息

2、ffmpeg查询是否支持对应的视频文件格式

使用ffmpeg转吗,有时候可能会遇到无法解析的视频文件或者无法生成视频文件,报错提示不支持生成对应的视频文件,这时候就需要查看当前使用的ffmpeg是否支持对应的视频文件格式,需要使用ffmpeg -formats参数来查看:

根据上面输出的信息可以看到,输出的内容分为3个部分,具体如下。

输出信息中包含了三部分内容,具体如下。

输出信息的内容分为四列,具体如下。

从输出的帮助信息中可以看到,FLV的muxer的信息包含两大部分,具体如下。

从输出的帮助信息可以看到,FLV的demuxer的信息包含两大部分:

从帮助信息可以看到,H.264(AVC)的编码参数包含两大部分,具体如下。

从帮助信息可以看到,H.264(AVC)的解码参数查看包括两大部分,具体如下:

从帮助信息可以看到,colorkey滤镜查看信息包含两大部分,具体如下。

ffmpeg的封装转换(转封装)功能包含在AVFormat模块中,通过libavformat库进行Mux和Demux *** 作;多媒体文件的格式有很多种,这些格式中的很多参数在Mux与Demux的 *** 作参数中是公用的,下面来详细介绍一下这些公用的参数。

通过查看ffmpeg --help full信息,找到AVFormatContext参数部分,该参数下的所有参数均为封装转换可使用的参数。下表列出了ffmpeg AVFormatContext的主要参数及说明。

这些都是通用的封装、解封装 *** 作时使用的参数,后续章节中介绍转封装 *** 作、解封装 *** 作、封装 *** 作时,上述参数可以与对应的命令行参数搭配使用。

ffmpeg编解码部分的功能主要是通过模块AVCodec来完成的,通过libavcodec库进行Encode与Decode *** 作。多媒体编码格式的种类有很多,但是还是有很多通用的基本 *** 作参数设置,下面来详细介绍这些公用的参数。

通过命令ffmpeg --help full可以看到AVCodecContext参数列表信息。该选项下面的所有参数均为编解码可以使用的参数。

ffmpeg还有一些更细化的参数,本节中并未详细提及,可以根据本节中提到的查看方法查看ffmpeg的帮助文件以查看更多的内容,本节中介绍的是重点及常用的通用参数,后续章节中介绍编码 *** 作时,上述参数可以配合对应的例子使用。

ffmpeg工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg常用于进行转码 *** 作,使用ffmpeg转码的主要原理如图

通过之前介绍的参数,可以设置转码的相关参数,如果转码 *** 作频涉及封装的改变,则可以通过设置AVCodec与AVFormat的 *** 作参数进行封装与编码的改变,下面示例:

从输出信息中可以看到,以上输出的参数中使用了前面介绍过的参数,具体如下。

在 FFmpeg套件中,除了ffmpeg作为多媒体处理工具之外,还有ffprobe多媒体信息查看工具,ffprobe主要用来查看多媒体文件的信息,下面就来看一下ffprobe中常见的基本命令。

usage: ffprobe [OPTIONS] [INPUT_FILE] the other

ffprobe常用的参数比较多,可以通过ffprobe --help来查看详细的帮助信息。

这些输出的帮助信息既是ffprobe常用的 *** 作参数,也是ffrpobe的基础参数。例如查看log,查看每一个音频数据包信息或者视频数据包信息,查看节目信息,查看流信息,查看每一个流有多少帧以及每一个流有多少个音视频包,查看视频像素点的格式等。下面就来根据以上的输出参数重点列举几个例子。

1)使用下面的命令,查看多媒体数据包信息:

通过show_packets查看的多媒体数据包信息使用PACKET标签括起来,其中包含的信息主要如下:

2)除了以上字段和信息之外,还可以通过如下的组合参数来查看包中的具体数据:

和上面的比起来多了一个data字段,具体如下

[PACKET]

codec_type=video

stream_index=0

pts=379904

pts_time=24.733333

dts=379904

dts_time=24.733333

duration=512

duration_time=0.033333

size=2010

pos=3272564

flags=__

data=

00000000: 0000 07d6 419a cc21 3ffa 5800 0031 9893 ....A..!?.X..1..

00000010: d7e7 0641 039b 27c5 e0f8 5175 1abc 0e4f ...A..'...Qu...O

00000020: d710 f401 3224 0093 a2e5 c07e 9c30 0003 ....2$.....~.0..

略过一大段数据

00000770: 1ebe 840a 5ac2 4f9a 614c 5697 8eab fef8 ....Z.O.aLV.....

00000780: 0b59 9647 cc6d 8a4b f8c0 89e8 798e f569 .Y.G.m.K....y..I

00000790: 2aca ec22 e1f5 d2e5 31b1 010e 7725 e127 *.."....1...w%.'

000007a0: c5f4 7051 f07b 8449 649f 3fab 6a3d 3913 ..pQ.{.Id.?.j=9.

000007b0: d9e4 bdd6 0f22 fa77 2b32 35f5 f4f7 5393 .....".w+25...S.

000007c0: 1c9d fe72 1550 ba41 c774 5031 96d5 aef5 ...r.P.A.tP1....

000007d0: f1b9 77a7 ad54 0800 010f ..w..T....

[/PACKET]

从输出的内容中可以看到多媒体包中包含的数据,那么我们可以根据上述输出内容中的pos,也就是文件偏移位置来查看,pos的值为3272564,将其转换为十六进制位置为0x31EF74,这就是这个包在flv文件中的偏移量,可以使用Linux下的xxd 1.mp4命令进行查看:

0031ef70: 0000 000e 0000 07d6 419a cc21 3ffa 5800 ........A..!?.X.

0031ef80: 0031 9893 d7e7 0641 039b 27c5 e0f8 5175 .1.....A..'...Qu

0031ef90: 1abc 0e4f d710 f401 3224 0093 a2e5 c07e

0031efa0: 9c30 0003 389a 06b7 f211 fb06 362c 95a9 .0..8.......6,..

0031efb0: 0020 8f32 e280 6773 015e 78d2 87a3 e114 . .2..gs.^x.....

0031efc0: f3b3 9d2d ffd7 b202 2233 923f 3d42 bc7f ...-...."3.?=B..

可以看到从0x31EF74开始的数据和上面一致:0000 07d6 419a cc21 3ffa 5800。

通过ffprobe读取packets来进行对应的数据分析,使用show_packets与show_data配合可以进行更加精确的分析。

3)除了packets与data之外,ffprobe还可以分析多媒体的封装格式,其使用FORMAT标签括起来显示:

[FORMAT]

filename=1.mp4

nb_streams=2

nb_programs=0

format_name=mov,mp4,m4a,3gp,3g2,mj2

format_long_name=QuickTime / MOV

start_time=0.000000

duration=25.704000

size=3307949

bit_rate=1029551

probe_score=100

TAG:major_brand=isom

TAG:minor_version=512

TAG:compatible_brands=isomiso2avc1mp41

TAG:encoder=Lavf55.33.100

[/FORMAT]

下面是对输出信息关键字段的说明:

4)使用下面的命令可以查看视频文件的帧信息,输出的帧信息将使用FRAME标签括起来:

[FRAME]

media_type=video

stream_index=0

key_frame=1

pts=0

pts_time=0.000000

pkt_dts=0

pkt_dts_time=0.000000

best_effort_timestamp=0

best_effort_timestamp_time=0.000000

pkt_duration=512

pkt_duration_time=0.033333

pkt_pos=22995

pkt_size=1888

width=720

height=1280

pix_fmt=yuv420p

sample_aspect_ratio=N/A

pict_type=I

coded_picture_number=0

display_picture_number=0

interlaced_frame=0

top_field_first=0

repeat_pict=0

color_range=tv

color_space=bt709

color_primaries=bt709

color_transfer=bt709

chroma_location=left

[/FRAME]

通过-show-frames参数可以查看每一帧的信息,下面就来介绍一下其中重要的信息,

在Windows下常用的Elecard StreamEye工具中打开查看MP4时,会很直观地看到帧类型显示,用ffprobe的pict_type同样可以看到视频的帧是I帧,P帧或者B帧;每一帧的大小同样也可以通过ffprobe的pkt_size查看到。

5)通过-show_streams参数可以查看到多媒体文件中的流信息,流的信息将使用STREAM标签括起来:

[STREAM]

index=0

codec_name=h264

codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10

profile=Main

codec_type=video

codec_tag_string=avc1

codec_tag=0x31637661

width=720

height=1280

coded_width=720

coded_height=1280

closed_captions=0

film_grain=0

has_b_frames=0

sample_aspect_ratio=N/A

display_aspect_ratio=N/A

pix_fmt=yuv420p

level=42

color_range=tv

color_space=bt709

color_transfer=bt709

color_primaries=bt709

chroma_location=left

field_order=progressive

refs=1

is_avc=true

nal_length_size=4

id=0x1

r_frame_rate=30/1

avg_frame_rate=30/1

time_base=1/15360

start_pts=0

start_time=0.000000

duration_ts=388608

duration=25.300000

bit_rate=964695

max_bit_rate=N/A

bits_per_raw_sample=8

nb_frames=759

nb_read_frames=N/A

nb_read_packets=N/A

extradata_size=39

DISPOSITION:default=1

DISPOSITION:dub=0

DISPOSITION:original=0

DISPOSITION:comment=0

DISPOSITION:lyrics=0

DISPOSITION:karaoke=0

DISPOSITION:forced=0

DISPOSITION:hearing_impaired=0

DISPOSITION:visual_impaired=0

DISPOSITION:clean_effects=0

DISPOSITION:attached_pic=0

DISPOSITION:timed_thumbnails=0

DISPOSITION:captions=0

DISPOSITION:descriptions=0

DISPOSITION:metadata=0

DISPOSITION:dependent=0

DISPOSITION:still_image=0

TAG:language=und

TAG:handler_name=VideoHandler

TAG:vendor_id=[0][0][0][0]

[/STREAM]

如以上输出内容所示,从中可以看到流的信息,具体属性及说明如下表

fprobe 使用前面的参数可以获得key-value格式的显示方式,但是阅读起来因为习惯不同,可能有的人会认为方便,有的人认为不方便;如果要进行格式化的显示,这样就需要用到ffprobe -print_format 或者 ffprobe -of 参数来进行相应的格式输出,而-print_format 支持多种格式输出,包括XML,INI,JSON,CSV,FLAT等。下面列举几种常见的格式输出的例子

<?xml version="1.0" encoding="UTF-8"?>

<ffprobe>

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':

Metadata:

major_brand : isom

minor_version : 512

compatible_brands: isomiso2avc1mp41

encoder : Lavf55.33.100

Duration: 00:00:25.70, start: 0.000000, bitrate: 1029 kb/s

Stream #0:0 0x1 : Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 720x1280, 964 kb/s, 30 fps, 30 tbr, 15360 tbn (default)

Metadata:

handler_name: VideoHandler

vendor_id : [0][0][0][0]

Stream #0:1 0x2 : Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 72 kb/s (default)

Metadata:

handler_name: SoundHandler

vendor_id : [0][0][0][0]

<streams>

<stream index="0" codec_name="h264" codec_long_name="H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10" profile="Main" codec_type="video" codec_tag_string="avc1" codec_tag="0x31637661" width="720" height="1280" coded_width="720" coded_height="1280" closed_captions="0" film_grain="0" has_b_frames="0" pix_fmt="yuv420p" level="42" color_range="tv" color_space="bt709" color_transfer="bt709" color_primaries="bt709" chroma_location="left" field_order="progressive" refs="1" is_avc="true" nal_length_size="4" id="0x1" r_frame_rate="30/1" avg_frame_rate="30/1" time_base="1/15360" start_pts="0" start_time="0.000000" duration_ts="388608" duration="25.300000" bit_rate="964695" bits_per_raw_sample="8" nb_frames="759" extradata_size="39">

<disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>

<tag key="language" value="und"/>

<tag key="handler_name" value="VideoHandler"/>

<tag key="vendor_id" value="[0][0][0][0]"/>

</stream>

<stream index="1" codec_name="aac" codec_long_name="AAC (Advanced Audio Coding)" profile="LC" codec_type="audio" codec_tag_string="mp4a" codec_tag="0x6134706d" sample_fmt="fltp" sample_rate="44100" channels="2" channel_layout="stereo" bits_per_sample="0" id="0x2" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/44100" start_pts="0" start_time="0.000000" duration_ts="1133511" duration="25.703197" bit_rate="72863" nb_frames="1107" extradata_size="2">

<disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>

<tag key="language" value="und"/>

<tag key="handler_name" value="SoundHandler"/>

<tag key="vendor_id" value="[0][0][0][0]"/>

</stream>

</streams>

</ffprobe>

从输出的内容可以看到,输出的内容格式为XML格式,如果原有的业务本身就可以解析XML格式,那么就不需要更改解析引擎,直接将输出内容输出为XML格式即可,解析引擎解析Packet信息是会更方便。

输出INI格式:

输出FLAT格式:

输出JSON格式:

输出CSV格式:

通过各种格式的输出,可以使用对应的绘图方式绘制出可视化图形。

CSV格式输出后可以使用Excel打开表格形式

可以在命令行中自行输出,输出的frame信息全部为视频相关的信息。

使用ffprobe还可以查看很多信息,我们可以通过本节介绍的help方法查看更多更详细的信息

在FFmpeg中通常使用ffplay作为播放器,其实ffplay同样也可作为很多音视频的图形化分析工具,通过ffplay可以看到视频图像的运动估计方向、音频数据的波形等,以下将介绍更多参数并举例说明。

1)ffplay常用参数

ffplay不仅仅是播放器,同时也是测试ffmpeg的codec引擎、format引擎,以及filter引擎的工具,并且还可以进行可视化的媒体参数分析。其可以通过ffplay --help进行查看:

Simple media player

usage: ffplay [options] input_file

Main options:

-L show license

-h topicshow help

-? topicshow help

-help topic show help

--help topicshow help

-versionshow version

-buildconf show build configuration

-formatsshow available formats

-muxers show available muxers

-demuxers show available demuxers

-devicesshow available devices

-codecs show available codecs

-decoders show available decoders

-encoders show available encoders

-bsfs show available bit stream filters

-protocols show available protocols

-filtersshow available filters

-pix_fmts show available pixel formats

-layoutsshow standard channel layouts

-sample_fmtsshow available audio sample formats

-dispositions show available stream dispositions

-colors show available color names

-loglevel loglevel set logging level

-v loglevel set logging level

-report generate a report

-max_alloc bytesset maximum size of a single allocated block

-sources device list sources of the input device

-sinks device list sinks of the output device

-x widthforce displayed width

-y height force displayed height

-s size set frame size (WxH or abbreviation)

-fs force full screen

-an disable audio

-vn disable video

-sn disable subtitling

-ss pos seek to a given position in seconds

-t duration play "duration" seconds of audio/video

-bytes val seek by bytes 0=off 1=on -1=auto

-seek_interval seconds set seek interval for left/right keys, in seconds

-nodisp disable graphical display

-noborder borderless window

-alwaysontopwindow always on top

-volume volume set startup volume 0=min 100=max

-f fmt force format

-window_title window title set window title

-af filter_graphset audio filters

-showmode mode select show mode (0 = video, 1 = waves, 2 = RDFT)

-i input_file read specified file

-codec decoder_name force decoder

-autorotate automatically rotate video

这只是Main options里面的部分,另外还有Advanced options,AVCodecContext AVOptions等等很多内容。就上述帮助信息的输出所示,有些是前面已经介绍过的参数,这里就不再一一赘述,一些未介绍的参数说明见下表

常见参数可以手动进行尝试,下面列举几个示例。

*如果希望从视频的第5秒开始播放,播放5秒钟的文件,则可以使用如下命令

*如果希望视频播放时播放器的窗口显示标题为自定义标题,则可以使用如下命令

*如果希望使用ffplay打开网络直播流,则可以使用如下命令:

可以看出ffplay可以支持的协议有多种,ramp,rtmp,http等等都支持。

显示如下窗口内容

下面将这些参数与前面介绍过的一些参数进行组合,举几个例子。

1⃣️从10秒播放一个视频,播放时长为5秒,播放完毕后自动退出ffplay,播放器的窗口标题为“Hello World”,为了确认播放时长正确,可以通过系统命令time查看命令运行时长:

可以看到输出结果如下:

ffplay -window_title "Hello World" -ss 10 -t 5 -autoexit 1.mp4 0.94s user 0.52s system 22% cpu 6.502 total

2⃣️如果强制使用H.264解码器解码MPEG4的视频,将会报错

我们这个视频是h264编码,所以可以正常播放。

查看视频编码可以使用

查看ffmpeg支持的解码格式

下面这个方式解码就会报错

前面举过的例子中,我们看到的比较多的是单节目的流,多节目的流,常用于广电行业的视频。当视频中出现多个Program时,播放Program与常规的播放方式有所不同,需要指定对应的流,可以通过vst,ast,sst参数来指定,例如希望播放Program 13中的音视频流,视频编号为4,音频编号为5,则可以通过如下命令进行制定:

有条件的朋友可以自己找视频来查看。

3⃣️如果使用ffplay播放视频时希望加载字幕文件,则可以通过加载ASS或者SRT字幕文件来解决,下面列举一个加载SRT字幕的例子,首先编辑SRT字幕文件,内容如下:

1

00:00:01.000 -->00:00:05.000

这是我 我是谁

2

00:00:05.001 -->00:00:10.000

我爱中国

3

00:00:10.001 -->00:00:15.000

为人民服务

4

00:00:18.001 -->00:00:20.000

疫情早日结束,国泰民安!

然后通过filter将字幕文件加载到播放数据中,使用命令如下:

播放的效果如下:

可以看出,视频中已经将SRT格式的文字字幕加入到视频中并展现了出来。

2)ffplay的数据可视化分析应用

使用ffplay除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如播放音频文件时,如果不确定文件的声音是否正常,则可以直接使用ffplay播放音频文件,播放的时候其将会把解码后的音频数据以音频波形的形式显示出来,

命令行执行后的效果如下:

从图中可以看到,音频播放时的波形可以通过振幅显示出来,可以用来查看音频的播放情况。

当播放视频时想要体验解码器是如何解码每个宏块的,可以使用如下命令

新版FFmpeg此方法已经不再支持啦,可参考

https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors

我们可以使用ffmpeg或者ffplay来分析视频文件中的运动向量。ffmpeg的早期版本(2017年10月之前)也允许分析宏块,但此选项已被删除。

'codecview'过滤器可用于将运动向量显示为每个宏块的小箭头。它采用一个叫mv的选项,它指定了要绘制的运动向量的类型:

你可以使用如下的命令

第一条命令是直接用ffplay显示视频。

第二条命令是把生成的带有运动向量的视频保存到output.mp4中。

显示效果如下:

在你的转码命令里面添加上-vf rotate=PI/2或者-vf rotate=3*PI/2,例如

ffmpeg -i E:\ffmpeg\test.mp4 -y -vf rotate=PI/2 E:\ffmpeg\dest1.mp4

批量给视频加水印的方法,支持文字水印和图片水印的批量添加:

步骤1,下载软件工具后安装打开,选择左边的【视频水印】功能后,再点击左上角的【添加文件】按钮,将视频导入到软件中,可以同时添加多个视频批量加水印。

步骤2,接下来是设置的环节,水印类型选择“图片类型”;然后上传logo图片;再设置logo水印的缩放比例、透明度、位置以及边距参数。可以在上方预览水印的样式,点击可以放大预览。

步骤3,设置添加水印后视频的输出目录(保存到哪个文件夹),再点击【开始转换】按钮,启动加水印程序。加完水印后软件会自动d出视频保存的文件夹。

步骤4,打开刚刚处理好的视频可以看到,视频的右上角成功的加上了水印。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7835142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存