youtube-dl 명령으로 비디오의 일부를 다운로드하는 방법은 무엇입니까?


61

우분투를 사용하고 있으며 youtube-dl 명령이 절대적으로 작동합니다.

너무 긴 비디오의 일부만 다운로드하고 싶습니다. 그래서 비디오의 몇 분만 다운로드하고 싶습니다. 13 분에서 17 분 사이의 예입니다.

그렇게 할 방법이 있습니까?

답변:


44

나는 youtube-dl혼자서 당신이 원하는 것을 할 것이라고 믿지 않습니다 . 그러나 ffmpeg와 같은 명령 행 유틸리티와 결합 할 수 있습니다.

먼저 youtube-dl을 사용하여 실제 URL을 얻으십시오.

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

명령 출력을 복사하여 -i다음 명령 매개 변수의 일부로 붙여 넣으십시오 .

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

-ss이 위치 의 매개 변수는 비디오에 15 초까지 모든 입력을 버립니다. 이 -t옵션은 10 초 동안 캡처 상태를 나타냅니다. 나머지 명령은 mp4로 저장하도록 지시합니다.

ffmpeg는 널리 사용되는 도구이며 널리 사용되는 OS 리포지토리 / 패키지 관리자에 있어야합니다.


8
따라서 기본적으로 전체 비디오를 다운로드하여 직접 자르십시오
Antony

12
비디오 슬라이스 종료 시간을 지정하려면 -t 대신 -to 옵션을 사용할 수 있습니다. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ˆᵛˆ

5
@Antony ffmpeg는 실제로 지정한 부분 만 다운로드합니다.
akaihola

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

5
작동 방식, 작동 방식에 대해 설명해 주시겠습니까?
user259412

3
@godofgrunts 답변의 더 간결한 버전입니다 .sed를 사용하여 수동으로 URL을 가져 와서 시작 시간에 복사 / 붙여 넣기 (-ss 00:05)하는 시간을 절약하십시오. @godofgrunts에는 -map 0:v -map 1:a -c:v libx264 -c:a aac품질을 향상시킬 수 있는 추가 플래그 가 있습니다. 또한 youtube-dl -f bestvideo+bestaudio최고 품질의 버전을 받고 있는지 확인 하기 위해 추가 하고 싶습니다 .
Steve Goranson


16

Johnnie의 답변에 추가 :

youtube-dl -g "URL"비디오 및 오디오 스트림을 얻는 데 사용 합니다.

이제 다음을 사용하십시오.

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

-ss각 스트림에 대해 옵션 을 사용해야합니다 . 또한 약 30 초 전에 실행 한 다음 -ss 30키 프레임이 손실되지 않도록 다른 것을 사용하는 것이 좋습니다 . 다음은 내 YouTube 비디오 중 하나를 사용하는 실제 예입니다.

비디오

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

산출:

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/

43:00에서 50:10으로 줄이고 싶었으므로 -ss 42:30두 입력에 대해 (몇 초 동안 좋은 키 프레임을 잡기 위해) 몇 시간을 -ss 30보내고 입력을 마치고 43:00에 시작하려고합니다.

그런 다음 map비디오 0:v와 오디오 를 매핑하는 데 사용 합니다 1:a(0 은 비디오 인 첫 번째 입력을 의미하고 1은 오디오 인 두 번째 입력을 의미 함). 내 인코딩 옵션을 선택합니다.

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

감사. @Johnnie post의 경우 소리를 얻는 방법을 잘 모르겠습니다. 귀하의 게시물이 답변했습니다.
Manny_Mar

와우, 나는 ffmpeg의 -i깃발이 URL을 취할 수 있다는 것을 몰랐다 . 깔끔한
Geremia

12

이 기능 요청은 아직 youtube-dl에서 구현되지 않았습니다. github에서 # 622 이슈 와 많은 사본을 참조하십시오 .


9

youtube-dl 기본 포스트 프로세서에 인수 전달을 지원합니다 (버전 2017.08.27.1으로 테스트).

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

이것은 기본적으로 ffmpeg파일을 먼저 다운로드 한 후 후 처리를하는 것과 같습니다 .


4
그러나 이것은 여전히 ​​전체 비디오를 다운로드 한 다음 원하는 부분을 잘라 내야합니다.
Kasparov92

unable to obtain file audio codec with ffprobe오류 가 발생했습니다. 저 좀 도와주세요. 저는 CentOS 7
Hassaan을

