FFplay 仅在同一目录中播放 MPEG-DASH

FFplay only plays MPEG-DASH when in the same directory

我在 windows 机器上使用来自 ffmpeg 的 libav 的 dashenc.c 创建了一系列视频片段。 mpd 文件是模板化的,因此它相当简单并且通过了验证。视频播放,但前提是我将 ffplay 放在与所有文件相同的文件夹中并使用:

ffplay -i manifest.mpd

如果我尝试从其他目录播放,甚至使用相同的目录:

ffplay -i c:\tmp\manifest.mpd

ffplay -i c:/tmp/manifest.mpd

尝试失败,产生此错误:

[dash @ 0000016ce0d69900] Failed to open an initialization section in playlist 0
[dash @ 0000016ce0d69900] Error when loading first fragment, playlist 0
C:/tmp/manifest.mpd: Invalid argument

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="2020-03-23T14:54:16Z"
    publishTime="2020-03-23T14:54:25Z"
    timeShiftBufferDepth="PT4811H53M52.3S"
    minBufferTime="PT9.6S">
    <ProgramInformation>
    </ProgramInformation>
    <Period id="0" start="PT0.0S">
        <AdaptationSet id="0" contentType="video" segmentAlignment="true" bitstreamSwitching="true">
            <Representation id="0" mimeType="video/mp4" codecs="avc1.42001e" bandwidth="5953124" width="720" height="480">
                <SegmentTemplate timescale="1000000" duration="5000000" availabilityTimeOffset="4.967" initialization="init-stream$RepresentationID$.m4s" media="media-stream$RepresentationID$-$Number%06d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>

添加 BaseUrl 元素没有帮助;我的猜测是我格式错误。有什么想法可以解决这个问题吗?

问题似乎在于 ffplay 需要 URL 作为其输入参数。在内部,不考虑 .mpd 文件的 Windows 绝对文件路径和段的相对路径的组合,虽然您可以在 ffmpeg 之外手动调整 .mpd 文件以使其可以接受 dashdec.c,你不能让 dashenc.c 以 dashdec.c 可以使用它的方式创建它(除非在生成单个 .mp4 文件的情况下,这将允许你创建单个 BaseUrl 标记).为了正确查看 .mpd,它必须在 URL 上提供,例如通过网络服务器。