当前位置: 首页 > 知识库问答 >
问题:

FFMPEG/DASH-LL以不同的速率创建音频和视频块;玩家感到困惑(404个错误)

毛声
2023-03-14

我试图从静态文件创建一个MPEG-DASH“实时”流,以测试各种低延迟模式。FFmpeg中的DASH混音器创建两个适应集,一个用于视频块,一个用于音频块。

但是,音频和视频块文件的创建速率并不相同(应该是吗?)。也就是说,stream0是视频块,stream1是音频块。运行几秒钟后,webroot目录包含:

chunk-stream0-00001.m4s  chunk-stream1-00001.m4s  
chunk-stream0-00002.m4s  chunk-stream1-00002.m4s  
chunk-stream0-00003.m4s  chunk-stream1-00003.m4s  
chunk-stream0-00004.m4s  chunk-stream1-00004.m4s  
                         chunk-stream1-00005.m4s  
                         chunk-stream1-00006.m4s  
                         chunk-stream1-00007.m4s  
                         chunk-stream1-00008.m4s  
                         chunk-stream1-00009.m4s  
master.mpd  
init-stream0.m4s  
init-stream1.m4s  

流不会在dash上加载(或播放)。js或shaka player,视频块有很多404(未找到)错误。玩家依次从stream0和stream1请求块,即stream0-001 stream1-001,然后stream0-002 stream1-002,依此类推。

但是由于stream0只从001到004,因此在尝试加载stream0-005到009时会出现大量404错误。

让FFmpeg运行一段时间后,差距变得更大。例如,stream0是62比75,而stream1是174比187。此时重新加载播放器页面失败,出现dash。全部的调试。js:15615[2055][FragmentController]没有要推送的视频字节或流处于非活动状态 并显示404个错误流0块188(目前还不存在!)

FFmpeg命令是从自上而下的DASH streaming中采用的:

ffmpeg -re -i /mnt/swdevel/TestStreams/H264/ThreeHourMovie.mp4 \
-c:v libx264 -x264-params keyint=120:scenecut=0 -b:v 1M -c:a copy \
-f dash -dash_segment_type mp4 \
 -seg_duration 2 \
 -target_latency 3 \
 -frag_type duration \
 -frag_duration 0.2 \
 -window_size 10 \
 -extra_window_size 3 \
 -streaming 1 \
 -ldash 1 \
 -use_template 1 \
 -use_timeline 0 \
 -write_prft 1 \
 -fflags +nobuffer+flush_packets \
 -format_options "movflags=+cmaf" \
 -utc_timing_url "/pelican/testPlayers/time.php" \
 master.mpd

dash.js播放器代码非常简单:

const srcUrl = "../ottWebRoot/playerTest/master.mpd"; 

var player = dashjs.MediaPlayer().create();

let autoPlay = false;
player.initialize(document.querySelector("#videoTagId"), srcUrl, autoPlay);

player.updateSettings(
{
    streaming :
    {
        lowLatencyEnabled : true,
        liveDelay : 2,
        jumpGaps : true,
        jumpLargeGaps : true,
        smallGapLimit : 1.5,
    }
});

要在清单中提供UTCTiming元素,需要使用较小的时间。phpURL从web服务器返回UTC时间:

<?php
    print gmdate("Y-m-d\TH:i:s\Z");
?>

(它还显示最新流1/音频块的404错误,这可能是一个不同的问题)

我不确定下一步该怎么办。非常感谢您的建议。

编辑一

@Anonymous Coward建议更改密钥间隔,这大大改善了情况。stream0和stream1的块处于锁定阶段,具有相同的序列号。

然而,仍然有许多404错误,无论是在初始页面加载(不按播放)还是在回放过程中。

我运行了watch-n 1 ls-It

如何指示浏览器在获取边缘块之前再等待一点?

编辑二

使用shaka-player代替dash.js可以正常播放,没有404错误。配置为:

    player.configure(
    {
        streaming: 
        {
            lowLatencyMode: true,
            inaccurateManifestTolerance: 0,
            rebufferingGoal: 0.1,
        }
        
    });

客户端

  • MacOS 10.12
  • 冲刺。js最新版本3.2.2
  • Chrome 79、Safari 12、FireFox v

服务器

  • Apache 2.4.37

