FFmpeg的Static版本的bin
文件夹中只有三个.exe
文件,分别是: ffmpeg.exe
、ffplay.exe
、ffprobe.exe
,这三个是FFmpeg源代码编译后生成的可执行文件,也就是FFmpeg的三大工具,下面对各个工具进行简要的介绍。
一、FFmpeg的编解码工具–ffmpeg.exe
ffmpeg
工具主要用于编解码,ffmpeg
的主要工作流程相对比较简单,如下所示:
- 读取输入源
- 进行音视频的解封装
- 解码每一帧音视频数据
- 编码每一帧音视频数据
- 进行音视频的重写封装
- 输出到目标
如上图示:
- ffmpeg首先读取输入源,然后通过Demuxer将音视频包进行解封装,这个动作通过调用libavformat中的接口即可实现;
- 接下来通过Decoder进行解码,将音视频通过Decoder解包称为YUV或者PCM这样的数据,Decoder通过libavcodec中的接口即可实现;
- 然后通过Encoder将对应的数据进行编码,编码可以通过libavcodec中的接口来实现;
- 接下来将编码后的音视频数据包通过Muxer进行封装,Muxer封装通过libavformat中的接口即可实现,输出成为输出流;
实例如下:
在此文件夹下按住Shift
点击鼠标右键
,选择:在此处打开命令行窗口
:
输入如下命令:
ffmpeg -i test.mp4 test_out.avi
二、FFmpeg的播放器–ffplay.exe
FFmpeg不但可以提供转码、转封装等功能,同时还提供了播放器相关功能,使用FFmpeg的avformat
与avcodec
,可以播放各种媒体文件或者流。如果想要使用ffplay
,那么系统首先需要有SDL来进行ffplay的基础支持。
ffplay
是FFmepg源代码编译后生成的另一个可执行程序,与ffmpeg
在FFmpeg项目中充当的角色基本相同,可以作为测试工具进行使用,ffplay
提供了音视频显示和播放相关的图像信息、音频的波形信息等。
注意:有时通过源代码编译生成ffplay不一定能够成功,因为ffplay在旧版本时依赖于SDL-1.2,而ffplay在新版本时依赖于SDL-2.0,需要安装对应的SDL才能生成ffplay
三、FFmpeg的多媒体分析器–ffprobe.exe
ffprobe
也是FFmepg源码编译后生成的一个可执行程序。ffprobe
是一个非常强大的多媒体分析工具,可以从媒体文件或者媒体流中获得你想要了解的媒体信息,比如音频的参数、视频的参数、媒体容器的参数信息等。
例如它可以帮助分析某个媒体容器中的音频是什么编码格式、视频是什么编码格式,同时还可以得到媒体文件中媒体的总时长、复合码率等信息。
使用ffprobe
可以分析媒体文件中每个包的长度、包的类型、帧的信息等。
实例如下:
ffprobe --show_streams test_out.avi
[STREAM]
index=0
codec_name=mpeg4
codec_long_name=MPEG-4 part 2
profile=Simple Profile
codec_type=video
codec_time_base=1/30
codec_tag_string=FMP4
codec_tag=0x34504d46
width=1920
height=1080
coded_width=1920
coded_height=1080
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=1
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
field_order=unknown
timecode=N/A
refs=1
quarter_sample=false
divx_packed=false
id=N/A
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/30
start_pts=0
start_time=0.000000
duration_ts=2415
duration=80.500000
bit_rate=1439035
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=2415
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
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
[/STREAM]
[STREAM]
index=1
codec_name=mp3
codec_long_name=MP3 (MPEG audio layer 3)
profile=unknown
codec_type=audio
codec_time_base=1/48000
codec_tag_string=U[0][0][0]
codec_tag=0x0055
sample_fmt=s16p
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=3/125
start_pts=0
start_time=0.000000
duration_ts=3352
duration=80.448000
bit_rate=128038
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=3352
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
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
[/STREAM]
根据输出内容可以看到,使用ffprobe
能够看到AVI文件容器中的流的信息,其中包含了一个视频流,由于该文件中只有视频流,流相关的信息是通过[STREAM] [/STREAM]
的方式展现出来的,在[STREAM]
和[/STREAM]
之间的信息及即为AVI文件的视频流信息。当视频文件容器中包含音频流与视频流或者更多路流时,会通过[STREAM]
和[/STREAM]
进行多个流的分隔,分隔后采用index来进行流的索引信息的区分。