FFmpeg生成符合第三方系统要求的MPEG-DASH manifest命令调整求助
FFmpeg生成符合第三方系统要求的MPEG-DASH manifest命令调整求助
我正在折腾FFmpeg生成适配第三方播放系统的MPEG-DASH manifest文件,可目前的输出格式和系统要求的对不上,导致流没法正常播放。下面是我的尝试细节和遇到的问题,求各位帮忙看看怎么调整参数才能匹配上目标格式!
当前使用的FFmpeg命令
"$ffmpeg_path" \ -i "$input_file" \ -r 30000/1001 \ -vf "scale=3840:1080" \ -c:v libx265 \ -c:a aac -b:a 128k \ -ar 48000 \ -f dash \ -use_timeline 1 \ -use_template 1 \ -init_seg_name "init-stream\$RepresentationID\$.m4s" \ -media_seg_name "chunk-stream\$RepresentationID\$-\$Number%05d\$.m4s" \ -seg_duration 3 \ "$output_file"
当前命令生成的Manifest内容
<?xml version="1.0" encoding="utf-8"?> <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" mediaPresentationDuration="PT1M35.1S" maxSegmentDuration="PT3.0S" minBufferTime="PT16.8S"> <ProgramInformation> </ProgramInformation> <ServiceDescription id="0"> </ServiceDescription> <Period id="0" start="PT0.0S"> <AdaptationSet id="0" contentType="video" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true" frameRate="30000/1001" maxWidth="3840" maxHeight="1080" par="32:9"> <Representation id="0" mimeType="video/mp4" codecs="hev1" bandwidth="2227590" width="3840" height="1080" sar="1:1"> <SegmentTemplate timescale="30000" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startNumber="1"> <SegmentTimeline> <S t="0" d="247247" /> <S d="250250" r="9" /> <S d="104104" /> </SegmentTimeline> </SegmentTemplate> </Representation> </AdaptationSet> <AdaptationSet id="1" contentType="audio" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true"> <Representation id="1" mimeType="audio/mp4" codecs="mp4a.40.2" bandwidth="128000" audioSamplingRate="48000"> <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="1" /> <SegmentTemplate timescale="48000" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startNumber="1"> <SegmentTimeline> <S t="0" d="143360" /> <S d="144384" r="29" /> <S d="93120" /> </SegmentTimeline> </SegmentTemplate> </Representation> </AdaptationSet> </Period> </MPD>
第三方系统要求的目标Manifest格式
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediaPresentationDuration="PT1M35.7S" minBufferTime="PT5.9S" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd"> <ProgramInformation /> <Period id="0" start="PT0.0S"> <AdaptationSet id="0" contentType="video" segmentAlignment="true" bitstreamSwitching="true"> <Representation id="0" bandwidth="12000000" width="3840" height="1080" frameRate="30000/1001" mimeType="video/mp4" codecs="hev1"> <SegmentTemplate media="chunk-stream$RepresentationID$-$Number%05d$.m4s" initialization="init-stream$RepresentationID$.m4s" startNumber="1" timescale="30000"> <SegmentTimeline> <S t="0" d="89089" r="31" /> <S d="21021" /> </SegmentTimeline> </SegmentTemplate> </Representation> </AdaptationSet> <AdaptationSet id="1" contentType="audio" segmentAlignment="true" bitstreamSwitching="true"> <Representation id="1" bandwidth="1536000" audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2"> <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="16" /> <SegmentTemplate media="chunk-stream$RepresentationID$-$Number%05d$.m4s" initialization="init-stream$RepresentationID$.m4s" startNumber="1" timescale="48000"> <SegmentTimeline> <S t="0" d="143360" /> <S d="142336" r="2" /> <S d="143360" /> <S d="142336" r="3" /> <S d="143360" /> <S d="142336" r="3" /> <S d="143360" /> <S d="142336" r="3" /> <S d="143360" /> <S d="142336" r="3" /> <S d="143360" /> <S d="142336" r="3" /> <S d="143360" /> <S d="142336" r="1" /> <S d="32768" /> </SegmentTimeline> </SegmentTemplate> </Representation> </AdaptationSet> </Period> </MPD>
我观察到的主要差异点
- 带宽配置:当前视频带宽是FFmpeg自动计算的~2.2Mbps,目标要求固定12Mbps;音频当前128Kbps,目标是1536Kbps
- 音频通道配置:
AudioChannelConfiguration的value当前是1,目标是16 - 分段时间线:视频和音频的
SegmentTimeline结构差异极大——当前视频分段时长d值大、重复次数少,目标的d值更小且重复次数多;音频的分段结构也完全不同 - MPD属性:当前
minBufferTime是16.8秒,目标是5.9秒;当前Manifest里有多余的ServiceDescription节点和带空内容的ProgramInformation,目标只有<ProgramInformation /> - AdaptationSet属性:当前的
AdaptationSet带有startWithSAP="1",目标Manifest里没有这个属性 - 媒体属性位置:当前视频的
frameRate等属性在AdaptationSet节点,目标里这些属性在Representation节点
想请教下各位,怎么调整FFmpeg的参数来解决这些差异,让生成的Manifest完全匹配目标格式?尤其是带宽指定、音频通道value、分段时间线和那些节点/属性的调整,实在摸不准对应的参数。
备注:内容来源于stack exchange,提问作者Seth Haberman
相关产品推荐
相关产品推荐

