编译具有分段时间线的 init.mp4 和 audio.mp4

Posted

技术标签:

【中文标题】编译具有分段时间线的 init.mp4 和 audio.mp4【英文标题】:Compile init.mp4 and audio.mp4 that has segment timeline 【发布时间】:2019-08-31 15:52:48 【问题描述】:

我正在尝试编译 init.mp4 及其音频文件 使用 copy /b init.mp4 + audio.mp4 complie.mp4

正在编译,但无法在 vlc 和 ffmpeg 上播放。

当我检查 mpd 文件时,我看到它有音频

            <SegmentTemplate timescale="48000" media="57_audio_1_17_$Number$.mp4?m=1532401844" initialization="57_audio_1_17_init.mp4?m=1532401844" startNumber="6815976">
                <SegmentTimeline>
                    <S t="1521333224447" d="479232" r="1"/>
                    <S t="1521334182911" d="483328"/>
                    <S t="1521334666239" d="479232" r="3"/>
                    <S t="1521336583167" d="483328"/>
                    <S t="1521337066495" d="479232" r="3"/>
                    <S t="1521338983423" d="483328"/>
                    <S t="1521339466751" d="479232" r="4"/>
                    <S t="1521341862911" d="483328"/>
                    <S t="1521342346239" d="479232" r="3"/>
                    <S t="1521344263167" d="483328"/>
                    <S t="1521344746495" d="479232" r="3"/>
                    <S t="1521346663423" d="483328"/>
                    <S t="1521347146751" d="479232" r="4"/>
                    <S t="1521349542911" d="483328"/>
                    <S t="1521350026239" d="479232" r="3"/>
                    <S t="1521351943167" d="483328"/>
                    <S t="1521352426495" d="479232" r="3"/>
                    <S t="1521354343423" d="483328"/>
                    <S t="1521354826751" d="479232" r="4"/>
                    <S t="1521357222911" d="483328"/>
                    <S t="1521357706239" d="479232" r="3"/>
                    <S t="1521359623167" d="483328"/>
                    <S t="1521360106495" d="479232" r="3"/>
                    <S t="1521362023423" d="483328"/>
                    <S t="1521362506751" d="479232" r="4"/>
                    <S t="1521364902911" d="483328"/>
                    <S t="1521365386239" d="479232" r="3"/>
                    <S t="1521367303167" d="483328"/>
                    <S t="1521367786495" d="479232" r="3"/>
                    <S t="1521369703423" d="483328"/>
                    <S t="1521370186751" d="479232" r="4"/>
                    <S t="1521372582911" d="483328"/>
                    <S t="1521373066239" d="479232" r="3"/>
                    <S t="1521374983167" d="483328"/>
                    <S t="1521375466495" d="479232" r="3"/>
                    <S t="1521377383423" d="483328"/>
                </SegmentTimeline>
            </SegmentTemplate>
        </Representation>

有人能解释一下它是什么吗?那些 t,r,d 值是。 如何将这些音频片段添加到 complie.mp4 并使其播放?

【问题讨论】:

编译是指将文件 init.mp4 和 audio.mp4 连接到一个名为 compile.mp4 的文件中? DASH 规范通常需要花钱才能获得,但好的来源通常是 ffmpeg 源代码github.com/FFmpeg/FFmpeg/blob/master/libavformat/dashdec.c#L40 这篇文章解释了如何将片段转换为 .mp4 文件。 ***.com/questions/23485759/… 当您添加widevine 标签时,这是否意味着流受 DRM 保护?这将是下载和连接文件后的下一个问题。您需要在播放前解密。 【参考方案1】:

首先您需要下载 init.mp4,然后根据 SegmentTimeline 下载片段。

对于&lt;SegmentTemplate&gt;,通常使用&lt;SegmentTimeline&gt; 标记来指示每个段的长度以及哪些段重复。 &lt;SegmentTemplate&gt; 的属性中通常包含一个时间刻度(表示一秒的单位),以便我们可以基于此单位计算段的时间。在下面的示例中,&lt;S&gt; 标记表示段标记,d 属性指定段的长度,r 属性指定相同持续时间重复的段数,以便正确计算 $Time$用于下载media 属性中指定的媒体片段。

