如何用ffmpeg输出碎片化的mp4?

     2023-02-16     263

关键词:

【中文标题】如何用ffmpeg输出碎片化的mp4?【英文标题】:How to output fragmented mp4 with ffmpeg? 【发布时间】:2012-01-26 20:39:28 【问题描述】:

ffmpeg -i infile.avi out.mp4 输出非分段 MP4。

如何获取碎片化的mp4?

更新 一个分段的 mp4 文件在内部被分成几个背靠背的块或 MPEG-4 电影片段。每个块都有自己的 moof atom - 因此文件中有几个 moof atom 交错,而不是像未分段的 mp4 那样在末尾有一个 moov。这使得在涉及缓冲的慢速网络上流式传输变得更容易

有几种工具,如mp4box,可以将普通的 mp4 转换为碎片化的。不幸的是,我们不能使用这样的东西

ffmpeg <options to output mp4> | mp4box

因为 ffmpeg 在生成 mp4 容器时不会生成可搜索的输出。

【问题讨论】:

您可能想要添加一些关于什么是“碎片化 mp4”的信息,以使可能熟悉 ffmpeg 但不了解碎片化 mp4 的人更容易理解这个问题。 好点!我已经编辑了我的问题 @SaptarshiBiswas 您是否在不使用 mp3box 的情况下解决了这个问题?你能分享解决方案吗?谢谢 【参考方案1】:

ffmpeg -h(但不是手册页)具有以下内容:

mp4 muxer AVOptions:  
-movflags          <flags> E.... MOV muxer flags
   rtphint                 E.... Add RTP hint tracks
-moov_size         <int>   E.... maximum moov size so it can be placed at the
                                 beginning
-frag_size         <int>   E.... maximum fragment size
-frag_duration     <int>   E.... maximum fragment duration
-rtpflags          <flags> E.... RTP muxer flags
   latm                    E.... Use MP4A-LATM packetization instead of
                                 MPEG4-GENERIC for AAC
-skip_iods          <int>   E.... Skip writing iods atom.
-iods_audio_profile <int>   E.... iods audio profile atom.
-iods_video_profile <int>   E.... iods video profile atom.

如果我看到一个碎片化的 mp4,我不知道如何识别它,但看起来 ffmpeg 确实对它们有一些(记录不充分的)支持。

【讨论】:

re:“如果我看到一个片段的 mp4,我不知道如何识别它”:) 它们看起来确实很相似。 :) 在“moov”的前面有一个“mvex”原子,让你知道它会被碎片化。在各种轨道子原子中将有相当少的实际数据信息。将有***“moof”“mdat”对,这是实际数据所在的位置。最后可能有一个“mfra”原子。 mp4box -info file 将指示 MP4 是否分片。【参考方案2】:

这应该可以解决问题:

ffmpeg -re -i infile.ext -g 52 \
-c:a aac -b:a 64k -c:v libx264 -b:v 448k \
-f mp4 -movflags frag_keyframe+empty_moov \
output.mp4
frag_keyframe 导致输出碎片化, empty_moov 会导致输出 100% 碎片化;如果没有这个,第一个片段将被混合为一个短片(使用moov),然后是片段中的其余媒体, -re 在直播时很有用(使用输入媒体帧率),如果您正在创建文件,请不要使用它, -g 52 强制(至少)每 52 帧为关键帧

要计算健康的关键帧间隔,请参阅我的流媒体服务器文档中有关 fragment sizes 的段落。 - 您也可以考虑使用 WebM,它是 H.264 的免费替代品(在某些平台上比碎片化 mp4 有更好的支持)。

重要提示:FFMpeg 的多路复用器会将每个轨道的 tkhdmdhd 原子中的 Duration 设置为 0xffffffff。这会导致某些播放器出现问题(例如 Quicktime 不会播放此类文件)。您应该找到一个工具并将其更改为零(0x00000000)。

【讨论】:

如果您对上述命令有疑问,您可能需要重新安装 ffmpeg。通过 brew 安装所有选项: brew install ffmpeg --with-fdk-aac --with-ffplay --with-freetype --with-frei0r --with-libass --with-libvo-aacenc -- with-libvorbis --with-libvpx --with-opencore-amr --with-openjpeg --with-opus --with-rtmpdump --with-schroedinger --with-speex --with-theora --with-tools 是否可以将输出流式传输到 HTML5 而不是将其保存到文件中?使用http协议? @astralmaster AFAIK FFmpeg 没有 http 服务器套接字输出(只有客户端)。您必须将媒体从 VLC 等其他软件中反弹,或者如果您想为多个客户端提供服务,则 FFserver。 @vbence 不幸的是,FFServer 只有 linux 版本,我正在寻找 Windows 解决方案。 WebM 不是 H.264 的替代品。 WebM 是 mp4(容器)的替代品,因为 VP9 是 H.264(编解码器)的替代品【参考方案3】:

