Вопрос или проблема
ffmpeg -i {file} -deadline good -movflags +faststart -map_metadata -1 \
-c:a libopus -c:v libvpx-vp9 -pix_fmt yuv420p \
-map 0:a:0 -b:a:0 128k \
-map 0:v:0 -filter:v:0 scale=-1:144 -b:v:0 60k \
-map 0:v:0 -filter:v:1 scale=-1:240 -b:v:0 120k \
-init_seg_name "init-$RepresentationID$.$ext$"\
-media_seg_name "sg-$RepresentationID$-$Number%05d$.$ext$" \
-dash_segment_type webm \
-use_template 1 -use_timeline 1 -seg_duration 9 \
-adaptation_sets "id=0, streams=v id=0, streams=a" \
-f dash manifest.mpd
На выходе я получаю: manifest.mpd
<?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="PT8M18.9S"
maxSegmentDuration="PT9.0S"
minBufferTime="PT32.0S">
<ProgramInformation>
</ProgramInformation>
<ServiceDescription id="0">
</ServiceDescription>
<Period id="0" start="PT0.0S">
<AdaptationSet id="0" contentType="video" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true" frameRate="30/1" maxWidth="1934" maxHeight="1080" par="16:9">
<Representation id="1" mimeType="video/webm" codecs="vp09.00.11.08" bandwidth="60000" width="258" height="144" sar="128:129">
<SegmentTemplate timescale="1000" initialization="init-$RepresentationID$.webm" media="sg-$RepresentationID$-$Number%05d$.webm" startNumber="1">
<SegmentTimeline>
<S t="7" d="12800" r="37" />
<S d="12466" />
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="2" mimeType="video/webm" codecs="vp09.00.20.08" bandwidth="150000" width="430" height="240" sar="128:129">
<SegmentTemplate timescale="1000" initialization="init-$RepresentationID$.webm" media="sg-$RepresentationID$-$Number%05d$.webm" startNumber="1">
<SegmentTimeline>
<S t="7" d="16000" r="30" />
<S d="2866" />
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="0" contentType="audio" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true">
<Representation id="0" mimeType="audio/webm" codecs="opus" bandwidth="128000" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
<SegmentTemplate timescale="1000" initialization="init-$RepresentationID$.webm" media="sg-$RepresentationID$-$Number%05d$.webm" startNumber="1">
<SegmentTimeline>
<S t="0" d="9001" />
<S d="9000" r="53" />
<S d="3934" />
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Как правильно выполнить команду, чтобы выходная структура манифеста была следующей? Загрузил с официального сайта. Она верная, не понимаю, что…
https://dash.akamaized.net/akamai/bbb_30fps/bbb_with_multiple_tiled_thumbnails.mpd
<MPD mediaPresentationDuration="PT634.566S" minBufferTime="PT2.00S" profiles="urn:hbbtv:dash:profile:isoff-live:2012,urn:mpeg:dash:profile:isoff-live:2011" type="static" 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">
<BaseURL>./</BaseURL>
<Period>
<AdaptationSet id="1" mimeType="video/mp4" contentType="video" subsegmentAlignment="true" subsegmentStartsWithSAP="1" par="16:9">
<SegmentTemplate duration="120" timescale="30" media="$RepresentationID$/$RepresentationID$_$Number$.m4v" startNumber="1" initialization="$RepresentationID$/$RepresentationID$_0.m4v"/>
<Representation id="bbb_30fps_320x180_400k" codecs="avc1.64000d" bandwidth="507246" width="320" height="180" frameRate="30" sar="1:1" scanType="progressive"/>
<Representation id="bbb_30fps_480x270_600k" codecs="avc1.640015" bandwidth="759798" width="480" height="270" frameRate="30" sar="1:1" scanType="progressive"/>
</AdaptationSet>
<AdaptationSet id="2" mimeType="audio/mp4" contentType="audio" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Accessibility schemeIdUri="urn:tva:metadata:cs:AudioPurposeCS:2007" value="6"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<SegmentTemplate duration="192512" timescale="48000" media="$RepresentationID$/$RepresentationID$_$Number$.m4a" startNumber="1" initialization="$RepresentationID$/$RepresentationID$_0.m4a"/>
<Representation id="bbb_a64k" codecs="mp4a.40.5" bandwidth="67071" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Ответ или решение
Для генерации правильной структуры MPD (Media Presentation Description) используется команда FFmpeg, которую вы уже указали. Однако, чтобы достичь желаемой структуры, которая соответствует примеру, приведенному вами, требуется внести несколько изменений и оптимизаций в вашу команду.
Основные аспекты:
-
Формат и кодеки: Убедитесь, что используете соответствующий формат для аудио и видео. В вашем примере MPD используются форматы
video/mp4
иaudio/mp4
, тогда как в вашей команде используетсяwebm
. Это может стать причиной различий. -
Структура MPD: Обратите внимание на элементы, такие как
BaseURL
,SegmentTemplate
, и атрибуты, используемые в секцияхAdaptationSet
. -
Длительность и частота кадров: Убедитесь, что указаны правильные значения для
duration
,timescale
, а также значения дляframeRate
,audioSamplingRate
. -
Параметры сегментации: Проверьте параметры сегментации, такие как
subsegmentAlignment
иsubsegmentStartsWithSAP
, которые важны для правильной работы DASH.
Измененная команда FFmpeg:
В зависимости от исходного файла и ваших потребностей, команда может быть изменена следующим образом:
ffmpeg -i {file} -movflags +faststart -map_metadata -1 \
-c:a aac -b:a 64k -ar 48000 \
-c:v libx264 -crf 23 -preset fast -g 30 -keyint_min 30 -pix_fmt yuv420p \
-map 0:a:0 -map 0:v:0 \
-init_seg_name "$RepresentationID$/$RepresentationID$_0.m4v" \
-media_seg_name "$RepresentationID$/$RepresentationID$_$Number$.m4v" \
-dash_segment_type mp4 \
-use_template 1 -use_timeline 1 -seg_duration 2 \
-adaptation_sets "id=1, streams=v id=2, streams=a" \
-f dash manifest.mpd
Разъяснение ключевых параметров:
-
Кодеки: Использование
aac
для аудио иlibx264
для видео соответствуют формату MP4. -
Инициализация и сегменты: Параметры
init_seg_name
иmedia_seg_name
настраивают структуру сегментов. Обратите внимание на путь и структуру файлов, которые вы хотите использовать. -
Параметры адаптации:
adaptation_sets
указывает, как сгруппированы видео и аудио потоки. -
Длительность сегмента: Измените
-seg_duration
для соответствия структуре.
Подводя итоги:
Проверяйте каждый элемент в вашем файле manifest.mpd
, финал которого будет соответствовать вашим ожиданиям. Если вы будете следовать приведенным выше рекомендациям и используете правильные параметры кодирования, ваша команда FFmpeg должна успешно сгенерировать нужную структуру MPD.
Если возникают дополнительные вопросы или требования, пожалуйста, уточняйте.