「plex」や「emby」などのライブ トランスコーディングをアプリケーションに統合しようとしています。
shaka-player または dash.js にダッシュ コンテンツを提供できますが、「ライブ モード」でのみです。しかし、プレーヤーを介してシークできるようにしたいです。
私はプレックスを見て、これを有効にするために、プレーヤーが完全なシークバーを持つように、持続時間のある独自の mpd ファイルを作成します。
ただし、プレーヤーをシークするときに、たとえば 449 などのセグメント番号を要求します。ffmpeg を停止して offset(-ss <<segment * sgement_length>>)
で再起動する必要がありますが、ffmpeg は最初のセグメントでセグメント 0 からトランスコード セッションを再起動するだけです。
私が欲しいのは、シークポイントで開始するが、セグメント番号からのみ出力するようにffmpegに指示することです。
hls と mpegts で遊んでいるとき、特定のセグメントで出力するように ffmpeg に指示できます : オプションを使用します-segment_start_number
が、これはダッシュでは使用できません。プレックスは、オプションを使用してffmpegに基づく独自のトランスコーダーを使用します-skip_to_segment
シークポイントdash.jsの後に「想定される」右セグメントを提供し、shaka-playerがストリームを回復できない場合でも、Webサーバーに手動オフセットを保持することで「ハック」しようとしました.. VLCの他のhabdは、セグメントのエラーに対して(おそらくより寛容に)できます。
ダッシュ (最初のセグメントを含む) でシークした後の想定される右側のセグメントか、セグメントのみか。
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_* となり、シーク後に正しいセグメントを提供できます。しかし、プレーヤーは回復せず、引き続き後続のセグメントをダウンロードします。新しい初期セグメントが生成され、シーク後に連続再生するためのヘッダーを何らかの形で見逃していると思いますが、おそらく間違っています。
ご協力いただきありがとうございます