ffmpeg破折号段偏移

时间:2018-01-09 16:31:41

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

我正在尝试将“plex”或“emby”等实时转码整合到我的应用程序中。

我可以将短片内容提供给shaka-player或dash.js,但仅限于'live-mode'。但是我希望能够通过播放器进行搜索。

我查看plex并启用此功能,他们会创建自己的持续时间的mpd文件,以便玩家拥有完整的搜索栏。

然而,在寻找玩家时会询问一个段号,例如:449。我需要停止ffmpeg并使用偏移(-ss <<segment * sgement_length>>)重新启动,但是ffmpeg将仅从段0重新启动具有初始段的转码会话。

我想要的是告诉ffmpeg从搜索点开始,但只从段号和现在开始输出。

当玩hls和mpegts时,我可以告诉ffmpeg在某个段输出:使用选项-segment_start_number但是这不适用于破折号。而plex使用自己的基于ffmpeg的转码器和-skip_to_segment

选项

我试图通过在我的网络服务器上保持手动偏移来“破解”,即使我在搜索点dash.js和shaka-player无法恢复流之后服务于“假设的”右段。其他habd上的VLC能够(可能更容忍)分段中的错误。

在破折号中搜索(包含初始段)或仅在段之后是假设的右段。

ffmpeg能否开始将短划线分段为假设段(寻找和恢复)

相同的技术在带有强制关键帧和自定义m3u8(具有所有“预测”段)的hls中工作,但是计算正确的段长度和正确的带宽更加困难和破坏,并且破折号更容忍变化。< / p>

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

这里提供的是一个自定义的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_ *所以我可以在搜索后服务于正确的细分。但播放器无法恢复并仍在下载后续片段。我猜是因为生成了一个新的初始段,并且我在搜索之后不知何故错过了连续播放的标题,但我可能错了。

感谢您的帮助

1 个答案:

答案 0 :(得分: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

也许可以使用这个工作示例作为参考来确定实现的不同之处?