(以下是FFmpeg生成的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"
    availabilityStartTime="2021-05-24T14:50:00.263Z"
    publishTime="2021-05-24T15:22:45.335Z"
    timeShiftBufferDepth="PT50.0S"
    maxSegmentDuration="PT2.0S"
    minBufferTime="PT5.0S">
    <ProgramInformation>
    </ProgramInformation>
    <ServiceDescription id="0">
        <Latency target="3000" referenceId="0"/>
    </ServiceDescription>
    <Period id="0" start="PT0.0S">
        <AdaptationSet id="0" contentType="video" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true" frameRate="24/1" maxWidth="1280" maxHeight="682" par="15:8" lang="und">
            <Resync dT="200000" type="0"/>
            <Representation id="0" mimeType="video/mp4" codecs="avc1.64081f" bandwidth="1000000" width="1280" height="682" sar="1023:1024">
                <ProducerReferenceTime id="0" inband="true" type="captured" wallClockTime="2021-05-24T14:50:00.263Z" presentationTime="0">
                    <UTCTiming schemeIdUri="urn:mpeg:dash:utc:http-xsdate:2014" value="/pelican/testPlayers/time.php"/>
                </ProducerReferenceTime>
                <Resync dT="5000000" type="1"/>
                <SegmentTemplate timescale="1000000" duration="2000000" availabilityTimeOffset="1.800" availabilityTimeComplete="false" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
        <AdaptationSet id="1" contentType="audio" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true" lang="und">
            <Resync dT="200000" type="0"/>
            <Representation id="1" mimeType="audio/mp4" codecs="mp4a.40.2" bandwidth="116317" audioSamplingRate="48000">
                <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
                <ProducerReferenceTime id="1" inband="true" type="captured" wallClockTime="2021-05-24T14:50:00.306Z" presentationTime="0">
                    <UTCTiming schemeIdUri="urn:mpeg:dash:utc:http-xsdate:2014" value="/pelican/testPlayers/time.php"/>
                </ProducerReferenceTime>
                <Resync dT="21333" type="1"/>
                <SegmentTemplate timescale="1000000" duration="2000000" availabilityTimeOffset="1.800" availabilityTimeComplete="false" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
    </Period>
    <UTCTiming schemeIdUri="urn:mpeg:dash:utc:http-xsdate:2014" value="/pelican/testPlayers/time.php"/>
</MPD>

共有2个答案

庄高谊
2023-03-14

我对Exoplayer也观察到了同样的情况。但是,如果我设置值“-use_timeline 1”,问题就不存在了。但是,将use_timeline设置为1时,模板上不会有部分线段。我不确定这是ffmpeg的错误。

叶坚
2023-03-14

输入,ThreeHourMovie。mp4的帧速率为24Hz(参见AdaptationSet@frameRate),因此将keyint设置为120将在x264的输出处每五秒给出一个IDR。

您正在指示DASH混音器(通过seg_duration)输出2s段并发出信号,但这是不可能的,因为段必须以IDR开头(如您链接的指南中所述)。因此,混音器输出5s段,但在清单中发出2s信号,这显然是不正确的。

keyint更改为seg_duration的正确倍数(在这种情况下,即keyint=48),它可能会开始工作。

 类似资料:
  • 使用ffmpeg concat连接多个文件似乎会导致音频的时间戳或偏移不匹配。我试过几个视频,发现H.264/MP4也有同样的问题。 使用并对视频进行编码似乎可以很好地工作。当ffmpeg执行全部转换计算时,音频保持同步,似乎可以得到所有正确的结果。 然而,简单地将视频级联而不进行任何转换或编码会导致同步问题缓慢增加。显然,对视频进行编码而不是简单地加入它们将导致信息/质量的损失,所以我宁愿找到一

  • 我有两个视频和两个音频 1:-视频1-长度:-60秒||音频1-长度:-15秒 2:-视频-长度:-86秒| |音频2-长度:-18秒 同时播放video1和audio1,如果audio1结束,则重新启动该音频,直到video1结束。这将是最后的视频1。 同样的方式, 同时播放video2和audio2,如果audio2结束,则重新启动该音频,直到video2结束。这将是最后的视频2。 之后,将最

  • 我有一个长音频部分和一个短视频部分,我想在一起mux。 我正在尝试使用以下命令进行MUX: video_0-0002.h264-整个文件(2秒长) Audio.wav-从4秒到6秒 但音频被搞砸了...我怎样才能正确地做呢? 也试过了,听起来好像最后还是有寂静。

  • 我已经使用程序youtube-dl下载了一个YouTube播放列表,我选择了单独下载视频和音频,我现在有一个文件夹充满了视频及其相应的音频,我希望与ffmpeg合并在一起。 我需要使用批处理脚本来执行此操作,但问题是youtube-dl在原始文件的标题之后添加了临时字母,因此视频与其对应的音频没有相同的名称,文件名如下所示: 如何使用windows批处理脚本和ffmpeg合并这些多个视频/音频文件

  • 当试图将source.mp4编码为多个比特率和大小以便自适应HLSv3回放时,所产生的音频和视频逐渐不同步。当擦洗到稍后的点,它似乎重置,并保持同步。 我正在使用最新的FFMPEG4.2.1通过自制-ffmpeg,使用libfdk-aac编解码器。注意,这也发生在FFMPEG4.1中。 音频和视频流很少,这会导致这个问题吗? 以下是源文件中的一些元数据: 和编码命令:

  • 我想从视频中提取对齐的音频流。目标是获得与视频精确对齐的音频序列。 问题:视频和音频序列不对齐。输出音频持续时间比视频输入短。 要复制的脚本: 我的尝试(没有成功): 按照此答案中的建议添加 添加,同时导出视频(链接) 在Audacity中打开。那里的持续时间是 在VLC中打开。持续时间: 显式设置帧率 其他视频文件 如果能给我一些建议,我将不胜感激。非常感谢。