ffmpeg库 pycharm_pyinstaller打包PySide2写的GUI程序,调用ffmpeg隐藏CMD控制台解决方案...

725 阅读1分钟

1 问题描述

使用PySide2写了一个GUI程序,调用ffmpeg命令行工具,做简单的批量视频处理(调整帧宽度、帧高度、视频变速、降低视频码率达到限制视频大小),使用了ffmpeg、 ffmpeg-python库;

挺简单的事儿,但遇到一个问题:

pyinstaller打包程序时:

不加 -w 或 --noconsole,有CMD丑黑框,程序可以正常运行,但是程序界面背后一个大大的CMD黑框真心难看。。。

加上 -w 或 --noconsole,没有CMD黑框,程序会直接无限等待,无法正常运行,猜测是调用 ffmpeg 时需要一个shell环境供PIPE的输入输出

2 解决方案

(我使用到了ffmpeg库的 probe(调用ffprobe.exe获取视频流信息)和run(调用ffmpeg.exe执行操作)方法)

找到ffmpeg库的 _probe.py 和 _run.py 文件

备份这两个文件,修改完、打包完程序后再恢复原样

把这两文件复制到桌面修改好再放回去(这步坑了我一点时间,win10没用管理员权限打开文件,由于ffmpeg库安装在C盘的Program...路径下,在PyCharm中做出的修改一直没保存。。。)

修改 _probe.py

源码: p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Popen 参数添加 shell=True, stdin=subprocess.PIPE

修改 _run.py

源码: return subprocess.Popen(args, stdin=pipe_stdin, stdout=stdout_stream, stderr=stderr_stream)

添加 shell=True, 修改 stdin=subprocess.PIPE 或者修改 pipe_stdin=True

将修改完的 _probe.py 和 _run.py 放回 ffmpeg库

pyinstaller 打包程序时,添加 -w 或 --noconsole参数,这时CMD黑框就不显示了

附1:不用ffmpeg库,而是直接使用 subprocess调用ffmpeg.exe的,只需要在调用subprocess.Popen()时指定参数 shell=True, stdin=subprocess.PIPE 即可

示例:

cmd = FFmpeg + ' -f concat -safe 0 -i ' + videoTxtPath + item + ' ' + PATH_MEDIA + str(int(index+1)) + '.mp4'
# Execute the (Terminal) command within Python.
# subprocess.call(cmd, shell=True)

process = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=True)
compute_progress_and_send_progress(process)