ffmpegmanifestyoutube-dlmpdstreamlink

FFMPEG: How to manually select video quality from mpd manifest?


I want to ask what command should I use to select video quality from mpd manifest?

mpd manifest link

https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6.mpd

Here, the mpd file:

<?xml version="1.0" encoding="utf-8"?>
<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 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" xmlns:mspr="urn:microsoft:playready" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediaPresentationDuration="PT7M59.240000S" minBufferTime="PT0S" maxSegmentDuration="PT4S">
  <Period duration="PT7M59.240000S">
    <AdaptationSet id="1" group="1" mimeType="audio/mp4" lang="en" contentType="audio" minBandwidth="32000" maxBandwidth="64000">
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/><ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="5094c697-d5c4-84b7-cf4f-7830ba7d58a8" />      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
      <Representation id="mp4a_32000_eng=6" bandwidth="32000" audioSamplingRate="22050" codecs="mp4a.40.2">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
        <SegmentTemplate timescale="10000000" initialization="kiko-season1-eps1-mobil-kabur-anv6-$RepresentationID$-init.mp4" media="kiko-season1-eps1-mobil-kabur-anv6-$RepresentationID$-$Time$.mp4">
          <SegmentTimeline>
            <S t="0" d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" r="1" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="3715193" />
          </SegmentTimeline>
        </SegmentTemplate>
      </Representation>
      <Representation id="mp4a_64000_eng=2" bandwidth="64000" audioSamplingRate="22050" codecs="mp4a.40.2">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
        <SegmentTemplate timescale="10000000" initialization="kiko-season1-eps1-mobil-kabur-anv6-$RepresentationID$-init.mp4" media="kiko-season1-eps1-mobil-kabur-anv6-$RepresentationID$-$Time$.mp4">
          <SegmentTimeline>
            <S t="0" d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" r="1" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758731" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" r="1" />
            <S d="35758730" />
            <S d="36223130" />
            <S d="35758730" />
            <S d="36223129" />
            <S d="3715193" />
          </SegmentTimeline>
        </SegmentTemplate>
      </Representation>
    </AdaptationSet>
    <AdaptationSet id="2" group="2" frameRate="25" mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minBandwidth="150119" maxBandwidth="5002530" minWidth="256" maxWidth="1920" minHeight="144" maxHeight="1080">
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/><ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="5094c697-d5c4-84b7-cf4f-7830ba7d58a8" />      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
      <SegmentTemplate timescale="10000000" initialization="kiko-season1-eps1-mobil-kabur-anv6-$RepresentationID$-init.mp4" media="kiko-season1-eps1-mobil-kabur-anv6-$RepresentationID$-$Time$.mp4">
        <SegmentTimeline>
          <S t="0" d="36000000" r="132" />
          <S d="4400000" />
        </SegmentTimeline>
      </SegmentTemplate>
      <Representation id="avc1_150119=5" bandwidth="150119" width="256" height="144" codecs="avc1.4d400c" />
      <Representation id="avc1_500565=7" bandwidth="500565" width="640" height="360" codecs="avc1.4d401e" />
      <Representation id="avc1_1001193=9" bandwidth="1001193" width="854" height="480" codecs="avc1.4d401e" />
      <Representation id="avc1_2502286=1" bandwidth="2502286" width="1280" height="720" codecs="avc1.4d401f" />
      <Representation id="avc1_5002530=3" bandwidth="5002530" width="1920" height="1080" codecs="avc1.4d4028" />
    </AdaptationSet>
  </Period>
</MPD>

The video is not encrypted with DRM. When I tried to download with FFmpeg, success, but FFmpeg automatically select the worst quality (144p).

FFmpeg command I use:

ffmpeg -i https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6.mpd -c copy kiko1.mp4

Result from ffmpeg

ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[dash @ 0x562ae2e98000] Opening '[URL]https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6-avc1_150119=5-init.mp4[/URL]' for reading [dash @ 0x562ae2e98000] Could not read complete fragment.
[dash @ 0x562ae2e98000] Opening '[URL]https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6-avc1_150119=5-0.mp4[/URL]' for reading
[dash @ 0x562ae2e98000] Opening '[URL]https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6-mp4a_32000_eng=6-init.mp4[/URL]' for reading [dash @ 0x562ae2e98000] Could not read complete fragment.
[dash @ 0x562ae2e98000] Opening '[URL]https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6-mp4a_32000_eng=6-0.mp4[/URL]' for reading
[aac @ 0x562ae32ced00] channel element 2.3 is not allocated
[h264 @ 0x562ae32cc500] top block unavailable for requested intra mode -1
[h264 @ 0x562ae32cc500] error while decoding MB 0 0, bytestream 38
[h264 @ 0x562ae32cc500] concealing 144 DC, 144 AC, 144 MV errors in I frame
Input #0, dash, from '[URL]https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6.mpd[/URL]':
  Duration: 00:07:59.00, start: 0.000000, bitrate: 0 kb/s 
Program 0
     Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 256x144 [SAR 1:1 DAR 16:9], 153 kb/s, 25 fps, 25 tbr, 10000k tbn, 50 tbc  
     Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 32 kb/s
Output #0, mp4, to 'kiko1.mp4': 
   Metadata:   
      encoder         : Lavf57.83.100   
      Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 256x144 [SAR 1:1 DAR 16:9], q=2-31, 153 kb/s, 25 fps, 25 tbr, 10000k tbn, 10000k tbc
Stream mapping: 
   Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[dash @ 0x562ae2e98000] Opening '[URL]https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6-mp4a_32000_eng=6-36223129.mp4[/URL]' for reading
[dash @ 0x562ae2e98000] Opening '[URL]https://anevia115(dot)mncnow(dot)id/vod/eds/kiko-season1-eps1-mobil-kabur-anv6/_/sa_dash_vmx/kiko-season1-eps1-mobil-kabur-anv6-avc1_150119=5-36000000.mp4[/URL]' for reading
....
....
frame=11978 fps= 99 q=-1.0 Lsize=    8891kB time=00:07:59.08 bitrate= 152.0kbits/s speed=3.97x
video:8779kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.269990%

Tried youtube-dl & streamlink but failed. So, I use FFmpeg because it success to download the video and audio. I have read FFmpeg documentation but I have no idea what command should I use. What command should I use to select another quality? (ex: audio 64 kbps, video: 720p)

Note: just change (dot) to .


Solution

  • If you know the streams that are in the manifest (the representation sets) then you can use ffmpeg's "map" parameter. You can list the stream map with ffprobe

    ffprobe yourmanifest.mpd
    

    You'll get something like

    Input #0, dash, from 'manifest.mpd':
      Duration: 00:27:36.00, start: -0.042667, bitrate: 0 kb/s
      Program 0
        Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 412 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
        Metadata:
          variant_bitrate : 1745920
          id              : video/avc1/1705k
        Stream #0:1: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 682x384 [SAR 1024:1023 DAR 16:9], 89 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
        Metadata:
          variant_bitrate : 296960
          id              : video/avc1/290k
        Stream #0:2(en): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 65 kb/s (default)
        Metadata:
          variant_bitrate : 67335
          id              : audio/en/mp4a/64k
    

    And now you can convert the manifest to an MP4 with

    ffmpeg -i yourmanifest.mpd -map 0:1 -map 0:2 -codec copy output.mp4
    

    That'll give you an MP4 with the 2nd video stream (the "290k" from my sample at index 1) and the audio stream which is at index 2.