Bagaimana cara mengunduh sebagian video dengan perintah youtube-dl?

62

Saya menggunakan Ubuntu, dan perintah youtube-dl bekerja dengan sangat baik.

Saya ingin mengunduh hanya sebagian video yang terlalu panjang. Jadi saya ingin mengunduh hanya beberapa menit dari video. Contoh dari 13 menit hingga 17 menit.

Apakah ada cara untuk melakukan itu?

pengguna3181614
sumber

Jawaban:

44

Saya tidak percaya youtube-dlsendirian akan melakukan apa yang Anda inginkan. Namun Anda dapat menggabungkannya dengan utilitas baris perintah seperti ffmpeg.

Pertama, dapatkan URL aktual menggunakan youtube-dl:

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

Salin output dari perintah dan rekatkan sebagai bagian dari -iparameter dari perintah selanjutnya:

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

The -ssparameter dalam posisi ini negara untuk membuang semua masukan sampai 15 detik ke dalam video. The -tnegara pilihan untuk menangkap selama 10 detik. Sisa perintah memerintahkannya untuk menyimpan sebagai mp4.

ffmpeg adalah alat yang populer dan harus berada di salah satu dari manajer repositori / paket OS yang populer.

Johnnie
sumber
8
Jadi intinya, Anda masih harus mengunduh seluruh video dan memangkasnya sendiri
Antony
12
Anda dapat menggunakan opsi -untuk bukannya -t jika Anda ingin menentukan waktu untuk mengakhiri slice video. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ˆᵛˆ
5
@Antony ffmpegsebenarnya hanya akan mengunduh bagian yang Anda tentukan.
akaihola
Itu tidak menyimpan audio untuk video dalam kasus saya tidak seperti jawaban @godofgrunts.
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
sumber
5
Bisakah Anda menjelaskan, apa fungsinya, cara kerjanya?
user259412
3
Ini hanya versi yang lebih singkat dari jawaban @godofgrunts, menggunakan sed untuk menghemat waktu secara manual mengambil URL dan menyalin / menempel di waktu mulai (-ss 00:05). @godofgrunts memiliki beberapa flag tambahan -map 0:v -map 1:a -c:v libx264 -c:a aacyang dapat meningkatkan kualitas. Saya juga ingin menambahkan youtube-dl -f bestvideo+bestaudiountuk memastikan saya mendapatkan versi kualitas tertinggi.
Steve Goranson
ffmpeg.zeranoe.com/builds untuk Windows.
Wolfpack'08
17

Menambah jawaban Johnnie:

Gunakan youtube-dl -g "URL"untuk mendapatkan stream video dan audio.

Sekarang gunakan:

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

Anda harus menggunakan -ssopsi untuk setiap aliran. Saya juga merekomendasikan melakukannya sekitar 30 detik sebelumnya dan kemudian menggunakan yang lain -ss 30untuk menghindari kehilangan bingkai kunci. Berikut ini adalah contoh nyata menggunakan salah satu video youtube saya.

Video

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

Keluaran:

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/

Saya ingin memotong dari 43:00 menjadi 50:10 jadi saya akan melakukan -ss 42:30(memberi saya beberapa detik untuk menangkap keyframe yang baik) pada kedua input dan kemudian melakukan -ss 30setelah input untuk memulai pada 43:00.

Saya kemudian akan menggunakan mapuntuk memetakan video 0:vdan audio 1:a(0 berarti input pertama, yang merupakan video dan 1 berarti input kedua, yang merupakan audio) dan kemudian pilih opsi pengkodean saya.

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
sumber
1
Terima kasih. Saya tidak yakin bagaimana cara mendapatkan suara, untuk posting @Johnnie. Posting Anda menjawabnya.
Manny_Mar
Wow, saya tidak tahu -ibendera ffmpeg dapat mengambil URL. rapi
Geremia
Apa bedanya menggunakan --postprocessor-argslangsung di youtube-dl?
daGo
12

Permintaan fitur ini belum diterapkan di youtube-dl. Lihat masalah # 622 dan banyak duplikatnya di github.

ks1322
sumber
9

youtube-dl mendukung melewati argumen ke postprocessor yang mendasarinya (diuji dengan versi 2017.08.27.1):

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

Ini pada dasarnya sama dengan melakukan postprocessing dengan ffmpegdiri Anda setelah mengunduh file terlebih dahulu.

