【问题标题】:ffmpeg dash Segment offsetffmpeg dash 段偏移
【发布时间】:2018-06-18 18:02:13
【问题描述】:

我正在尝试将“plex”或“emby”等实时转码与我的应用程序集成。

我可以将 dash 内容提供给 shaka-player 或 dash.js,但仅限于“实时模式”。但我想启用通过播放器进行搜索。

我查看了 plex 并启用它,他们创建了自己的带有持续时间的 mpd 文件,因此播放器将有一个完整的搜索栏。

但是在寻找播放器时会要求一个段号,例如:449。我需要停止 ffmpeg 并以偏移量 (-ss <<segment * sgement_length>>) 重新启动,但 ffmpeg 只会从段 0 重新启动一个带有初始段的转码会话。

我想要的是告诉 ffmpeg 从一个搜索点开始,但只从段号和 now-on 输出。

在玩 hls 和 mpegts 时,我可以告诉 ffmpeg 在某个段输出:使用选项 -segment_start_number 但这不适用于 dash。并且 plex 使用他们自己的基于 ffmpeg 的转码器和选项-skip_to_segment

我试图通过在我的网络服务器上保持手动偏移来“破解”,即使我在搜索点 dash.js 之后提供“假定”正确的段并且 shaka-player 无法恢复流..另一方面,VLC 能够(可能更容忍)段中的错误。

在破折号中查找后假定的正确段(包含初始段)或仅该段。

ffmpeg 是否能够将破折号分段为假定分段(用于查找和恢复)

同样的技术适用于具有强制关键帧和自定义 m3u8(具有所有“预测”段)的 hls,但计算正确的段长度和正确的带宽要困难得多,而且 dash 更能容忍变化。

我真的很希望能够通过我的实时转码视频进行搜索。

这里有一个自定义 mpd 文件作为参考,我用来启用“搜索”:

<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="static"
    suggestedPresentationDelay="PT1S"
    mediaPresentationDuration="PT49M2.920S"
    maxSegmentDuration="PT2S"
    minBufferTime="PT10S">
    <Period start="PT0S" id="0" duration="PT49M2.920S">
        <AdaptationSet segmentAlignment="true">
            <SegmentTemplate timescale="1" duration="1" initialization="$RepresentationID$/initial.mp4" media="$RepresentationID$/$Number$.m4s" startNumber="1">
            </SegmentTemplate>
            <Representation id="0" mimeType="video/mp4" codecs="avc1.640029" bandwidth="3766000" width="1920" height="1080">
            </Representation>
        </AdaptationSet>
        <AdaptationSet segmentAlignment="true">
            <SegmentTemplate timescale="1" duration="1" initialization="$RepresentationID$/initial.mp4" media="$RepresentationID$/$Number$.m4s" startNumber="1">
            </SegmentTemplate>
            <Representation id="1" mimeType="audio/mp4" codecs="mp4a.40.2" bandwidth="188000" audioSamplingRate="48000">
                <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="6"/>
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>

这里是 ffmpeg 命令来完成它:

ffmpeg -ss 0 -i movie.mkv -y -acodec aac -vcodec libx264 -f dash -min_seg_duration 1000000 -individual_header_trailer 0 -pix_fmt yuv420p -vf scale=trunc(min(max(iw\,ih*dar)\,1920)/2)*2:trunc(ow/dar/2)*2 -bsf:v h264_mp4toannexb -profile:v high -level 4.1 -map_chapters -1 -map_metadata -1 -preset veryfast -movflags frag_keyframe+empty_moov -use_template 1 -use_timeline 0 -remove_at_exit 1 -crf 23 -bufsize 7532k -maxrate 3766k -start_at_zero -threads 0 -force_key_frames expr:if(isnan(prev_forced_t),eq(t,t),gte(t,prev_forced_t+1)) -init_seg_name $RepresentationID$/0_initial.mp4 -media_seg_name $RepresentationID$/0_$Number$.m4s /transcoding_temp/Z1GVWEc/index.mpd

media_seg_name 是我在自定义 seek_point 之前添加的位置,假设我想寻找分段 1233,模板将是:

-media_seg_name $RepresentationID$/1233_$Number$.m4s

段将是 1233_1 1233_2 1233_* 所以我可以在寻找后提供正确的段。但播放器没有恢复并仍在下载后续片段。我猜是因为生成了一个新的初始段,并且我在寻找后以某种方式错过了连续播放的标题,但我可能错了。

感谢您的帮助

【问题讨论】:

  • 在挖掘后这是一个演示时间问题,因为使用来自 ffmpeg 的选项 -ss 创建的块没有时间偏移,因此该段的内容包含一个标记为 eareliest_presentation_time 的 0 而不是由 -ss 选项设置的时间。除了在二进制级别修改段之外,有没有办法解决这个问题,我不知道如何......
  • 您最终找到解决方案了吗?我目前正在尝试解决同样的问题。

标签: ffmpeg mpeg-dash transcoding dash.js shaka


【解决方案1】:

您显示的清单是静态清单,这意味着它不是实时服务流。如果您想让客户端能够搜索仍在运行的实时流,则需要定义 MPD@timeShiftBufferDepth 属性。

动态清单示例:https://vm2.dashif.org/livesim/testpic_2s/Manifest.mpd

与播放器合作:http://reference.dashif.org/dash.js/v2.6.4/samples/dash-if-reference-player/index.html?url=https://vm2.dashif.org/livesim/testpic_2s/Manifest.mpd

也许使用这个工作示例作为参考,以确定您的实现在哪里不同?

【讨论】:

  • 谢谢。我看了看它,但从某种意义上说,它并没有真正帮助我,我的问题是分段生成,因为破折号播放器在它要求它的那一刻不认为我的分段处于有效的演示时间并且播放器停顿. timeShiftBufferDepth 实际上为我提供了一个搜索栏以及静态提要。事实上,我正在尝试在后台模拟一个带有转码器的静态文件,如果这确实有意义的话......
猜你喜欢
  • 2016-01-25
  • 1970-01-01
  • 2018-05-05
  • 2012-04-24
  • 2020-06-13
  • 1970-01-01
  • 2021-07-08
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多