Como baixar a parte do vídeo com o comando youtube-dl?

42

Estou usando o Ubuntu e o comando youtube-dl está funcionando perfeitamente.

Quero fazer o download de apenas parte do vídeo que é muito longo. Então, quero baixar apenas alguns minutos do vídeo. Exemplo de 13 minutos a 17 minutos.

Existe alguma maneira de fazer isso

    
por user3181614 18.09.2015 / 08:40

7 respostas

22

Eu não acredito que youtube-dl faça o que você quiser. No entanto, você pode combiná-lo com um utilitário de linha de comando como o ffmpeg.

Primeiro, adquira o URL real usando o youtube-dl:

youtube-dl -g "https://www.youtube.com/watch?v=V_f2QkBdbRI"

Copie a saída do comando e cole-a como parte do parâmetro -i do próximo comando:

ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:00:15.00 -t 00:00:10.00 -c copy out.mp4

O parâmetro -ss nesta posição declara descartar todas as entradas até 15 segundos no vídeo. A opção -t indica a captura por 10 segundos. O resto do comando diz para armazenar como um mp4.

O ffmpeg é uma ferramenta popular e deve estar em qualquer repositório / gerenciador de pacotes do sistema operacional.

    
por 11.05.2016 / 05:57
9

Esta solicitação de recurso ainda não está implementada no youtube-dl. Consulte o problema # 622 e muitas cópias dele no github.

    
por 16.01.2017 / 21:41
6

Adicionando à resposta de Johnnie:

Use youtube-dl -g "URL" para obter os streams de vídeo e áudio.

Agora use:

ffmpeg -ss 12:15 -i "1st-URL" -ss 12:15 -i "2nd-URL" -t 5:15 -map 0:v -map 1:a -c:v libx264 -c:a aac output.mkv

Você precisará usar a opção -ss para cada fluxo. Eu também recomendo fazê-lo cerca de 30 segundos antes e depois usar outro -ss 30 para evitar perder quadros-chave. Aqui está um exemplo real usando um dos meus vídeos do youtube.

Vídeo

youtube-dl -g https://www.youtube.com/watch?v=gESHIrvIQQo

Saída:

https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/298/source/youtube/requiressl/yes/mn/sn-mv-cvne/ei/BgifWfmmL4iE8wSlv47oCA/mm/31/pl/23/mv/m/ms/au/initcwndbps/11447500/ratebypass/yes/mime/video%2Fmp4/otfp/1/gir/yes/clen/5231968228/lmt/1502479662079137/dur/18575.164/key/dg_yt0/signature/4FFB9B0B7E1703B31F5D07DAD579B55F17EF7BAA.0CB63905C89DD4D33F90CF3AAD728F1ECDFCB9B3/mt/1503594423/ip/206.34.122.70/ipbits/0/expire/1503616102/sparams/ip,ipbits,expire,id,itag,source,requiressl,mn,ei,mm,pl,mv,ms,initcwndbps,ratebypass,mime,otfp,gir,clen,lmt,dur/
https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/140/source/youtube/requiressl/yes/mn/sn-mv-cvne/ei/BgifWfmmL4iE8wSlv47oCA/mm/31/pl/23/mv/m/ms/au/initcwndbps/11447500/ratebypass/yes/mime/audio%2Fmp4/otfp/1/gir/yes/clen/295235970/lmt/1502480001536214/dur/18575.243/key/dg_yt0/signature/4CD42047D1D5C714377350905C1CC5CBA37C0009.6EED1FC92D17A096235C32E48F4B15DEF7DD99B0/mt/1503594423/ip/206.34.122.70/ipbits/0/expire/1503616102/sparams/ip,ipbits,expire,id,itag,source,requiressl,mn,ei,mm,pl,mv,ms,initcwndbps,ratebypass,mime,otfp,gir,clen,lmt,dur/

Eu queria cortar de 43:00 a 50:10, então vou fazer -ss 42:30 (dando-me alguns segundos para pegar um bom quadro-chave) nas duas entradas e depois fazer um -ss 30 depois das entradas para começar às 43:00.

Em seguida, utilizarei map para mapear o vídeo 0:v e o áudio 1:a (0 significa a primeira entrada, que é o vídeo e 1 significa a segunda entrada, que é o áudio) e depois a minha codificação opções.

