youtube-dlコマンドでビデオの一部をダウンロードする方法は?


62

私はUbuntuを使用していますが、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
だから、基本的に、あなたはまだ自分で全体のビデオをダウンロードし、それをトリミングする必要がある
アントニー

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は、実際には指定した部分のみをダウンロードします。
アカイホラ

私の場合、@ 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

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、最高品質のバージョンを確実に入手できるように追加したいと思います。
スティーブゴランソン


17

ジョニーの答えに追加:

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ビデオの1つを使用した実際の例です。

ビデオ

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はオーディオである2番目の入力を意味します)。次にエンコードオプションを選択します。

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

1
ありがとう。@Johnnieの投稿では、サウンドを取得する方法がわかりませんでした。あなたの投稿はそれに答えた。
Manny_Mar

うわー、私はffmpegの-iフラグがURLを取ることができることを知りませんでした。きちんと
ジェレミア

--postprocessor-argsyoutube-dlで直接使用するのとどう違うのですか?
daGo

12

この機能リクエストは、youtube-dlにはまだ実装されていません。#622の問題とgithubの多くの複製を参照してください。


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

これにより、2つのURLが出力されます(それぞれビデオおよびオーディオストリーム用)。

次に、最初のURL(ビデオストリームにリンクする)にヘッドリクエストを送信して、このストリームのコンテンツの合計長を取得します。

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

ここで、この合計コンテンツ長をビデオの合計秒数で割って(YouTubeビデオの長さは4分7秒、つまり247秒です)、およそ1秒のコンテンツ長を取得します。

64380504 / 247 ≈ 260650

この値に(最初から取得したい秒数+ 1)を掛けます

(ストリームの先頭に配置されるメタデータによって使用される余分なスペースを大まかに説明するために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が言います。他のWebサイトでは機能しません。


0

--postprocessor-argsパラメーターを使用して、オーディオ/ビデオ出力を編集するffmpeg(プロセッサー)に渡すため、ffmpegをインストールする必要があります。

--postprocessor-argsは3つの引数と値を取ります(たとえば、もっとあります。ffmpegのマニュアルページを確認してください)。

  • -ss HH:MM:SS:開始時間
  • -to 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はメディア全体をダウンロードしてから処理し、その後削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.