当前位置: 首页 > 知识库问答 >
问题:

用ffmpeg生成单个MPEG-Dash段

景鸿才
2023-03-14

我一直试图实现一个像丛一样的视频播放器,它可以按需转换任意视频文件,并在网页上用MPEG-Dash播放它。我能够使用dash.js引用实现来实现客户端播放器,因此它将动态地从服务器请求片段(在mpd文件中使用SegmentTemplate)。

但是我在实时生成这些块时遇到了一些问题。Ffmpeg允许我设置-ss-t来定义所需片段的边界,但是它们不能在播放机中正常播放,因为它们是“完整”视频文件,而不是破折号片段。

那么,我如何调整我的ffmpeg命令,只转码我需要的部分作为一个破折号段,而不必为整个视频文件预先生成段?

输入视频文件可以是任何格式,所以不能假设它是在MP4/Dash兼容的编解码器中。因此,代码转换(使用ffmpeg或类似工具)是必需的。

我当前的ffmpeg命令如下所示(经过多次尝试):

ffmpeg -ss 10 -t 5 -i video.mkv -f mp4 -c:a aac -c:v h264 -copyts -movflags empty_moov+frag_keyframe temp/segment.mp4

客户端播放器应该能够缓冲下一个X段,用户应该能够查看持续时间条上的当前位置并寻找不同的位置。因此,将其视为实时流不是一种选择。

共有1个答案

双志强
2023-03-14

听起来你描述的是实时流而不是视频点播--直播流是连续的,通常是实时视频流,而视频点播通常是当用户请求时提供的视频文件。

在较大的解决方案中,VOD的通常方式是先分割视频,然后按需将其打包成所需的流协议,此时通常是HLS或DASH。这允许操作员最小化他们需要维护的不同格式

新兴的CMAF标准通过对HLS和DASH的段使用相同的格式来帮助支持这一点。如果你搜索“CMAF”,你会看到许多关于历史的解释,官方页面也在这里:https://www.iso.org/standard/71975.html

开源工具可以帮助您将MP4文件直接转换为dash-mp4box是最常见的工具之一:https://gpac.wp.imt.fr/MP4Box/DASH/

ffmpeg还在支持视频点播的文档中包含信息:https://www.ffmpeg.org/ffmpeg-formats.html#dash-2包括一个示例:

ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264 \
-b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline \
-profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 \
-b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 \
-window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash /path/to/out.mpd
  • https://google.github.io/shaka-packager/html/tutorials/live.html

假设您希望允许用户在生成视频文件时观看,那么一种方法是使流看起来像一个直播流,即“视频点播到直播”的情况。

您可以在Ffmpeg中使用restreaming来转码和流到UDP,然后将其传送到打包器中。

ffmpeg文档包括以下说明:

-re(input)以本机帧速率读取输入。主要用于模拟抓取设备,或实时输入流(例如从文件读取时)。不应该与实际的抓取设备或实时输入流一起使用(在那里它会导致数据包丢失)。默认情况下,ffmpeg尝试以尽可能快的速度读取输入。此选项将减慢输入读取到输入本机帧速率的速度。它对于实时输出(例如直播流)很有用。

这给出了一个流程,看起来像:

mp4文件->FFMPEG->打包器->实时破折号流->客户端

使用打包程序来实现这一点意味着您不必担心在新段可用或旧段不可用时更新清单。

在Wowza packager站点上有一个示例(在撰写本文时),您可以查看并试验一下,替换您现在的文件或使用它们的文件-输出应该与任何可以接受UDP输入流的打包器一起工作:https://www.Wowza.com/docs/how-to-restream-using-ffmpeg-with-wowza-streaming-engine

 类似资料:
  • 我想用多比特率创建破折号流,并为它服务。我还想使用dash.js播放器的质量选择器。如图所示:

  • 我知道使用,我们可以创建MPEG-DASH就绪文件,包括段和. mpd清单文件。例如,我正在尝试这个有效的命令: 但我不想分割视频,所以我们有一个更简单的版本,整个视频有多个版本,没有块。MPEG-DASH允许吗?如果是这样的话,我如何使用在不创建块的情况下完成它?

  • 所以我正在尝试设置自适应流媒体,我认为问题已经解决了80-90%。现在我摄取我的源视频,将其转码为5种分辨率,每种分辨率有3个比特率(低、中、高),然后我将所有这些视频分成5秒块,以便用户始终可以获得最佳观看效果。现在我需要生成/创建我的MPD清单文件,我很难弄清楚如何操作。几乎每个人都说要使用MP4Box,但他们的许可证对我的项目来说太严格了。 当我分割视频时,是否有使用FFMPEG生成MPD文

  • 需要调试段划线文件的帮助吗 输入是带有这些细节的MP4。这是从摄像机录制的,摄像机的输出是mkv,我们通过adobe编辑音频后转换为MP4 大小:7.51 GB帧率:25帧/秒 数据速率:25326kbps 总比特率:25525kbps 使用此命令将其转换为另一个mp4 输出视频已被删除 fps:25 数据速率:761kbps 比特率:761kbps 然后,通过MP4Box创建了分段破折号 生成的

  • 嗨,我有一个视频,它被重新编码成不同的比特率。我还生成了相应的mpd文件。它使用MP4Client进行播放。我使用了以下命令: 但它只为每个比特率生成一个片段。我还想为所有比特率生成相应的段(即段列表)。 任何帮助都会非常有用。

  • 我目前正在发送一个视频流到Chrome,通过MediaSource API播放。 有什么方法可以实时地用FFMPEG编码成MPEG-DASH或关键帧WebM格式吗? 编辑: 我只是用尝试了一下,这样每个帧都是一个关键帧。不是理想的解决方案。不过,它现在确实适用于纵隔。在WebM中,有什么方法可以将段与关键帧同步,这样就不需要每个帧都是关键帧了? MediaSource API和mp4