Kevin
sumber
4
tetapi ini masih akan perlu untuk mengunduh seluruh video, kemudian memotong bagian yang diinginkan
Kasparov92
Saya mendapatkan unable to obtain file audio codec with ffprobekesalahan. Tolong bantu saya dengan itu. Saya menggunakan CentOS 7
Hassaan
3
Perhatikan bahwa -xbendera hanya mengunduh audio. Hapus dari perintah jika Anda ingin audio dan video. :)
grooveplex
2

Anda dapat mengunduh dari awal hingga titik tertentu tanpa mengunduh semuanya dan mengedit. Setengah dari pertanyaan ini:

interupsi unduhan dengan ^C

  • Saya hanya mencoba ini mp4
  • tidak akan berfungsi dengan video dan audio yang terpisah, Anda memerlukan format dengan keduanya. Secara default ytdl sering mendapatkan video dan audio yang terpisah, kemudian menggabungkannya. Gunakan -Funtuk melihat format yang tersedia, dan pilih mp4yang memiliki keduanya. misalnya -f18atau -f22biasanya ada.
  • Anda harus memperkirakan dari persentase yang diunduh (yang tidak linier; tingkat kompresi bervariasi dari waktu ke waktu).

Iya. Ini hack .

Pertanyaan selanjutnya: jika Anda menginginkan format video dan audio yang terpisah, dapatkah Anda mengunduh sebagian dari masing-masing secara terpisah (menggunakan ^cseperti di sini), dan kemudian menggabungkannya secara manual? Saya tidak berpikir itu akan berfungsi untuk beberapa format.

hiperallium
sumber
1

Ini tidak sepenuhnya menjawab pertanyaan OP tetapi ada cara untuk mengunduh aliran dari awal hingga durasi tertentu tanpa harus mengunduh aliran lengkap. Karena YouTube menyediakan dukungan resume, kami dapat meminta konten sebagian menggunakan Rangeheader.

Kami pertama-tama mengambil URL aliran:

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

Ini akan menghasilkan dua URL (masing-masing untuk aliran video dan audio).

Sekarang kirim permintaan kepala ke URL pertama (yang terhubung ke aliran video) untuk mengambil total panjang konten dari aliran ini:

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

Sekarang, kami membagi panjang konten total ini dengan total detik dalam video (video YouTube berdurasi 4 menit dan 7 detik, yaitu 247 detik.) Untuk mendapatkan panjang konten 1 detik:

64380504 / 247 ≈ 260650

Kami mengalikan nilai ini dengan (jumlah detik yang ingin kami ambil dari awal + 1)

(kami menambahkan satu juga kira-kira akun ruang ekstra yang diambil oleh metadata yang ditempatkan di awal aliran)

Misalnya untuk mengambil sekitar 10 detik pertama, Anda harus mengambil 260650 * 11 = 2867150byte pertama , jadi kami membuat permintaan dengan Rangeheader:

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

Ini seharusnya hanya mengunduh 10 detik pertama. File yang diunduh harus dapat diputar tetapi biarkan FFmpeg memperbaiki metadata yang salah:

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

Kami juga dapat mengunduh hanya bagian awal audio (URL ke-2) dengan cara yang serupa (panjang konten akan berbeda tetapi total detik akan tetap sama).

Mengunduh bagian tengah dari video juga harus dimungkinkan dengan cara ini, tetapi mungkin akan jauh lebih sulit karena YouTube menempatkan metadata di awal aliran (dalam beberapa byte pertama) dan tanpa kehadirannya di media yang diunduh, streaming tidak akan bermain sama sekali.

EDIT: Ini hanya akan berfungsi pada situs web dengan dukungan resume, katakan YouTube. Ini tidak akan berfungsi untuk situs web lain.

Ritiek
sumber
0

Gunakan parameter --postprocessor-args untuk meneruskan output audio / video ke ffmpeg untuk diedit (prosesor), jadi perlu ffmpeg diinstal.

--postprocessor-args membutuhkan 3 argumen & nilai (misalnya, ada lebih banyak, periksa halaman manual ffmpeg):

  • -ss HH: MM: SS: mulai waktu untuk mengambil
  • -untuk HH: MM: SS: waktu akhir
  • -t HH: MM: SS: waktu yang diperlukan

Contoh:

  • Mulai penyandian pada 15 detik dan berhenti pada 1 menit 20 detik

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

  • Mulai penyandian pada 15 detik dan hanya 3 menit 5 detik berikutnya

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

PS: youtube-dl akan mengunduh seluruh media sebelum memprosesnya, dan menghapusnya setelah itu.

niainaLens
sumber