ytdl-org / youtube-dl

Command-line program to download videos from YouTube.com and other video sites
http://ytdl-org.github.io/youtube-dl/
The Unlicense
132.32k stars 10.03k forks source link

RTVE.es videos [rtve.alacarta] aren't fluid #25382

Open gcapizzi opened 4 years ago

gcapizzi commented 4 years ago

Checklist

Verbose log

❯ youtube-dl -v --external-downloader aria2c --external-downloader-args '-c -j 3 -x 3 -s 3 -k 1M' --all-subs --embed-subs --postprocessor-args '-fflags +igndts' https://www.rtve.es/alacarta/videos/estoy-vivo/estoy-vivo-capitulo-1/4203918/
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: [u'-v', u'--external-downloader', u'aria2c', u'--external-downloader-args', u'-c -j 3 -x 3 -s 3 -k 1M', u'--all-subs', u'--embed-subs', u'--postprocessor-args', u'-fflags +igndts', u'https://www.rtve.es/alacarta/videos/estoy-vivo/estoy-vivo-capitulo-1/4203918/']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2020.05.08
[debug] Python version 2.7.16 (CPython) - Darwin-19.3.0-x86_64-i386-64bit
[debug] exe versions: avconv 12.3, avprobe 12.3, ffmpeg 4.2.2, ffprobe 4.2.2, rtmpdump 2.4
[debug] Proxy map: {}
[rtve.es:alacarta] Fetching manager info
[rtve.es:alacarta] 4203918: Downloading JSON metadata
[rtve.es:alacarta] 4203918: Downloading url information
[rtve.es:alacarta] 4203918: Downloading m3u8 information
[rtve.es:alacarta] 4203918: Downloading subtitles info
[debug] Default format spec: bestvideo+bestaudio/best
[info] Writing video subtitles to: Estoy vivo - Temporada 1 - Capítulo 1-4203918.es.vtt
[debug] Invoking downloader on u'https://rtve-hlsvod.secure.footprint.net/resources/TE_GL23/mp4/4/2/1504716904424.mp4/1504716904424-audio_eng=96000-video_eng=1493000.m3u8?hls_minimum_fragment_length=6&hls_client_manifest_version=3'
[download] Destination: Estoy vivo - Temporada 1 - Capítulo 1-4203918.mp4
[download] 100% of 797.72MiB
[debug] ffmpeg command line: ffprobe -show_streams 'file:Estoy vivo - Temporada 1 - Capítulo 1-4203918.mp4'
[ffmpeg] Fixing malformed AAC bitstream in "Estoy vivo - Temporada 1 - Capítulo 1-4203918.mp4"
[debug] ffmpeg command line: ffmpeg -y -loglevel 'repeat+info' -i 'file:Estoy vivo - Temporada 1 - Capítulo 1-4203918.mp4' -c copy -f mp4 '-bsf:a' aac_adtstoasc -fflags '+igndts' 'file:Estoy vivo - Temporada 1 - Capítulo 1-4203918.temp.mp4'
[ffmpeg] Embedding subtitles in 'Estoy vivo - Temporada 1 - Capítulo 1-4203918.mp4'
[debug] ffmpeg command line: ffmpeg -y -loglevel 'repeat+info' -i 'file:Estoy vivo - Temporada 1 - Capítulo 1-4203918.mp4' -i 'file:Estoy vivo - Temporada 1 - Capítulo 1-4203918.es.vtt' -map 0 -c copy -map '-0:s' -map '-0:d' '-c:s' mov_text -map '1:0' '-metadata:s:s:0' 'language=spa' -fflags '+igndts' 'file:Estoy vivo - Temporada 1 - Capítulo 1-4203918.temp.mp4'
Deleting original file Estoy vivo - Temporada 1 - Capítulo 1-4203918.es.vtt (pass -k to keep)

Description

After post-processing, videos downloaded from RTVE Alacarta don't look fluid. This is due to the TS stream containing invalid PTS and ffmpeg correcting them in a way that results in non-fluid playback. More details can be found at this SO answer.

As the answer suggests, this can be fixed by using ffmpeg's igndts format flag. I'm trying to pass --postprocessor-args '-fflags +igndts' to youtube-dl but it's not helping, as ffmpeg options need to be specified before the file they apply on:

As a general rule, options are applied to the next specified file. Therefore, order is important, and you can have the same option on the command line multiple times. Each occurrence is then applied to the next input or output file. Exceptions from this rule are the global options (e.g. verbosity level), which should be specified first.

This is unfortunate, as output options only work when applied before the output file (but after the input file) and viceversa. We have no way to tell what the user wants, unless we introduce separate options for input args and output args.

My questions:

Happy to help with PRs once we find out a way forward. Thanks!

felisucoibi commented 4 years ago

I've never had problems with rtve videos, maybe is your ffmeg config? Tell me example

gcapizzi commented 4 years ago

@felisucoibi nope, you can see the ffmpeg command in the debug output. Also, I have a local copy of youtube-dl patched to put the opts before the input files and it fixes the problem.

For a video example of the problem + an explanation of why it happens and a fix, see the Stack Overflow answer I linked to.

felisucoibi commented 4 years ago

If you can give me a example of video of rtve with this problem, i don't have any problems and i downloaded a lot fo them. (or maybe i don't see it, please give a example), wait you mean this "fixing malformed aac)

gcapizzi commented 4 years ago

I pasted the output of a download (including the URL) in the issue. Alternatively, just try any episode of Estoy Vivo or El Ministerio del Tiempo.

felisucoibi commented 4 years ago

And you can see the problem when watching the video? i never noticed something strange in the video.

gcapizzi commented 4 years ago

Have you tried my example? The playback it not fluid and almost trembling, like this example.

If you try to run the ffmpeg command manually, you'll see a lot of errors like these:

[mpegts @ 0x7fabfe802a00] Invalid timestamps stream=1, pts=21153600, dts=21160800, size=1936
[mpegts @ 0x7fabfe802a00] Invalid timestamps stream=1, pts=21160800, dts=21164400, size=2827
[mp4 @ 0x7fabff005000] Invalid DTS: 10800 PTS: 3600 in output stream 0:0, replacing by guess
[mp4 @ 0x7fabff005000] Invalid DTS: 14400 PTS: 10800 in output stream 0:0, replacing by guess

The reason is that the RTVE stream has invalid presentation timestamps. Here is an explanation from someone who helped me fix the issue:

Frames in video streams with B-frames are not encoded or stored in presentation order, so the presentation timestamps have to be correctly offset for fluid playback. In this TS sample, you have presentation timestamps earlier than decoding timestamps, which are invalid, and ffmpeg defaults to assigning the DTS as the new PTS.

This can be fixed by passing -fflags +igndts to ffmpeg before the input file, e.g.:

ffmpeg -fflags +igndts -i all.ts -c copy all.mp4
felisucoibi commented 2 years ago

There is PR to fix this? some of the movies downloaded from rtve does not andthere are errors in the mkv probably due to this sync problem.