是否可以仅从 YouTube 视频中下载单帧?

是否可以仅从 YouTube 视频中下载单帧?

让我解释一下我设置的内容。我一直在使用 pytube(Python 模块)从 YouTube 下载视频。然后我会从视频中提取一些随机帧并将它们保存为 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

答案1

结合使用回答和这个回答以下应该可以做你想做的事:

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。

答案2

水管工工具可以截取 YouTube 视频中单个帧的屏幕截图。要安装该工具,请在终端窗口中输入以下内容:

sudo snap install plumber

将 YouTube 网址粘贴到黄色标记的框中,或单击红色标记的图标使用内置搜索功能。

然后,您可以在视频中找到所需的帧,然后单击粉红色图标,然后单击绿色图标,这将打开另一个窗口以显示屏幕截图的预览并允许您将其保存为图像文件。

该工具还可用于保存 YouTube 视频剪辑的视频/gif。

水管工主屏幕

屏幕截图窗口

相关内容