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

62

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

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

Existe alguma maneira de fazer isso

user3181614
fonte

Respostas:

44

Não acredito que youtube-dlsozinho 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 -iparâmetro 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 -ssparâmetro nesta posição indica para descartar todas as entradas até 15 segundos no vídeo. A -topção declara capturar por 10 segundos. O restante do comando diz para armazenar como um mp4.

O ffmpeg é uma ferramenta popular e deve estar em qualquer um dos gerenciadores populares de repositórios / pacotes de SO.

Johnnie
fonte
8
Então, basicamente, você ainda tem que baixar o vídeo inteiro e cortá-la a si mesmo
Antony
12
Você pode usar a opção -to em vez de -t se desejar especificar o tempo para finalizar a fatia do vídeo. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
5
O @Antony ffmpegfará o download apenas da parte que você especificar.
precisa saber é o seguinte
Ele não salva de áudio para um vídeo no meu caso, ao contrário @godofgrunts responder.
daGo
17
ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv
Steve Goranson
fonte
5
Você poderia explicar o que faz e como funciona?
user259412
3
É apenas uma versão mais concisa da resposta @godofgrunts, usando sed para economizar algum tempo, capturando manualmente os URLs e copiando / colando nos horários de início (-ss 00:05). O @godofgrunts possui alguns sinalizadores extras -map 0:v -map 1:a -c:v libx264 -c:a aacque podem melhorar a qualidade. Também gosto de acrescentar youtube-dl -f bestvideo+bestaudioque estou recebendo a versão da mais alta qualidade.
9788 Steve Jobs -
ffmpeg.zeranoe.com/builds para Windows.
Wolfpack'08
17

Adicionando à resposta de Johnnie:

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

Agora usa:

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 -ssopção para cada fluxo. Também recomendo fazê-lo cerca de 30 segundos antes e depois usar outro -ss 30para evitar a perda de 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

Resultado:

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 das 43:00 para as 50:10, então vou fazer -ss 42:30(dando-me alguns segundos para capturar um bom quadro-chave) em ambas as entradas e depois -ss 30executar as entradas depois das 43:00.

Depois, usarei mappara mapear o vídeo 0:ve o áudio 1:a(0 significa a primeira entrada, que é o vídeo, e 1 significa a segunda entrada, que é o áudio) e depois escolho minhas opções de codificação.

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
godofgrunts
fonte
11
Obrigado. Eu não tinha certeza de como obter som, para o post do @Johnnie. Sua postagem respondeu.
Manny_Mar 27/06
Uau, eu não sabia que a -ibandeira do ffmpeg poderia receber URLs. puro
Geremia
Qual é a diferença de usar --postprocessor-argsdiretamente no youtube-dl?
daGo
12

Esta solicitação de recurso ainda não foi implementada no youtube-dl. Veja a edição # 622 e muitas duplicatas no github.

ks1322
fonte
9

youtube-dl suporta a passagem 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 consigo ffmpegmesmo depois de baixar o arquivo primeiro.

Kevin
fonte
4
mas isso ainda vai precisar para baixar o vídeo inteiro, em seguida, corte a parte desejada
Kasparov92
Estou recebendo unable to obtain file audio codec with ffprobeerro. Você pode me ajudar com isso? Estou usando o CentOS 7
Hassaan
3
Observe que o -xsinalizador baixa apenas o áudio. Omita-o do comando se desejar áudio e vídeo. :)
grooveplex
2

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

interrompa o download com ^C

  • Eu só tentei isso com mp4
  • não funcionará com vídeo e áudio separados, você precisará de um formato com ambos. Por padrão, o ytdl geralmente obtém vídeo e áudio separados e os mescla. Use -Fpara ver os formatos disponíveis e escolha um mp4que possua ambos. por exemplo, -f18ou -f22geralmente estão lá.
  • você precisará estimar a partir da porcentagem de downloads (que não é linear; a taxa de compactação varia ao longo do tempo).

Sim. É um truque .

Pergunta adicional: se você deseja os formatos de vídeo e áudio separados, pode baixar parte de cada um separadamente (usando ^ccomo aqui) e depois mesclá-los manualmente? Eu não acho que funcione para alguns formatos.

hiperpálio
fonte
1

Isso não responde completamente à pergunta do OP, mas há uma maneira de baixar um fluxo do início para uma duração específica sem precisar fazer o download do fluxo completo. Como o YouTube fornece suporte para currículo, poderíamos solicitar conteúdo parcial usando o Rangecabeçalho.

Primeiro buscamos os URLs do 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 ao primeiro URL (que possui um link para o fluxo de vídeo) para buscar a duração total do conteúdo desse fluxo:

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

Agora, dividimos essa duração total do conteúdo pelo total de segundos no vídeo (o vídeo do YouTube tem uma duração de 4 minutos e 7 segundos, ou seja, 247 segundos.) Para obter aproximadamente a duração do conteúdo de 1 segundo:

64380504 / 247 ≈ 260650

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

(adicionamos um para também contabilizar aproximadamente o espaço extra ocupado pelos metadados, que é colocado no início do fluxo)

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

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

Isso deve baixar apenas os primeiros 10 segundos. O arquivo baixado deve poder ser reproduzido, 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 semelhante (a duração do conteúdo seria diferente, mas o total de segundos permanecerá o mesmo).

O download de qualquer parte do meio do vídeo também deve ser possível dessa maneira, mas provavelmente será muito mais complicado, porque o YouTube coloca os metadados no início do fluxo (nos primeiros bytes) e sem que ele esteja presente na mídia baixada, o o stream não será reproduzido.

EDIT: isso funcionará apenas em sites com suporte para currículo, diz o YouTube. Não funcionará para outros sites.

ritiek
fonte
0

Use o parâmetro --postprocessor-args para passar a saída de áudio / vídeo para o ffmpeg a ser editado (o processador), portanto, é necessário instalar o ffmpeg.

--postprocessor-args recebe 3 argumentos e valores (por exemplo, há mais, consulte a página de manual do ffmpeg):

  • -ss HH: MM: SS: hora de começar a tomar
  • -para HH: MM: SS: hora de término
  • -t HH: MM: SS: tempo necessário

Exemplos:

  • Comece a codificar em 15 segundos e pare em 1 minuto e 20 segundos

$ youtube-dl --postprocessor-args "-ss 0: 0: 15 a 0: 1: 20" '[video_URL]'

  • Comece a codificar em 15 segundos e leve apenas os próximos 3 minutos e 5 segundos

$ youtube-dl --postprocessor-args "-ss 0: 0: 15 -t 0: 3: 5" '[video_URL]'

PS: o youtube-dl fará o download de toda a mídia antes de processá-la e depois a removerá.

niainaLens
fonte