ffmpeg Python命令仅在PM2环境中运行一次

时间:2019-02-28 18:02:18

标签: python ffmpeg python-3.6 pm2

PM2以web用户身份运行。 ffmpeg使用sudo apt install ffmpeg本地安装到Ubuntu 16.04 LTS。 Python版本是3.6。该软件使用ffmpeg-python@0.1.17

产生的应用程序不会产生任何错误。当ffmpeg代码首次执行时,我们会看到一个输出,ffmpeg进程将按预期完成任务。

所有后续请求在下一个ffmpeg执行时停止。无输出。 ffmpeg进程无任何回报。没有错误。 PM2进程不会出错。应用程序日志停在ffmpeg命令上,就像挂起一样。

根本原因是什么?我们非常感谢您的帮助。

此外,PM2挂在子进程(如ffmpeg)上的原因是什么?

代码如下:

class ImageHelper:

def __init__(self):
    pass

@classmethod
def create_thumb_from_video_ffmpeg(cls, input_video_file_path,
                                   output_image_path,
                                   scale_width,
                                   scale_height
                                   ):
    """
        This function is used to create the thumb image
        from a source video file.
        We are using a python wrapper/library for FFMPEG
    """
    try:
        if Functions.get_attribute_env('ENVIRONMENT') == 'prod':

            out, err = (
                ffmpeg
                    .input(input_video_file_path, ss="00:00:00.001")
                    .filter('scale', scale_width, scale_height)
                    .output(output_image_path, vframes=1, loglevel='quiet')
                    .overwrite_output()
                    .run(capture_stdout=True)
            )
            print("We only see this once!")
        else:
            out, err = (
                ffmpeg
                    .input(input_video_file_path, ss="00:00:00.001")
                    .filter('scale', scale_width, scale_height)
                    .output(output_image_path, vframes=1)
                    .overwrite_output()
                    .run(capture_stdout=True)
            )
            print("We only see this once!")

        if err:
            if Functions.get_attribute_env('ENVIRONMENT') != 'prod':
                print('ffmpeg video thumb', err)
            else:
                Functions.logger_function(str(err))
            raise Exception(err)
        else:
            return output_image_path

    except Exception as e:
        if Functions.get_attribute_env('ENVIRONMENT') != 'prod':
            print('in thumb exception', e)
        else:
            Functions.logger_function(str(e))
        raise Exception(e)

3 个答案:

答案 0 :(得分:2)

检查在发出顺序请求时ffmpeg进程是否正在运行。如果是这样,您可能要确保在第一次完成后关闭该过程,以便可以针对顺序请求再次开始。

答案 1 :(得分:0)

apachenginx生成的进程将对执行时间有限制,并且将自动终止。在这种情况下,您可能希望触发脚本来运行Web进程池的 outside 。像这样:

setsid /usr/bin/python3 my_script.py 

答案 2 :(得分:0)

对于拥有子流程问题的每个人来说,这是什么价值……该解决方案最终归因于.env实施不当。当我们最终重新创建.env时,问题消失了。我实际上向我的团队推荐了我们将Anaconda用于我们的Python env,并且达到了目的。 :'D