Як завантажити частину відео за допомогою команди youtube-dl?


61

Я використовую Ubuntu, і команда youtube-dl працює прекрасно.

Я хочу завантажити лише частину відео, яке занадто довго. Тому я хочу завантажити лише кілька хвилин частину відео. Приклад від 13 хвилин до 17 хвилин.

Чи можна це зробити

Відповіді:


44

Я не вірю, що youtube-dlодин буде робити те, що ти хочеш. Однак ви можете комбінувати його з утилітою командного рядка, наприклад ffmpeg.

Спочатку придбайте фактичну URL-адресу за допомогою youtube-dl:

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 - популярний інструмент, і він повинен бути в будь-якому з популярних сховищ ОС / менеджерів ОС.


8
Тож по суті, вам все одно доведеться завантажити все відео та обрізати його самостійно
Антоній

12
Ви можете використовувати опцію -to замість -t, якщо ви хочете вказати час закінчення фрагменту відео. 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
Чи можете ви пояснити, що це робить, як це працює?
користувач259412

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щоб бути впевненим, що я отримую версію найвищої якості.
Стів Горасон


16

Додавання до відповіді Джонні:

Використовуйте 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. Ваше повідомлення відповіло на це.
Manny_Mar

Нічого собі, я не знав, що -iпрапор ffmpeg може приймати URL-адреси. акуратний
Геремія


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

Це не повністю відповідає на питання ОП, але є спосіб завантажити потік від початку до певної тривалості без необхідності завантаження повного потоку. Оскільки 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 секунд), щоб приблизно отримати тривалість вмісту 1 секунду:

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 розміщує метадані на початку потоку (у перших кількох байтах) і без його присутності у завантаженому носії, Потік взагалі не буде грати.

EDIT: Це буде працювати лише на веб-сайтах із підтримкою відновлення, скажімо, на YouTube. Він не працює для інших веб-сайтів.


0

Використовуйте параметр --postprocessor-args, щоб передати аудіо / відео вихід у ffmpeg для редагування (процесор), тому потрібно встановити ffmpeg.

--postprocessor-args приймає 3 аргументи та значення (наприклад, theres більше, перегляньте сторінку керівництва 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]'

PS: youtube-dl завантажить весь носій перед його обробкою та видалить після.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.