在shaka packager中记录MPEG-DASH MPD的SegmentTimeline时的算法

问题描述

我通过 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,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,q=-1--1,2000 kb/s,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),s16,139 kb/s
Metadata:
encoder : Lavc58.91.100 libfdk_aac

我的 shaka 打包命令是:

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 &

看打包后生成的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打包器在创建segment和记录SegmentTimeline的内容时会检查TS的PTS或DTS。 但是看MPEG标准文档和DASH-IF文档也看不懂。

我的问题是打包者在创建段时是指 PTS 还是 DTS。 SegmentTimeline 的 S@t 和 S@d 是如何记录的? SegmentTimeline 是用什么算法记录的?请帮我。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)