【问题标题】:Python - second subprocess won't open if sys.argv containts "&" characterPython - 如果 sys.argv 包含“&”字符,则不会打开第二个子进程
【发布时间】:2015-06-04 03:03:57
【问题描述】:

我有一个 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进程作品!为什么会这样?

更新:我尝试删除 ffmpeg 中的 -v 0 选项以查看实际发生的情况,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 会大大减慢您的程序,因为它会等待转换完成。由于您将循环播放视频文件名并希望转换目录中的每个文件名,我建议使用Popen
  • 但是Popen不是要开启多个并行进程吗?我的意思是如果我在源文件夹中有 20 个视频,它将打开 20 个并行进程?
  • 是的,这将使它运行得更快。或者更好的是创建一个线程类,这样你就可以更好地处理错误

标签: python ffmpeg argv sys


【解决方案1】:

我的猜测是您指定了一个已经存在的输出位置,而 FFmpeg 询问您是否要覆盖文件,等待标准输入上的“y”(或其他任何内容,这意味着不) .要阻止它这样做,请使用“-y”选项,它会阻止它询问该问题并强制覆盖输出文件。

【讨论】:

  • 输出文件夹是空的,ffmpeg总是问我是否要覆盖已经存在的输出,我试图删除“-v 0”看看会发生什么,ffmpeg启动,它就像我发布的日志一样卡住了。
  • 我发现问题出在 arg 包含“&”字符时。你知道这对 ffmpeg 来说是个什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多