3
점을 유의 -x플래그는 오디오 만 다운로드합니다. 오디오와 비디오를 모두 원한다면 명령에서 생략하십시오. :)
grooveplex

2

전체 내용 다운로드하고 편집 하지 않고도 처음부터 특정 지점까지 다운로드 할 수 있습니다 . 이 질문의 절반은 다음과 같습니다.

다운로드를 중단하다 ^C

  • 나는 이것을 시도했다. mp4
  • 별도의 비디오 및 오디오에서는 작동하지 않으므로 두 가지 형식 모두 필요합니다. 기본적으로 ytdl은 별도의 비디오 및 오디오를 가져온 다음 병합합니다. 사용 -F가능한 형식을 확인하고 두 형식 mp4이 모두 있는 형식을 선택하십시오 . 예를 들어 -f18또는 -f22보통 있습니다.
  • 다운로드 한 비율 (예 : 선형이 아니고 압축률은 시간에 따라 다름)을 추정해야합니다.

예. 그것은이다 해킹 .

추가 질문 : 별도의 비디오 및 오디오 형식을 원한다면 각각의 일부를 별도로 다운로드 ^c한 다음 수동으로 병합 할 수 있습니까? 일부 형식에서는 작동하지 않을 것이라고 생각합니다.


1

이것은 OP의 질문에 완전히 대답하지는 않지만 전체 스트림을 다운로드하지 않고도 스트림을 처음부터 특정 기간까지 다운로드하는 방법이 있습니다. YouTube는 이력서 지원을 제공하므로 Range헤더를 사용하여 부분 콘텐츠를 요청할 수 있습니다.

먼저 스트림 URL을 가져옵니다.

$ 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...

이렇게하면 두 개의 URL (각각 비디오 및 오디오 스트림)이 출력됩니다.

이제 첫 번째 URL (비디오 스트림에 연결)에 헤드 요청을 보내이 스트림의 총 콘텐츠 길이를 가져옵니다.

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

이제이 총 콘텐츠 길이를 동영상의 총 시간 (초)으로 나눕니다 (YouTube 동영상의 지속 시간은 4 분 7 초, 247 초입니다).

64380504 / 247 ≈ 260650

이 값에 (처음부터 가져 오려는 초 수 + 1)

(우리는 스트림의 시작 부분에 배치 된 메타 데이터가 차지하는 추가 공간을 대략적으로 설명하기 위해 하나를 추가합니다)

예를 들어 대략 처음 10 초를 가져 오려면 첫 번째 260650 * 11 = 2867150바이트 를 가져와야 하므로 Range헤더를 사용하여 요청합니다 .

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

처음 10 초만 다운로드해야합니다. 다운로드 한 파일은 재생할 수 있어야하지만 FFmpeg가 잘못된 메타 데이터를 수정하도록하는 것이 가장 좋습니다.

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

유사한 방식으로 오디오의 초기 부분 (2 차 URL) 만 다운로드 할 수 있습니다 (콘텐츠 길이는 다르지만 총 초는 동일하게 유지됨).

동영상에서 중간 부분을 다운로드하는 것도 이런 방식으로 가능해야하지만 YouTube는 메타 데이터를 스트림의 시작 부분 (처음 몇 바이트)에 배치하고 다운로드 한 미디어에 존재하지 않기 때문에 훨씬 까다로울 것입니다. 스트림이 전혀 재생되지 않습니다.

편집 : 이것은 YouTube와 같이 이력서 지원 기능이있는 웹 사이트에서만 작동합니다. 다른 웹 사이트에서는 작동하지 않습니다.


0

--postprocessor-args 매개 변수를 사용하여 오디오 / 비디오 출력을 편집 할 ffmpeg (프로세서)로 전달하므로 ffmpeg가 설치되어 있어야합니다.

--postprocessor-args 는 3 개의 인수와 값을받습니다 (예를 들어, ffmpeg의 매뉴얼 페이지를 확인하십시오) :

  • -ss HH : MM : SS : 시작 시간
  • -HH : MM : SS : 종료 시간
  • -t HH : MM : SS : 소요 시간

예 :

  • 15 초에 인코딩을 시작하고 1 분 20 초에 중지

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

  • 15 초에 인코딩을 시작하고 다음 3 분 5 초만 소요

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

추신 : youtube-dl은 처리하기 전에 전체 미디어를 다운로드하고 나중에 제거합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.