如何在QProcess中运行FFmpeg命令?macOS下无输出文件排查
解决QProcess调用FFmpeg未生成MKV文件的问题
嘿,我来帮你排查下这个在macOS Catalina下用QProcess调用FFmpeg没生成预期MKV文件的问题!结合你的代码和环境,咱们一步步找原因:
1. 删掉参数里多余的换行符
你在输出文件名末尾加了\n,这会让FFmpeg把带换行的字符串当成目标文件名,系统根本识别不了这个奇怪的文件名,自然生成不了文件。赶紧把这个\n删掉!
2. 别用~指代用户目录,换成绝对路径
QProcess默认不会解析shell里的~符号,所以~/Desktop/PlazaPCO/这个路径FFmpeg根本找不到。咱们用Qt的QDir::homePath()来生成正确的用户目录绝对路径,兼容性更好。
3. 一定要打印FFmpeg的输出信息排查错误
你现在只打印了开始和结束的日志,但FFmpeg执行时的错误信息才是关键!比如权限不足、设备号错误、路径不存在这些问题,都会在标准输出/错误里体现,一定要把这些信息打出来。
4. 检查macOS的隐私权限
Catalina对应用权限管控很严,如果你的Qt程序没有“文件和文件夹”访问权限,是没法往桌面写文件的。去「系统偏好设置」→「安全性与隐私」→「隐私」里,找到「文件和文件夹」,确保你的Qt程序有桌面访问权限。
修改后的代码示例
void MainWindow::Recording(){ qDebug() << "Nagrywam!"; Qrec.setProcessChannelMode(QProcess::MergedChannels); Qrec.setProgram("/Users/nintyswinty/Desktop/Dev/Qt/build-PlazaPCO-Desktop_Qt_5_15_1_clang_64bit-Debug/ffmpeg"); // 用QDir::homePath()生成正确的绝对路径,去掉多余的\n QString outputPath = QDir::homePath() + "/Desktop/PlazaPCO/" + QString::fromStdString(date) + ".mkv"; Qrec.setArguments({ "-framerate", "30", "-f", "avfoundation", "-i", "1", "-f", "avfoundation", "-framerate", "30", "-i", "0", "-c:v", "libx264", "-crf", "0", "-preset", "ultrafast", outputPath }); Qrec.start(); // 加个超时,避免无限等待 if(Qrec.waitForFinished(30000)){ // 打印FFmpeg的输出,排查问题 qDebug() << "FFmpeg输出:" << Qrec.readAll(); qDebug() << "Koniec - nagrywam"; } else { qDebug() << "FFmpeg执行超时或出错:" << Qrec.errorString(); qDebug() << "当前错误输出:" << Qrec.readAllStandardError(); } }
额外建议:先在终端手动测试FFmpeg命令
把你要执行的FFmpeg命令复制到终端里跑一遍,看看能不能生成文件。如果终端里也不行,那就是FFmpeg命令本身的问题(比如设备号1/0不对、编码参数错误),先把终端里的命令调通,再放到QProcess里。
内容的提问来源于stack exchange,提问作者NintySwinty
相关产品推荐
相关产品推荐

