Алгоритм при записи временной линии сегмента MPEG-DASH MPD в упаковщике shaka

#ffmpeg #streaming #mpeg-dash

Вопрос:

Я упаковал медиапоток с помощью mpeg-dash, перекодировав видео с удвоенной скоростью и аудио с нормальной скоростью. Вот команда:

 ffmpeg -re -stream_loop -1 -i timing_logic.mp4 -c:v hevc_nvenc -filter:v "setpts=2*PTS" -c:a libfdk_aac -map 0:v -map 0:a -f mpegts udp://xxx.xxx.xxx.xxx:xxxx?pkt_size=1316
 

Здесь используется следующая исходная информация:

 Input #0, mpegts, from '/home/test/timing_logic/timing_logic.mp4':
Duration: 00:00:30.22, start: 1.400000, bitrate: 16171 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: hevc (Main 10) (HEVC / 0x43564548), yuv420p10le(tv, bt709), 3840x2160 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 50 tbc
Stream #0:1[0x101](eng): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s Stream mapping:
Stream #0:0 -> #0:0 (hevc (native) -> hevc (hevc_nvenc))
Stream #0:1 -> #0:1 (mp2 (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=0.0 size= 0kB time=-577014:32:22.77 bitrate= -0.0kbits/s speed=N/A
frame= 0 fps=0.0 q=0.0 size= 0kB time=-577014:32:22.77 bitrate= -0.0kbits/s speed=N/A
Output #0, mpegts, to 'udp://xxx.xxx.xxx.xxx:xxxx?pkt_size=1316':
Metadata:
encoder : Lavf58.45.100
Stream #0:0: Video: hevc (hevc_nvenc) (Main 10), p010le, 3840x2160 [SAR 1:1 DAR 16:9], q=-1--1, 2000 kb/s, 50 fps, 90k tbn, 50 tbc
Metadata:
encoder : Lavc58.91.100 hevc_nvenc
Side data:
cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay: N/A
Stream #0:1(eng): Audio: aac (libfdk_aac), 48000 Hz, stereo, s16, 139 kb/s
Metadata:
encoder : Lavc58.91.100 libfdk_aac
 

Моя команда упаковщика шака такова:

 packager  'in=udp://xxx.xxx.xxx.xxx:xxxx,stream=video,init_segment=/home/test/timing_logic/package/video/0/video.mp4,segment_template=/home/test/timing_logic/package/video/0/$Time$.m4s' 
'in=udp://xxx.xxx.xxx.xxx:xxxx,stream=audio,init_segment=/home/test/timing_logic/package/audio/0/audio.mp4,segment_template=/home/test/timing_logic/package/audio/0/$Time$.m4a' 
--segment_duration 5 --fragment_duration 5 --minimum_update_period 5 --min_buffer_time 5 
--preserved_segments_outside_live_window 24 --time_shift_buffer_depth 40 
--allow_codec_switching --allow_approximate_segment_timeline --log_file_generation_deletion 
--mpd_output $OUTPUT/$output_mpd.mpd amp;
 

Если посмотреть на mpd, сгенерированный в результате упаковки, продолжительность аудио в два раза превышает продолжительность видео, а количество сегментов вдвое меньше.
Ниже приводится содержание mpd:

 <?xml version="1.0" encoding="UTF-8"?>
<!--Generated with https://github.com/google/shaka-packager version 5b9fd40-release-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT5S" type="dynamic" publishTime="2021-03-23T10:01:57Z" availabilityStartTime="2021-03-23T09:59:55Z" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT40S">
<Period id="0" start="PT0S">
<AdaptationSet id="0" contentType="audio" segmentAlignment="true">
<Representation id="0" bandwidth="140020" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<SegmentTemplate timescale="90000" initialization="/home/test/timing_logic/package/audio/0/audio.mp4" media="/home/test/timing_logic/package/audio/0/$Time$.m4a" startNumber="16">
<SegmentTimeline>
<S t="6751436" d="449280"/>
<S t="7200716" d="451200"/>
<S t="7651916" d="449280"/>
<S t="8101196" d="374400"/>
<S t="8551196" d="449280"/>
<S t="9000476" d="451200"/>
<S t="9451674" d="449280"/>
<S t="9900956" d="449280"/>
<S t="10350236" d="451200"/>
<S t="10801434" d="374400"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" width="3840" height="2160" frameRate="90000/3600" segmentAlignment="true" par="16:9">
<Representation id="1" bandwidth="1520392" codecs="hvc1.2.4.L153" mimeType="video/mp4" sar="1:1">
<SegmentTemplate timescale="90000" initialization="/home/test/timing_logic/package/video/0/video.mp4" media="/home/test/timing_logic/package/video/0/$Time$.m4s" startNumber="19">
<SegmentTimeline>
<S t="16954440" d="900000" r="4"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>
 

При взгляде на MPD создается впечатление, что упаковщик shaka проверяет PTS или DTS TS при создании сегмента и записи содержимого SegmentTimeline.
Но я не мог понять, даже посмотрев на стандартную документацию MPEG и документацию DASH-IF.

Мой вопрос заключается в том, ссылается ли упаковщик на PTS или DTS при создании сегмента. Как записываются S@t и S@d SegmentTimeline? С помощью какого алгоритма записывается SegmentTimeline? Пожалуйста, помогите мне. Спасибо.