【问题标题】:How should I use the dash (not webm_dash_manifest!) format in ffmpeg?我应该如何在 ffmpeg 中使用破折号(不是 webm_dash_manifest!)格式?
【发布时间】:2017-02-24 01:54:32
【问题描述】:

FFmpeg 有一个名为“dash”的格式:

> ffmpeg -formats
...
  E dash            DASH Muxer
...

这大概对应libavformat/dashenc.c中的代码

我可以在网上找到许多关于如何使用 WebM DASH Manifest 格式的项目,但对于其他 DASH 格式却一无所获。

有人可以从命令行或 API 指向我使用“DASH Muxer”的文档或示例吗?

【问题讨论】:

    标签: ffmpeg mpeg-dash


    【解决方案1】:

    ffmpeg 中的 dash muxer 是相当新的,还没有在文档中。通过查看源代码,我设法让它适用于我的用例。它会创建 .mpd 破折号文件以及分段(除非您不分段,并计划使用 DASH 的 Range: headers 功能进行搜索和部分访问)。 复用器选项是​​:

    • window_size:清单中保留的段数
    • extra_window_size:在从磁盘中删除之前保留在清单之外的段数
    • min_seg_duration:最小段持续时间(以微秒为单位)
    • remove_at_exit:完成后删除所有段
    • use_template:在仪表板清单中使用 SegmentTemplate 而不是 SegmentList
    • use_timeline:在 SegmentTemplate 中使用 SegmentTimeline
    • single_file:将所有段存储在一个文件中,使用字节范围访问
    • single_file_name:用于 baseURL 的 DASH 模板名称。意味着将所有段存储在一个文件中,使用字节范围访问
    • init_seg_name:用于初始化段的 DASH 模板名称,默认为 init-stream$RepresentationID$.m4s
    • media_seg_name:用于媒体片段的 DASH 模板名称,默认为 chunk-stream$RepresentationID$-$Number%05d$.m4s

    我的用例是直播,正好 4 秒的片段,没有片段时间线,使用片段模板,我使用:

    ffmpeg -i /dev/dvb/adapter0/dvr0 -vf yadif=0 -r 25 -vcodec libx264 -keyint_min 0 -g 100 -b:v 1000k -ac 2 -strict 2 -acodec aac -ab 64k -map 0:v -map 0:a -f dash -min_seg_duration 4000 -use_template 1 -use_timeline 0 -init_seg_name init-\$RepresentationID\$.mp4 -media_seg_name test-\$RepresentationID\$-\$Number\$.mp4 test.mpd
    

    生成的 dash 清单如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="urn:mpeg:dash:schema:mpd:2011"
        xmlns:xlink="http://www.w3.org/1999/xlink"
        xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd"
        profiles="urn:mpeg:dash:profile:isoff-live:2011"
        type="dynamic"
        minimumUpdatePeriod="PT500S"
        suggestedPresentationDelay="PT4S"
        availabilityStartTime="2016-12-09T10:11:16"
        publishTime="2016-12-09T10:13:53"
        minBufferTime="PT4.0S">
      <ProgramInformation>
      </ProgramInformation>
      <Period start="PT0.0S">
            <AdaptationSet contentType="video" segmentAlignment="true" bitstreamSwitching="true" frameRate="25/1">
            <Representation id="0" mimeType="video/mp4" codecs="avc1.64001e" bandwidth="1000000" width="720" height="576" frameRate="25/1">
                <SegmentTemplate timescale="1000000" duration="4000000" initialization="init-$RepresentationID$.mp4" media="test-$RepresentationID$-$Number%05d$.mp4" startNumber="1">
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
        <AdaptationSet contentType="audio" segmentAlignment="true" bitstreamSwitching="true">
            <Representation id="1" mimeType="audio/mp4" codecs="mp4a.40.2" bandwidth="64000" audioSamplingRate="48000">
                <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
                <SegmentTemplate timescale="1000000" duration="4000000" initialization="init-$RepresentationID$.mp4" media="test-$RepresentationID$-$Number$.mp4" startNumber="1">
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
      </Period>
    </MPD>
    

    清单和关联的流在 Android 上的 ExoPlayer 中播放。 它目前似乎只生成 DASH 实时清单和视频或纯音频文件。虽然从现场更改为 VOD 是微不足道的(查看 DASH 规范)。 我已经在 Android 上的 ExoPlayer 中测试了流,它可以正常播放。

    【讨论】:

      【解决方案2】:

      只需备注即可完成@Jeroen's answer

      在 Windows 上,如果您希望 ffmpeg 将输出文件写入特定目录,您应该这样编写:

      ffmpeg -i [INPUT] -f dash [OPTIONS] C:\your\output\directory/test.mpd
      

      ffmpeg source 在输出路径中查找最后一个/ 以拆分文件名和输出目录

      【讨论】:

        【解决方案3】:

        在当前版本中:

        • utc_timing_url:将返回 ISO 格式的 UTC 时间戳的页面 URL
        • 方法:设置HTTP方法
        • http_user_agent:覆盖 HTTP 标头中的 User-Agent 字段
        • http_persistent:使用持久 HTTP 连接
        • hls_playlist:生成 HLS 播放列表文件(master.m3u8, media_%d.m3u8)
        • streaming:启用/禁用输出流模式。每一帧都是moof片段
        • 超时:设置套接字 I/O 操作的超时时间

        【讨论】:

          猜你喜欢
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          • 2016-04-05
          • 1970-01-01
          • 1970-01-01
          • 2017-04-24
          • 1970-01-01
          • 2012-04-04
          相关资源
          最近更新 更多