У меня есть скрипт Python, который загружает видео с помощью youtube-dl
, а затем извлекает из него кадры с помощью ffmpeg
. Это код:
def DownloadVideo():
output_file = "/Users/francesco/Desktop/SOURCE/%(title)s-%(id)s.%(ext)s"
check_call(["youtube-dl","--output", output_file, "--restrict-filenames", "-f", "best", sys.argv[1]])
def ConvertVideo(video):
DEST = "/Users/francesco/Desktop/OUTPUT"
SOURCE = "/Users/francesco/Desktop/SOURCE"
ffmpeg_path = "/Users/francesco/Desktop/ffmpeg/ffmpeg"
video_path = SOURCE + "/" + video
dest_path = DEST + "/" + os.path.splitext(video)[0] + "-%d.png"
check_call([ffmpeg_path, "-v", "0", "-i", video_path, "-f", "image2", dest_path])
def Main():
DownloadVideo()
for video in os.listdir("/Users/francesco/Desktop/SOURCE"):
ConvertVideo(video)
Я запускаю команду python myscript.py myvideolink
, и в процессе загрузки все идет нормально, но ConvertVideo не запускается, просто зависает на пару секунд, а затем программа закрывается.
Если я попытаюсь запустить ту же команду, пропуская DownloadVideo()
(с видео, уже загруженным в папку), это тоже не сработает, но если я использую python myscript.py
без argv[1], процесс ffmpeg работает! Почему это происходит?
Обновление: я попытался удалить параметр -v 0
в ffmpeg, чтобы увидеть, что на самом деле происходит, процесс ffmpeg запускается, но зависает следующим образом:
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
built with llvm-gcc 4.2.1 (LLVM build 2336.11.00)
configuration: --prefix=/Volumes/Ramdisk/sw --enable-gpl --enable-pthreads --enable-version3 --enable-libspeex --enable-libvpx --disable-decoder=libvpx --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --enable-libgsm --enable-libvidstab --enable-libx265 --disable-doc --arch=x86_64 --enable-runtime-cpudetect
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Обновление 2: Оказывается, это происходит только тогда, когда аргумент (который является ссылкой) содержит символ «&». Кто-нибудь знает, почему это проблема для ffmpeg? Он не использует переменную arg...
check_call
значительно замедлит работу вашей программы, поскольку она ожидает завершения преобразования. Поскольку вы собираетесь перебирать имена видеофайлов и хотите преобразовать каждое из них в каталоге, я предлагаю использовать Открыть - person heinst   schedule 03.06.2015