更新:将分段的 MP4 视为 ISMV(平滑流)文件。自 2012 年 1 月 27 日起,新版本 FFMPEG 0.10 能够复用到这种格式。

$ ffmpeg -h muxer=ismv
ismv muxer AVOptions:
-movflags          <flags> E.... MOV muxer flags
   rtphint                 E.... Add RTP hint tracks
   empty_moov              E.... Make the initial moov atom empty (not supported by QuickTime)
   frag_keyframe           E.... Fragment at video keyframes
   separate_moof           E.... Write separate moof/mdat atoms for each track
   frag_custom             E.... Flush fragments on caller requests
   isml                    E.... Create a live smooth streaming feed (for pushing to a publishing point)
-moov_size         <int>   E.... maximum moov size so it can be placed at the begin
-rtpflags          <flags> E.... RTP muxer flags
   latm                    E.... Use MP4A-LATM packetization instead of MPEG4-GENERIC for AAC
   rfc2190                 E.... Use RFC 2190 packetization instead of RFC 4629 for H.263
   skip_rtcp               E.... Don't send RTCP sender reports
-skip_iods         <int>   E.... Skip writing iods atom.
-iods_audio_profile <int>  E.... iods audio profile atom.
-iods_video_profile <int>  E.... iods video profile atom.
-frag_duration     <int>   E.... Maximum fragment duration
-min_frag_duration <int>   E.... Minimum fragment duration
-frag_size         <int>   E.... Maximum fragment size
-ism_lookahead     <int>   E.... Number of lookahead entries for ISM files

【讨论】:

【参考方案4】:

也许这会有所帮助。在下面的示例中,ffmpeg 获取 RTMP 提要的副本,然后使用 ffmpeg,它在 fMP4 中创建一个 HTTP 输出,可以被 IIS 或 Azure 入口点接受。

注意:原始编码器设置为2秒的关键帧间隔。

ffmpeg -i rtmp://ip of server:1935/name/streamkey -vcodec copy -acodec copy -nal-hrd cbr -movflags isml+frag_keyframe+separate_moof -f ismv http://url of entry point/entry-point.isml/Streams(feed1)

【讨论】:

使用 ffmpeg 解密碎片化的 mpeg-dash

】使用ffmpeg解密碎片化的mpeg-dash【英文标题】:Decryptingfragmentedmpeg-dashusingffmpeg【发布时间】:2021-02-0314:25:54【问题描述】:我有一个要解密的mpeg-dash。我有CENC解密密钥。但我无法让它工作。破折号使用段模板。这是破折号<?xm... 查看详情

MPEG-DASH 在碎片化的 mp4 sampleOffsets 和 sampleSizes 中挑剔?

】MPEG-DASH在碎片化的mp4sampleOffsets和sampleSizes中挑剔?【英文标题】:MPEG-DASHpickyinfragmentedmp4sampleOffsetsandsampleSizes?【发布时间】:2014-11-1308:26:00【问题描述】:嘿***研究员。目前我遇到了一个MPEG-DASH播放器不想播放DASH内容的问题... 查看详情

如何用ffmpeg截取视频片段&截取时间不准确的坑(代码片段)

  之前在工作中,有遇到需要程序化截取视频片段的场景,这里使用ffmpeg命令行就可以很容易实现,这里也记录下我们使用过程中遇到的坑,希望对大家也有所帮助。  举个例子,当我们要截取视频文件... 查看详情

如何用FFMPEG分块记录UDP流?

