私が設定したものを説明しましょう。私はYouTubeからビデオをダウンロードするためにpytube(Pythonモジュール)を使用しています。次に、ビデオからいくつかのランダムフレームを抽出し、それらをjpegとして保存します。音声もビデオも必要ありません。
今、私は何万ものビデオをダウンロードして、ビデオごとにランダムなフレームをいくつか取得するためにそれらを削除しています。これは無駄に思え、かなりの費用もかかりました。ビデオをダウンロードせずにフレーム自体をダウンロードする方法はありますか?
私はyoutube-dlをffmpegと組み合わせるとうまくいくと思いますが、オンラインでそれを行う例を見つけることができません。ネットワーク帯域幅の消費を大幅に削減するビデオのランダムなサンプルをダウンロードするソリューションがありますが、より効率的で時間のかからないものを求めています。任意の助けいただければ幸いです。
WARNING: Could not send HEAD request to https://www.youtube.com/watch\?v\=oHg5SJYRHA0: HTTP Error 404: Not Found ERROR: Unable to download webpage: HTTP Error 404: Not Found (caused by HTTPError()); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output. ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 7 (Ubuntu 7.3.0-16ubuntu3) configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared WARNING: library configuration mismatch avcodec configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc libavutil 55. 78.100 / 55. 78.100 libavcodec 57.107.100 / 57.107.100 libavformat 57. 83.100 / 57. 83.100 libavdevice 57. 10.100 / 57. 10.100 libavfilter 6.107.100 / 6.107.100 libavresample 3. 7. 0 / 3. 7. 0 libswscale 4. 8.100 / 4. 8.100 libswresample 2. 9.100 / 2. 9.100 libpostproc 54. 7.100 / 54. 7.100 -vframes: No such file or directory
これ answer とこれ answer を組み合わせて使用すると、次のことが可能になります。
ffmpeg -ss "$screenshot_time" -i $(youtube-dl -f 22 --get-url "$youtube_url") -vframes 1 -q:v 2 "$output_file"
ffmpeg
の-ss
オプションは、利用可能な最速の方法である入力オプションとしてここで使用されます。これは出力オプションとして使用できます。これにはかなり時間がかかりますが、入力バージョンが時々生成する偶発的なアーティファクトの作成は回避されます。-ss位置(入力/出力)
入力オプションとして使用する場合(-iの前)、この入力ファイル内で検索して配置します。ほとんどの形式では正確にシークすることができないため、ffmpegは位置の前の最も近いシークポイントにシークします。トランスコーディングと-accurate_seekが有効な場合(デフォルト)、シークポイントと位置の間のこの余分なセグメントはデコードされて破棄されます。ストリームコピーを実行する場合、または-noaccurate_seekを使用する場合は、保持されます。
出力オプション(出力ファイル名の前)として使用される場合、タイムスタンプが所定の位置に到達するまで入力をデコードしますが破棄します。
位置は、秒単位またはhh:mm:ss [.xxx]形式のいずれかです。
-i
オプションは、以下をffmpeg
への入力として使用することを意味します。ここでは、Bashの コマンド置換 を使用してyoutube-dl
の出力を使用します。-vframes 1
は、出力フレームの数を1に設定します。-q:v 2
は出力品質を制御します。全範囲は、1-31の線形目盛であり、値が小さいほど品質が高くなります。 2〜5は、この回答のffmpeg
部分に使用されるソース回答で推奨される範囲です。"$screenshot_time"
は、上記のキャプチャしたいクリップのタイムスタンプに置き換えてください。"$output_file"
は、出力ファイルへのパス、screenshot.jpegなどに置き換える必要があります。youtube-dl
コマンドに関しては、-f 22
が最高品質のmp4形式でダウンロードされ、"$youtube_url"
は動画のURLに置き換える必要があります。