我应该如何在ffmpeg中使用破折号(而不是webm_dash_manifest!)格式?

Alt*_*ick 6 ffmpeg mpeg-dash

FFmpeg有一个名为"dash"的格式:

> ffmpeg -formats
...
  E dash            DASH Muxer
...
Run Code Online (Sandbox Code Playgroud)

这可能与libavformat/dashenc.c中的代码相对应.

我可以在网上找到关于如何使用WebM DASH Manifest格式的一些项目,但没有任何关于这个其他DASH格式的内容.

有人能指出我使用命令行或API中的"DASH Muxer"的文档或示例吗?

小智 7

ffmpeg中的破折号复制程序是相当新的,尚未在文档中.通过查看源代码,我设法让它为我的用例工作.它会创建.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
Run Code Online (Sandbox Code Playgroud)

生成的破折号清单如下所示:

<?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>
Run Code Online (Sandbox Code Playgroud)

清单和关联的流在Android上的ExoPlayer中播放.它目前似乎只生成DASH实时清单和视频或纯音频文件.虽然从现场变为VOD是微不足道的(看看DASH规范).我在Android上测试了ExoPlayer中的流,它运行良好.