】如何用FFMPEG分块记录UDP流?【英文标题】:HowtorecordUDPstreamwithFFMPEGinchunks?【发布时间】:2012-05-2205:06:53【问题描述】:我正在寻找一种使用ffmpeg但以1000万个块记录视频UDP流的方法。我目前使用以下方法获取1000万视频(使用h264... 查看详情

ffmpeg如何批量切割视频尾部4秒?

...视频文件,时间长短不一,但其尾部的4秒都是广告。如何用把这4秒批量切割掉?听说ffmpeg可以办到,命令行怎么写?-----------------------------------------------------------------------参考技术A如果视频是1分钟长度那么用下面的命令ffmpeg-ii... 查看详情

FFmpeg:如何用幻灯片和音频制作视频

】FFmpeg:如何用幻灯片和音频制作视频【英文标题】:FFmpeg:howtomakevideooutofslidesandaudio【发布时间】:2014-07-0704:57:29【问题描述】:所以我有几张图片,一些是png和一些jpg。我有mp3音频。我想做一个视频文件,不管是什么格式。... 查看详情

ffmpeg:组合/合并多个 mp4 视频不起作用,输出仅包含第一个视频

】ffmpeg:组合/合并多个mp4视频不起作用,输出仅包含第一个视频【英文标题】:ffmpeg:Combine/mergemultiplemp4videosnotworking,outputonlycontainsthefirstvideo【发布时间】:2011-07-2120:42:18【问题描述】:这是我用来合并多个视频的命令:ffmpeg-i75... 查看详情

FFMPEG - 流式传输到 RTMP 输出并同时保存到 MP4 - 重新连接

】FFMPEG-流式传输到RTMP输出并同时保存到MP4-重新连接【英文标题】:FFMPEG-StreamtoRTMPoutputandsavetoMP4atsametime-withreconnect【发布时间】:2020-01-0808:08:37【问题描述】:我正在尝试设置一个管道,我可以在其中获取输入并保存到MP4,同... 查看详情

ffmpeg如何指定输入特殊视频格式

参考技术AFFMpeg应该可以自动判断出视频文件的格式,不用再进行解码器的指定。要强制指定也可以,FFMpeg有一个-f参数,是用于强制指定文件格式的。但我只用过这个参数来指定过输出文件格式,如-fwav、-fjpg,而还没有用它指... 查看详情

如何用ffmpeg编写一个简单播放器详

...码多种格式。具体可以参考这个文库里面的教程。  如何用FFmpeg编写一个简单播放器详细步骤介绍_百度文库  http://wenku.baidu.com/link?url=I9sT4pEcSxSAOWVHC00hSzgHZNPceziUekczKcCf1tJJoYia0oOP6OCuSO6lmxRZ0G87wrc0ZwFx4O7UvVWF4UZM8xgaefRH-QjmkXw4h-i本回答... 查看详情

教你如何用ffmpeg处理音频格式转换(标贝科技)(代码片段)

文章目录前言ffmpeg介绍?一、下载与安装1.下载安装包2.设置环境变量3.验证是否安装成功二、命令讲解1参数解释2音频格式转换命令三、标贝开放平台介绍前言ffmpeg介绍?FFmpeg是一套可以用来记录、转换数字音频、视频&#x... 查看详情

ffmpeg4代码输出mp4文件帧数(代码片段)

代码无误。需要注意的是编译环境,本人用的是ffmpeg4版本,源码编译安装。最后会输出一个i的值,就是这个视频的帧数了。#include<iostream>#include<cmath>extern"C"#include<libavdevice/avdevice.h>#include<libavco 查看详情

ffmpeg4代码输出mp4文件帧数(代码片段)

代码无误。需要注意的是编译环境,本人用的是ffmpeg4版本,源码编译安装。最后会输出一个i的值,就是这个视频的帧数了。#include<iostream>#include<cmath>extern"C"#include<libavdevice/avdevice.h>#include<libavc 查看详情

如何用c#处理视频!

如何用C#对视频进行处理!需要截图,保存所截的图!不要复制的!简单阐述一下需要用的函数和别写步骤!有一个FFMPEG的解决方案可以用C#直接调用,在调用的时候可以选择生成视频中对应的缩略图。具体FFMPEG文档你可以网上查... 查看详情

ffmpeg使用(代码片段)

视频水平和竖直拼接:将两个视频水平连接起来ffmpeg-i0.mp4-i1.mp4-filter_complexhstackoutput.mp4将两个视频垂直连接起来ffmpeg-i0.mp4-i1.mp4-filter_complexvstackoutput.mp4jpg转为pngffmpeg -i 00001.jpg -vf scale=746:1684 -y 00001.png批量png生成视频ffm... 查看详情

ffmpeg命令行的输出文件的路径该怎么写??

ffmpeg命令里输出文件的路径就直接写出来就行了?比如c:\1.mp4不像输入文件那样前面还有个-i做标志??路径到底需不需要加引号,怎么好像是有的时候加有的时候不加呢ffmpeg输出文件无须参数,直接写d:\path\filename.mp4。... 查看详情

ffmpeg命令行的输出文件的路径该怎么写??

ffmpeg命令里输出文件的路径就直接写出来就行了?比如c:\1.mp4不像输入文件那样前面还有个-i做标志??路径到底需不需要加引号,怎么好像是有的时候加有的时候不加呢ffmpeg输出文件无须参数,直接写d:\path\filename.mp4。... 查看详情

c#中如何用axwindowsmediaplayer1控件播放mp4?

已经把控件脱到窗口上,写了如下代码:axWindowsMediaPlayer1.URL=Application.StartupPath+"\\videodata\\data.mp4";this.axWindowsMediaPlayer1.settings.autoStart=true;axWindowsMediaPlayer1.Ctlcontrols.play();//播放axWindowsMediaPlayer1.Ctlcontrols.pause();//... 查看详情