私はUbuntuを使用していますが、youtube-dlコマンドはまったく問題なく動作しています。
長すぎるビデオの一部のみをダウンロードしたい。だから私はビデオのほんの数分の部分をダウンロードしたい。13分から17分までの例。
それを行う方法はありますか
私はUbuntuを使用していますが、youtube-dlコマンドはまったく問題なく動作しています。
長すぎるビデオの一部のみをダウンロードしたい。だから私はビデオのほんの数分の部分をダウンロードしたい。13分から17分までの例。
それを行う方法はありますか
回答:
私は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
、最高品質のバージョンを確実に入手できるように追加したいと思います。
ジョニーの答えに追加:
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
-i
フラグがURLを取ることができることを知りませんでした。きちんと
--postprocessor-args
youtube-dlで直接使用するのとどう違うのですか?
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...
これにより、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サイトでは機能しません。
--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]'
PS: youtube-dlはメディア全体をダウンロードしてから処理し、その後削除します。