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

时间:2016-10-14 15:07:46

标签: ffmpeg mpeg-dash

FFmpeg的格式名为“dash”:

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

<?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中的流,它运行良好。

答案 1 :(得分:0)

只需填写@Jeroen's answer的说明。

在Windows上如果希望ffmpeg将输出文件写入特定目录,则应按如下方式编写:

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

ffmpeg source查找输出路径中的最后/以分割文件名和输出目录

答案 2 :(得分:0)

在当前版本中:

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