可以分析MP4封装格式的工具比较多除了FFmpeg之外,还有一些常用工具,例如Elecard Stream Eye、MP4BOX、mp4info等;下面简单介绍一下这几款常见工 具:
8.1 Elecard Stream Eye
8.2 mp4box
mp4box是GPAC项目中的一个组件,可以通过mp4box针对媒体文件进行合成,拆解等操作,其操作信息大概如下:
FFmpeg使用手册 - ffmpeg对MP4的生成与处理-LMLPHP
下面可以使用mp4box分析一下output.mp4的信息,内容如下:
FFmpeg使用手册 - ffmpeg对MP4的生成与处理-LMLPHP
8.3 mp4info
mp4info也是一个不错的mp4分析工具,而且是可视化的工具,可以将mp4文件中的各box接触出来,并将其中的数据展现出来,分析mp4内容时使用mp4info将会更方便:
 FFmpeg使用手册 - ffmpeg对MP4的生成与处理-LMLPHP
8.4 MP4在ffmpeg中的demuxer
通过查看ffmpeg的help信息,可以看到mp4的demuxer与mov、3gp、m4a、3g2、mj2的demuxer相同,解析mp4文件时参数如下:

参数

类型

说明

use_absolute_path

布尔

可以通过绝对路径加载外部的tracks,可能会有安全因素的影响,默认不开启

seek_streams_individually

布尔

根据单独流进行seek,默认开启

ignore_editlist

布尔

忽略EditList Atom信息,默认不开启

ignore_chapters

布尔

忽略Chapters信息,默认不开启

enable_drefs

布尔

外部track支持,默认不开启

 

 

 



8.5 MP4在ffmpeg中的muxer
在前面一节提到,mp4与mov、3gp、m4a、3g2、mj2的demuxer相同,而muxer中差别不大,但是是不同的muxer,尽管在ffmpeg中都是使用的同一套format进行的Mux与Demux。Mp4的mux相对demux来说稍微复杂一些,因为要封装的时候可选参数多一些,可以通过下表了解相关的参数:

参数

说明

movflags

 

MP4 Muxer 标记

 

rtphint

增加RTPhint track

 

empty_moov

初始化空的moov box

 

frag_keyframe

在视频关键帧处切片

 

separate_moof

每一个Track写独立的moof / mdat box

 

frag_custom

每一个caller请求时Flush一个片段

 

isml

创建实时流媒体(创建一个直播流发布点)

 

faststart

moov box移动到文件的头部

 

omit_tfhd_offset

忽略tfhd容器中的基础数据偏移

 

disable_chpl

关闭Nero Chapter容器

 

default_base_moof

tfhd容器中设置default-base-is-moof标记

 

dash

兼容DASH格式的mp4分片

 

frag_discont

分片不连续式设置discontinuous信号

 

delay_moov

延迟写入moov信息,直到第一个分片切出来,或者第一片被刷掉

 

global_sidx

在文件的开头设置公共的sidx索引

 

write_colr

colr容器

 

write_gama

写被弃用的gama容器

moov_size

正整数

设置moov容器的最大大小

rtpflags

 

设置rtp传输相关的标记

 

latm

使用MP4A-LATM方式传输AAC音频

 

rfc2190

使用RFC2190传输H.264H.263

 

skip_rtcp

忽略使用RTCP

 

h264_mode0

使用RTP传输mode0H264

 

send_bye

当传输结束时发送RTCPBYE

skip_iods

布尔型

不写入iods容器

iods_audio_profile

0-255

设置iods的音频profile容器

iods_video_profile

0-255

设置iods的视频profile容器

frag_duration

正整数

切片最大的duration

min_frag_duration

正整数

切片最小的duration

frag_size

正整数

切片最大的大小

ism_lookahead

正整数

预读取ISM文件的数量

video_track_timescale

正整数

设置所有视频的时间计算方式

brand

字符串

major brand

use_editlist

布尔型

使用edit list

fragment_index

正整数

下一个分片编号

mov_gamma

0-10

Gama容器的gama

frag_interleave

正整数

交错分片样本

encryption_scheme

字符串

配置加密的方案

encryption_key

二进制

秘钥

encryption_kid

二进制

秘钥标识符


8.6 faststart使用案例
正常情况下ffmpeg生成moov是在mdat写完成之后写入,可以通过参数faststart将moov容器移动至mdat前面,下面参考一个例子:
ffmpeg –i input.flv –c copy –f mp4 output.mp4
然后使用mp4info查看output.mp4的容器出现顺序
FFmpeg使用手册 - ffmpeg对MP4的生成与处理-LMLPHP
可以看到上图中moov容器是在mdat的下边,如果使用参数faststart就会在生成完上边结构之后将moov移动到mdat前面:
ffmpeg –i input.flv –c copy –f mp4 –movflags faststart output.mp4然后使用mp4info查看mp4的容器顺序,可以看到moov被移动到了mdat前面。
FFmpeg使用手册 - ffmpeg对MP4的生成与处理-LMLPHP
8.7 dash参数使用案例
当使用生成dash格式的时候,里面使用的一种特殊的mp4格式,可以通过dash参数进行生成:
ffmpeg –i input.flv –c copy –f mp4 –movflags dash output.mp4
使用mp4info查看容器格式信息,稍微有些特殊,具体的信息在前面均有介绍
FFmpeg使用手册 - ffmpeg对MP4的生成与处理-LMLPHP
8.8 isml 参数使用案例
ismv为微软发布的一个流媒体格式,通过参数isml可以发布isml直播流,将ismv推流至IIS服务器,可以通过参数isml参数进行发布:
ffmpeg -re -i INUPT.mp4 -c copy -movflags isml+frag_keyframe -f ismv http://192.168.0.1/publish.isml/Stream
可以观察Stream的格式,大致如下:
 FFmpeg使用手册 - ffmpeg对MP4的生成与处理-LMLPHP
生成的文件格式的原理类似HLS,使用的XML格式进行索引,然后刷新切片内容进行直播。

12-17 07:36