<SegmentTemplate>
  timescale="48000"
  initialization="$RepresentationID$-init.dash"
  media="$RepresentationID$-$Time$.dash"
    startNumber="1">
    <SegmentTimeline>
      <S t="0" d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
   </SegmentTimeline>
</SegmentTemplate>

以下是表示中的段模板示例。它使用 $Time$ 变量。

<SegmentTemplate timescale="30000" media="155_video_1_2_$Time$.mp4?m=1545421124" initialization="155_video_1_2_init.mp4?m=1545421124" startNumber="710">
  <SegmentTimeline>
       <S t="255197799" d="360360" r="8"/>
       <S t="258441039" d="334334"/>
  </SegmentTimeline>
</SegmentTemplate>

第一个片段的请求 URL 是 155_video_1_2_255197799.mp4。持续时间为 360360,下一个片段请求是 155_video_1_2_255558159.mp4,以此类推直到第九个片段。

最后的片段请求是155_video_1_2_258441039.mp4

如果段模板使用 $Number$ 而不是 $Time$,那么您在起始编号处下载文件,然后重复 r 指示的次数。

<AdaptationSet
            bitstreamSwitching="false"
            contentType="video"
            id="1"
            mimeType="video/mp4"
            segmentAlignment="true">
            <SegmentTemplate
                initialization="$RepresentationID$/init.mp4"
                media="$RepresentationID$/$Number$.m4f"
                startNumber="218646"
                timescale="90000">
                <SegmentTimeline>
                    <S
                        d="540540"
                        r="28"/>
                </SegmentTimeline>
            </SegmentTemplate>
            <Representation
                band
                codecs="avc1.4D001E"
                frameRate="90000/3003"
                
                id="5501_video_seg_auto_video_32"
                />
        </AdaptationSet>

第一个文件将是起始编号,然后重复段 28 次。所以 start + 28 是 29 个文件加上 init.mp4。

218646.m4f
218647.m4f
218648.m4f
218649.m4f
218650.m4f
218651.m4f
218652.m4f
218653.m4f
218654.m4f
218655.m4f
218656.m4f
218657.m4f
218658.m4f
218659.m4f
218660.m4f
218661.m4f
218662.m4f
218663.m4f
218664.m4f
218665.m4f
218666.m4f
218667.m4f
218668.m4f
218669.m4f
218670.m4f
218671.m4f
218672.m4f
218673.m4f
218674.m4f
init.mp4

然后您可以将片段转换为 .mp4 文件。

cat init.mp4 > source.mp4
cat segment-1.m4f >> source.mp4
cat segment-2.m4f >> source.mp4
...

参考资料:

https://developers.google.com/cast/docs/mpl/streaming_protocols

https://docs.aws.amazon.com/mediapackage/latest/ug/segtemp-format.html

Combine MPEG-DASH segments (ex, init.mp4 + segments.m4s) back to a full source.mp4?

【讨论】:

问题是,在 MPD 文件中,没有 $Time$ 变量。相反,它有 $Number$。我试着把, 57_audio_1_17_$Number$.mp4?m=1532401844 57_audio_1_17_1521333224447.mp4?m=1532401844 但是,它不适合我。在 SegmentTemplate 中,有一个名为 startNumber="6815976" 的东西,我可以像这样使用这个起始编号 57_audio_1_17_6815976.mp4?m=1532401844 下载 mp4 文件。但是音频没有完成,它给出了错误。你能再次检查我编辑的帖子以查看 mpd 文件吗?

以上是关于编译具有分段时间线的 init.mp4 和 audio.mp4的主要内容,如果未能解决你的问题,请参考以下文章

如何在有一定要求的情况下绘制这样的分段圆

envers 中 _aud 表中的旧值

如何乘以和除以一天中的时间,例如10:00 和 5:00 具有重载功能?

为啥我的代码结果显示分段错误(核心转储)?

如何获得一个散点矩阵,仅由具有 1:1 线的散点图和良好的轴标签组成?

修复 C++ 中的分段错误