답변:
나는 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 리포지토리 / 패키지 관리자에 있어야합니다.
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ffmpeg
는 실제로 지정한 부분 만 다운로드합니다.
ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv
-map 0:v -map 1:a -c:v libx264 -c:a aac
품질을 향상시킬 수 있는 추가 플래그 가 있습니다. 또한 youtube-dl -f bestvideo+bestaudio
최고 품질의 버전을 받고 있는지 확인 하기 위해 추가 하고 싶습니다 .
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
-i
깃발이 URL을 취할 수 있다는 것을 몰랐다 . 깔끔한
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
파일을 먼저 다운로드 한 후 후 처리를하는 것과 같습니다 .
unable to obtain file audio codec with ffprobe
오류 가 발생했습니다. 저 좀 도와주세요. 저는 CentOS 7
-x
플래그는 오디오 만 다운로드합니다. 오디오와 비디오를 모두 원한다면 명령에서 생략하십시오. :)
전체 내용 을 다운로드하고 편집 하지 않고도 처음부터 특정 지점까지 다운로드 할 수 있습니다 . 이 질문의 절반은 다음과 같습니다.
다운로드를 중단하다
^C
mp4
-F
가능한 형식을 확인하고 두 형식 mp4
이 모두 있는 형식을 선택하십시오 . 예를 들어 -f18
또는 -f22
보통 있습니다.예. 그것은이다 해킹 .
추가 질문 : 별도의 비디오 및 오디오 형식을 원한다면 각각의 일부를 별도로 다운로드 ^c
한 다음 수동으로 병합 할 수 있습니까? 일부 형식에서는 작동하지 않을 것이라고 생각합니다.
이것은 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와 같이 이력서 지원 기능이있는 웹 사이트에서만 작동합니다. 다른 웹 사이트에서는 작동하지 않습니다.
--postprocessor-args 매개 변수를 사용하여 오디오 / 비디오 출력을 편집 할 ffmpeg (프로세서)로 전달하므로 ffmpeg가 설치되어 있어야합니다.
--postprocessor-args 는 3 개의 인수와 값을받습니다 (예를 들어, ffmpeg의 매뉴얼 페이지를 확인하십시오) :
예 :
$ youtube-dl --postprocessor-args "-ss 0 : 0 : 15 -to 0 : 1 : 20" '[video_URL]'
$ youtube-dl --postprocessor-args "-ss 0 : 0 : 15 -t 0 : 3 : 5" '[video_URL]'
추신 : youtube-dl은 처리하기 전에 전체 미디어를 다운로드하고 나중에 제거합니다.