Ubuntuを使用していますが、youtube-dl
コマンドは完全に正常に機能しています。
しかし、今は長すぎるビデオの一部だけをダウンロードしたいと思います。だから私はそのビデオのほんの数分をダウンロードしたいです、例えば。 13分から17分まで。
それを行う方法はありますか?
回答
I youtube-dl
だけでやりたいことができるとは思わないでください。ただし、ffmpegなどのコマンドラインユーティリティと組み合わせることができます。
まず、youtubeを使用して実際のURLを取得します。 -dl:
youtube-dl -g "https://www.youtube.com/watch?v=V_f2QkBdbRI"
コマンドの出力をコピーして、の-i
パラメーターの一部として貼り付けます。次のコマンド:
ffmpeg -ss 00:00:15.00 -i "OUTPUT-OF-FIRST URL" -t 00:00:10.00 -c copy out.mp4
この位置の-ss
パラメーターは、15秒までのすべての入力を破棄するように指示します。ビデオ。-t
オプションは、10秒間キャプチャするように指示します。コマンドの残りの部分は、mp4として保存するように指示します。
ffmpegは人気のあるツールであり、人気のあるOSリポジトリ/パッケージマネージャーのいずれかに存在します。
コメント
回答
追加するジョニーの答え:
youtube-dl --youtube-skip-dash-manifest -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 --youtube-skip-dash-manifest -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 30
を実行して43:00に開始します。
次に、map
を使用してビデオ0:v
とオーディオ1:a
(0はビデオである最初の入力を意味し、1はオーディオである2番目の入力を意味します)次に、エンコードオプションを選択します。
# The first URL video_url="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/" # The second URL audio_url="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/" ffmpeg -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 -t 7:10 -c:v libx264 -c:a aac gog-vs-triv.mkv
--youtube-skip-dash-manifest
divのJakubVránaへのクレジット>解決策。
コメント
- ありがとうございます。@ Johnnieの投稿で、音を出す方法がわかりませんでした。あなたの投稿が回答しました。
- どのように違いますか
--postprocessor-args
をyoutube-dlで直接使用することをお勧めしますか? - @ daGo-
youtube-dl --postprocessor-args
がビデオ全体をダウンロードすると思います次に、選択した範囲まで編集しますが、この回答では、特別なURLを取得するためだけにyoutube-dl
を使用しています。ffmpeg
は、これらのURLを使用して、必要な範囲のみをダウンロードします。したがって、2時間の講義ビデオから2分を抽出したい場合、この回答はダウンロードの多くを節約します。 - これはほとんどのYTビデオで機能しますが、私は9時間のビデオでこれを試しています。以前はライブでストリーミングされていましたが(現在は完了しています)、”入力の処理中に無効なデータが見つかりました”。主な違いは、
youtube-dl -g
の出力が異なることです。ほとんどのビデオでは、構造体があります。"https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/8..."
ですが、このビデオには構造体があります。"https://manifest.googlevideo.com/api/manifest/dash/expire/15956..."
(スペースのために切り捨てられます)。これを機能させる方法についてのアイデアはありますか? - @LeftoverSalad 1つの解決策が見つかりました。
回答
ffmpeg $(youtube-dl -g "https://www.youtube.com/watch?v=oHg5SJYRHA0" | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv
URLと-ss
、
回このコマンドを使用します。 @godofgruntsによるこの回答のように、ビデオとオーディオの両方のURLを使用して引数を作成します。$()
には引用符は使用されません。これは、ffmpeg
に対して2つの別々の引数が生成されるためです。
コメント
- それが何をするのか、どのように機能するのか説明していただけますか?
- ‘は@のより簡潔なバージョンですgodofgruntsが答え、sedを使用して、手動でURLを取得し、開始時刻(-ss 00:05)にコピー/貼り付けする時間を節約します。 @godofgruntsには、品質を向上させる可能性のあるいくつかの追加フラグ
-map 0:v -map 1:a -c:v libx264 -c:a aac
があります。また、youtube-dl -f bestvideo+bestaudio
を追加して、’が最高品質のバージョンを取得できるようにします。 - ffmpeg.zeranoe.com/builds forWindows。
- “追加フラグ”あなたが誤って扱っていると思う2つのストリーム(ビデオとオーディオ)を扱います-IIUCそれらは品質の向上とは何の関係もありません(まあ、音を持つことはおそらく品質の向上の印です:-))以下の@godofgruntsによる回答は正しいようです。
回答
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
で後処理を行うのと同じです。
コメント
- ただし、これでも実行する必要がありますビデオ全体をwnloadしてから、目的の部分を切り取ります
-
unable to obtain file audio codec with ffprobe
エラーが発生します。それを手伝ってくれませんか。 CentOS7を使用しています -
-x
フラグは音声のみをダウンロードすることに注意してください。オーディオとビデオの両方が必要な場合は、コマンドから省略してください。 🙂 -
—postprocessor-args
が複数回適用される場合があるため、これは確実に機能しません。 github.com/ytdl-org/youtube-dl/issues/26863
回答
この機能リクエストはまだyoutube-dlに実装されていません。 #622の問題とgithubでの多くの重複を参照してください。
回答
--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
は、処理する前にメディア全体をダウンロードし、処理後に削除します。
コメント
- はい!非常にクリーンで覚えやすいです。
-
—postprocessor-args
が複数回適用される場合があるため、これは確実に機能しません。 github.com/ytdl-org/youtube-dl/issues/26863
回答
これは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
この値を乗算しますwith(最初からフェッチしたい秒数+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でのみ機能します。他のウェブサイトでは機能しません。
回答
最初からまですべてをダウンロードして編集します。これは、この質問の半分です。
^C
- これは
mp4
- でのみ試しましたが、別の動画では機能しませんとオーディオの場合、両方のフォーマットが必要です。デフォルトでは、ytdlは多くの場合、ビデオとオーディオを別々に取得してからマージします。
-F
を使用して使用可能なフォーマットを確認し、mp4
両方があります。たとえば-f18
または-f22
が通常あります。 - あなた「ダウンロードされた割合から見積もる必要があります(これは線形ではありません。圧縮率は時間とともに変化します)。
はい。ハックです。 p>
さらに質問:個別のビデオ形式とオーディオ形式が必要な場合は、それぞれの一部を個別にダウンロードして(ここのように^c
を使用)、手動でマージできますか?一部の形式では機能しないと思います。
回答
@godofgruntsを実装するスクリプトを作成しました回答ここ
#!/bin/bash #taken from https://unix.stackexchange.com/a/388148/48971 if [ $# -lt 4 ]; then echo "Usage: $0 <youtube"s URL> <HH:mm:ss from time> <HH:mm:ss to time> <output_file_name>" echo "e.g.:" echo "$0 https://www.youtube.com/watch?v=T1n5gXIPyws 00:00:25 00:00:42 intro.mp4" exit 1 fi echo "processing..." from=$(date "+%s" -d "UTC 01/01/1970 $2") to=$(date "+%s" -d "UTC 01/01/1970 $3") from_pre=$(($from - 30)) if [ $from_pre -lt 0 ] then from_pre=0 fi from_pre_command_print=$(date -u "+%T" -d @$from_pre) from_command_print=$(date -u "+%T" -d @$(($from - $from_pre)))$(grep -o "\..*" <<< $2) to_command_print=$(date -u "+%T" -d @$(($to - $from_pre)))$(grep -o "\..*" <<< $3) command="ffmpeg " for uri in $(youtube-dl -g $1) do command+="-ss $from_pre_command_print -i $uri " done command+="-ss $from_command_print -to $to_command_print $4" echo "downloading with the following command:" echo "$command" $command
また、 Gitlab のスニペット
回答
ここで見つけることができますここ
解析できますYouTubeリンクのテキストも同様です。例:
YouTube.com/blahblah start-1:20
これにより、0-1:22から動画がダウンロードされます(キーフレームが原因でわずかな違いが生じる可能性があります)。動画全体をダウンロードすることもできます。その場合は時間間隔を省略してください。
回答
すべての怠惰な人のために「複数のコマンドを使用したくない場合は、次の手順を実行してください。
youtube-dl.exe https://www.youtube.com/watch?v=MJD39Aja1Is --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00"
youtube-dl.exe
とffmpeg
は、形式の選択、ビデオの削除、オーディオファイルの切り取りなどです(ビデオファイルを切り取ってオーディオファイルに変換するよりも、最初に何が起こっても)
youtube-dl.exe -f 251 https://www.youtube.com/watch?v=MJD39Aja1Is -x --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00"
コメント
- コマンドはGNU / Linuxでは機能しません。ivid = “を使用します
youtube-dl.exe
の代わりに8c59b7bcd1 “>
。そしてffmpeg
がInvalid duration specification for ss: 00.00.10.00
と言った、-ss 00:00:30.00
で、最後のピリオドを除いてピリオドではなくコロンを使用する必要があります。
00:00:00.0
のように、よりうまく機能し、ビデオの一部をダウンロードできます。私はまだ問題があります(あなたのコマンドと他のほとんどのもので):それは5または10秒をダウンロードしすぎます。解決策は@godofgrunts ‘の回答に記載されています:-ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30
部分が始まる30秒前に開始し、最後に。そのため、同じコマンドで-ss
オプションを数回使用する必要があります。 --external-downloader-args
で同じことを行う方法はありますか?回答
@hyperpalliumの回答に追加するには:OPは、ダウンロードする動画がYouTubeからのものである必要があるとは述べていませんでした。
YouTubeは動画を途方もなく制限しているため、オーディオとビデオは異なるファイルにストリームされ、それらはあなたを追跡/あなたのデータを販売します。したがって、部分的にダウンロードしてから Ctrl + C を押す方法に問題が生じる可能性があります。
MicrosoftWindowsバージョン10.0.17134.1304のyoutube-dl
バージョン2020.11.17を使用して、archive.orgからビデオの一部をダウンロードしました:
E:\cs>youtube-dl --abort-on-unavailable-fragment https://archive.org/download/beastars-season-1-1080p/%5BHCS%5D%20Beastars%20-%2003%20%5B1080p%5D.mkv [generic] [HCS] Beastars - 03 [1080p]: Requesting header [redirect] Following redirect to https://ia601504.us.archive.org/14/items/beastars-season-1-1080p/%5BHCS%5D%20Beastars%20-%2003%20%5B1080p%5D.mkv [generic] [HCS] Beastars - 03 [1080p]: Requesting header WARNING: Falling back on generic information extractor. [generic] [HCS] Beastars - 03 [1080p]: Downloading webpage WARNING: URL could be a direct video link, returning it as such. [download] Destination: [HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv [download] 2.3% of 513.77MiB at 839.68KiB/s ETA 10:12 ERROR: Interrupted by user E:\cs>ren "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv.part" "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv" E:\cs>ffmpeg -i "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv" "[HCS] Beastars - 03 [1080p].mp4" ffmpeg version N-91990-g49c67e79ca Copyright (c) 2000-2018 the FFmpeg developers built with gcc 8.2.1 (GCC) 20180813 [stdout text] Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default) Metadata: encoder : Lavc58.30.100 aac [matroska,webm @ 0000020c8f28a2c0] Read errorme=00:00:33.96 bitrate=2099.5kbits/s speed=0.0185x frame= 823 fps=0.3 q=-1.0 Lsize= 9677kB time=00:00:34.56 bitrate=2293.8kbits/s speed=0.0147x video:9134kB audio:519kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.248960% [libx264 @ 0000020c8f3423c0] frame I:25 Avg QP:14.71 size: 56865 [stdout] E:\cs>youtube-dl -v [debug] System config: [] [debug] User config: [] [debug] Custom config: [] [debug] Command-line args: ["-v"] [debug] Encodings: locale cp1252, fs mbcs, out cp437, pref cp1252 [debug] youtube-dl version 2020.11.17 [debug] Python version 3.4.4 (CPython) - Windows-10-10.0.17134 [debug] exe versions: ffmpeg 3.4, ffprobe N-91990-g49c67e79ca [debug] Proxy map: {} Usage: youtube-dl [OPTIONS] URL [URL...]
最終的に作成されたMKVファイルは” 00:22:57 “でした”合計期間”ですが、34秒後に終了しました。最終的に作成されたMP4ビデオの合計再生時間は00:00:34秒で、34秒後に終了し、ビデオとオーディオは完全に正常に/意図したとおりに再生されました。
フルcmd.exe
ログはここ
要約すると、実行
youtube-dl --abort-on-unavailable-fragment [URL to video file]
(option --abort-on-unavailable-fragment
は、 Ctrl + C でダウンロードを中断するため、重要な場合があります)、少しダウンロードしてから、 Ctrl + C を押します。
オプション:[file].mkv.part
の名前を変更します[file].mkv
にファイルします。 MKVからMP4への変換もおそらくオプションです。
回答
誰かがバッチスクリプト(Windowsの場合):
@ECHO off :Input ECHO. SET url= ECHO Enter Youtube-url: SET /P url= IF "%url%" EQU "" GOTO End IF "%url: =%" NEQ "%url%" GOTO Input ECHO Enter start time (in seconds, or in hh:mm:ss[.xxx] form): SET /P start= ECHO Enter duration (in seconds, or in hh:mm:ss[.xxx] form): SET /P dur= ECHO. FOR /F "delims==" %%A IN ("youtube-dl.exe --no-warnings --get-filename "%url%"") DO SET filename=%%A FOR /F %%B IN ("youtube-dl.exe -g "%url%"") DO ( ffmpeg.exe -hide_banner -ss "%start%" -i "%%B" -c copy -t "%dur%" "%filename%" ) GOTO Input :End
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ffmpeg
は、実際には指定した部分のみをダウンロードします。youtube-dl
が提供するリンクと-g
オプションは、常に403forbiddenedを返します。 youtube-dlを単独で使用して動画をダウンロードすると、常に魅力のように機能します。