ffmpeg -ss 42:30 -i "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/298/source/youtube/requiressl/yes/pl/23/ei/5wCfWY6dBeOj8gSSxZaACQ/mv/m/initcwndbps/5055000/ms/au/mm/31/mn/sn-mv-cvne/ratebypass/yes/mime/video%2Fmp4/otfp/1/gir/yes/clen/5231968228/lmt/1502479662079137/dur/18575.164/key/dg_yt0/beids/%5B9466591%5D/mt/1503592562/signature/8CCFBF5CAB97341D0CB1F34E85AB6EE20FC7A03E.7679F39A8603CF41A95F10232E2A921EB0774101/ip/206.34.122.70/ipbits/0/expire/1503614279/sparams/ip,ipbits,expire,id,itag,source,requiressl,pl,ei,mv,initcwndbps,ms,mm,mn,ratebypass,mime,otfp,gir,clen,lmt,dur/" -ss 42:30 -i "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/140/source/youtube/requiressl/yes/pl/23/ei/5wCfWY6dBeOj8gSSxZaACQ/mv/m/initcwndbps/5055000/ms/au/mm/31/mn/sn-mv-cvne/ratebypass/yes/mime/audio%2Fmp4/otfp/1/gir/yes/clen/295235970/lmt/1502480001536214/dur/18575.243/key/dg_yt0/beids/%5B9466591%5D/mt/1503592562/signature/4AACC8E27F9036D36D4D623A771A9F2BAC4674BA.7E4F4FB4DC023E3FE491A991F0F9F2329648DE9D/ip/206.34.122.70/ipbits/0/expire/1503614279/sparams/ip,ipbits,expire,id,itag,source,requiressl,pl,ei,mv,initcwndbps,ms,mm,mn,ratebypass,mime,otfp,gir,clen,lmt,dur/" -map 0:v -map 1:a -ss 30 -t 7:10 -c:v libx264 -c:a aac gog-vs-triv.mkv

Espero que isso ajude.

    
por 24.08.2017 / 19:13
5

youtube-dl suporta a transmissão de argumentos para o pós-processador subjacente (testado com a versão 2017.08.27.1):

youtube-dl -x --postprocessor-args "-ss 00:13:00.00 -t 00:04:00.00" https://youtu.be/...

Isso é basicamente o mesmo que fazer o pós-processamento com ffmpeg depois de baixar o arquivo primeiro.

    
por 22.11.2017 / 11:11
4
ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv
    
por 15.09.2017 / 04:55
2

Você pode fazer o download desde o início até um ponto sem baixar a coisa toda e editar. Isso é metade do que essa pergunta faz:

interrupt the download with ^C

  • Eu só tentei isso com mp4
  • não funciona com vídeo e áudio separados, você precisa de um formato com os dois. Por padrão, o ytdl geralmente obtém vídeo e áudio separados e os mescla. Use -F para ver os formatos disponíveis e escolha um mp4 que tenha os dois. por exemplo. -f18 ou -f22 geralmente estão lá.
  • você terá que estimar a porcentagem baixada (o que não é linear; a taxa de compactação varia com o tempo).

Sim. É um hack .

Mais uma pergunta: se você quiser os formatos de áudio e vídeo separados, você poderia fazer o download de uma parte de cada um separadamente (usando ^c como aqui) e depois mesclá-los manualmente? Eu não acho que funcionará em alguns formatos.

    
por 18.02.2018 / 03:40
1

Isso não responde completamente à pergunta do OP, mas existe uma maneira de fazer o download de um fluxo desde o início até uma duração específica sem precisar fazer o download do fluxo completo. Como o YouTube fornece suporte para continuação, poderemos solicitar conteúdo parcial usando o cabeçalho Range .

Primeiramente, buscamos as URLs de fluxo:

$ youtube-dl -g https://www.youtube.com/watch?v=yysk8s2vih8
https://r1---sn-npoeenee.googlevideo.com/videoplayback?source=youtu...
https://r1---sn-npoeenee.googlevideo.com/videoplayback?source=youtu...

Isso deve gerar dois URLs (cada um para fluxos de vídeo e áudio).

Agora, envie uma solicitação de cabeçalho para o primeiro URL (que vincula ao fluxo de vídeo) para buscar o comprimento total do conteúdo desse fluxo:

$ curl "1st-URL" -sI | grep Content-Length
Content-Length: 64380504

Agora, dividimos este comprimento total do conteúdo em segundos no vídeo (o vídeo do YouTube tem uma duração de 4 min e 7 segundos, o que representa 247 segundos.) para obter a duração do conteúdo de 1 segundo:

64380504 / 247 ≈ 260650

Nós multiplicamos esse valor por (número de segundos que queremos buscar desde o início + 1)

(adicionamos um para considerar também o espaço extra obtido pelos metadados que são colocados no início do fluxo)

Por exemplo, para buscar aproximadamente os primeiros 10 segundos, você precisará buscar os primeiros 260650 * 11 = 2867150 bytes, portanto, fazemos uma solicitação com o Range header:

$ curl "1st-URL" -H "Range: bytes=0-2867150" -o ten_secs.mp4

Isso só deve baixar os primeiros 10 segundos. O arquivo baixado deve ser capaz de reproduzir, mas é melhor deixar o FFmpeg corrigir os metadados incorretos:

$ ffmpeg -i ten_secs.mp4 -c copy corrected_ten_secs.mp4

Também podemos baixar apenas a parte inicial do áudio (2º URL) de maneira similar (o tamanho do conteúdo seria diferente, mas o total de segundos permaneceria o mesmo).

O download de qualquer parte do meio do vídeo também deve ser possível dessa forma, mas provavelmente será mais complicado porque o YouTube coloca os metadados no início do fluxo (nos primeiros bytes) e sem estar presente no download mídia, a transmissão não será reproduzida.

    
por 14.10.2018 / 19:06