Как правильно сгенерировать структуру manifest.mpd?

Вопрос или проблема

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, которую вы уже указали. Однако, чтобы достичь желаемой структуры, которая соответствует примеру, приведенному вами, требуется внести несколько изменений и оптимизаций в вашу команду.

Основные аспекты:

  1. Формат и кодеки: Убедитесь, что используете соответствующий формат для аудио и видео. В вашем примере MPD используются форматы video/mp4 и audio/mp4, тогда как в вашей команде используется webm. Это может стать причиной различий.

  2. Структура MPD: Обратите внимание на элементы, такие как BaseURL, SegmentTemplate, и атрибуты, используемые в секциях AdaptationSet.

  3. Длительность и частота кадров: Убедитесь, что указаны правильные значения для duration, timescale, а также значения для frameRate, audioSamplingRate.

  4. Параметры сегментации: Проверьте параметры сегментации, такие как 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

Разъяснение ключевых параметров:

  1. Кодеки: Использование aac для аудио и libx264 для видео соответствуют формату MP4.

  2. Инициализация и сегменты: Параметры init_seg_name и media_seg_name настраивают структуру сегментов. Обратите внимание на путь и структуру файлов, которые вы хотите использовать.

  3. Параметры адаптации: adaptation_sets указывает, как сгруппированы видео и аудио потоки.

  4. Длительность сегмента: Измените -seg_duration для соответствия структуре.

Подводя итоги:

Проверяйте каждый элемент в вашем файле manifest.mpd, финал которого будет соответствовать вашим ожиданиям. Если вы будете следовать приведенным выше рекомендациям и используете правильные параметры кодирования, ваша команда FFmpeg должна успешно сгенерировать нужную структуру MPD.

Если возникают дополнительные вопросы или требования, пожалуйста, уточняйте.

Оцените материал
Добавить комментарий

Капча загружается...