正常情况下ffmpeg生成moov是在mdat写完成之后写入
可以分析MP4封装格式的工具比较多除了FFmpeg之外,还有一些常用工具,例如Elecard Stream Eye、MP4BOX、mp4info等;下面简单介绍一下这几款常见工具:
8.1 Elecard Stream Eye
8.2 mp4box
mp4box是GPAC项目中的一个组件,可以通过mp4box针对媒体文件进行合成,拆解等操作,其操作信息大概如下:
下面可以使用mp4box分析一下output.mp4的信息,内容如下:
8.3 mp4info
mp4info也是一个不错的mp4分析工具,而且是可视化的工具,可以将mp4文件中的各box接触出来,并将其中的数据展现出来,分析mp4内容时使用mp4info将会更方便:
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 |
增加RTP的hint 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传输mode0的H264 |
|
send_bye |
当传输结束时发送RTCP的BYE包 |
|
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的容器出现顺序
可以看到上图中moov容器是在mdat的下边,如果使用参数faststart就会在生成完上边结构之后将moov移动到mdat前面:
ffmpeg –i input.flv –c copy –f mp4 –movflags faststart output.mp4然后使用mp4info查看mp4的容器顺序,可以看到moov被移动到了mdat前面。
8.7 dash参数使用案例
当使用生成dash格式的时候,里面使用的一种特殊的mp4格式,可以通过dash参数进行生成:
ffmpeg –i input.flv –c copy –f mp4 –movflags dash output.mp4
使用mp4info查看容器格式信息,稍微有些特殊,具体的信息在前面均有介绍
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的格式,大致如下:
生成的文件格式的原理类似HLS,使用的XML格式进行索引,然后刷新切片内容进行直播。
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=11344913&id=5750792
正常情况下ffmpeg生成moov是在mdat写完成之后写入相关推荐
- 华为防火墙NAT与NATserver情况下server-map生成情景与解释
PAT 这种情况下的NAT地址转换是不会生成对应的server-map表项的,其主要原因是因为PAT的nat地址转换会不断地进行端口的复用,在不断的地址转换的过程中内网主机可能在一次通信的过程中源端口 ...
- FormView在什么情况下自动生成模板项?
刚才在鼓捣GridView与FormView,记得前一段时间在做时,点击gridview中的一项会在formview中显示详细的数据,而在 formview中只有编写了ItemTemplate等模板才 ...
- android 在什么情况下会主动gc_Python 什么情况下会生成 pyc 文件?
作者:折木奉太郎(经授权转载)来源:https://www.zhihu.com/question/30296617/answer/112564303 作为 Python 爱好者,需要了解 .py 脚本 ...
- python运行pyc文件_Python什么情况下会生成pyc文件?
作为Python爱好者,需要了解.py脚本的基本运行机制及特性: 在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运 ...
- 使用FFmpeg生成高清gif图
前言 使用FFmpeg能够很方便的给视频片段或GIF加水印,同时还能对选取的片段生成GIF图,但是在使用默认FFmpeg设置情况下,生成的GIF画质很差,有很明显的栅格化现象.如何生成高质量的GIF是 ...
- c# .netframwork 4.0 调用 2.0时报错 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
"System.IO.FileLoadException"类型的未经处理的异常在 XXX.dll 中发生 其他信息: 混合模式程序集是针对"v2.0.50727" ...
- 在高并发分布式情况下生成唯一标识id
做项目的时候经常会用id作为唯一标识. 但是当有这样一个需求出现的时候:工程分布式部署,要求抗住高并发.并且生成的id是根据时间自增的.解决这个问题有很多种方法,但是要选择一个性价比比较高的策略比较不 ...
- html2canvas如何在元素隐藏的情况下生成截图
html2canvas官网地址:http://html2canvas.hertzen.com/ github地址:https://github.com/niklasvh/html2canvas/ 从官 ...
- 在不知道根节点的情况下生成树形结构 (采用JSONObject)
废话不多说直接上代码 /*** * 生成树形结构 在不知道跟节点的情况下* @param list 源数据* @param nodeList 跟节点数据* @param childName 子节点名称 ...
最新文章
- 【蓝桥杯】【入门题】【算法提高VIP】1481:剪刀石头布
- HTML5音乐播放器(四):播放列表与播放方式
- java user directory,Java ProcessBuilder directory()方法与示例
- 数据库系统概念总结:第五章 高级SQL
- 吉首大学2019年程序设计竞赛
- Excel多因素不重复方差分析
- 前端还是后端?这些公号教你一锅端!
- hashmap value占用空间大小_java-测量和监视大型HashMap的大小
- 【高并发解决方案】5、如何设计一个秒杀系统
- php频繁执行sql,php - 一条SQL执行多次 sum 特别慢
- bootstrap 步骤条_无骨香酥炸鸡柳,做法原来如此简单,3个关键步骤,学会可以开店...
- Linux常用命令:scp命令
- opencv-python控制笔记本摄像头
- Vagrant 安装 Centos7
- The Elegant Manjaro——ManjaroLinux配置与美化教程
- android给图片加水印的极简实现方式
- 你所不知道的OneNote骚操作 | 告别枯燥 OneNote让数学教学更有趣
- python 2.7上安装pymssql和pymysql
- Python 学到什么程度才可以去找工作?掌握这 4 点足够了!
- python odoo pdf文件 位置获取
热门文章
- linux上部署hadoop集群 HA-QJM篇
- 保持用户处于登录状态,加速应用程序启动
- Smarty的assign定义变量
- 动态创建 Web 服务器控件模板
- CodeForces - 1480D2 Painting the Array II(dp)
- 电脑卡顿不流畅怎么解决_如何解决因电脑内存容量不足引起的卡顿?
- 版本控制可视化工具-Gource教程
- c语言输入十个英文国名,c语言程式设计 在主函式输入10个字元,用子函式求出共输入几个英文字元,几个数字字元,几个符号%...
- 整数域上的多项式辗转相除
- PTA第3章-2 查验身份证 (15 分)