我正在构建一个跨平台应用程序来记录多媒体文件以进行持续处理。这是基于继承的应用程序,我无法使用替代库重写。
我目前的问题是QMediaRecorder显然没有将视频文件保存到本地驱动器上 - 我暂时将要保存为banana.mov
的文件硬编码到用户根文件夹中。< / p>
执行时,不保存输出文件。
我尝试按照建议here强制执行解决方案,并且已经看到其他人在Windows上录制了问题,但OSX是fine
使用Qt5.4开发环境OSX 10.10(在使用Qt5.3的Windows 8.1计算机上也会出现同样的问题)
此code on Github基于相机示例,在尝试识别和重现问题时添加了额外的调试代码。
在调查时,QMediaRecorder::supportedAudioCodecs和。{ QMediaRecorder::supportedVideoCodecs都返回空列表。这在OSX构建和Windows环境中都会发生。
调试输出如下:
Status change SIGNAL 'The recorder is initializing.'
Output location file:~/banana.mov
2015 01 05 14:59:58.111 Number of supported AUDIO Codecs 0
2015 01 05 14:59:58.111 Number of Audio sample rates 0
2015 01 05 14:59:58.111 Number of Video Codecs 0
2015 01 05 14:59:58.111 Number of Video Frame Rates 0
2015 01 05 14:59:58.111 Number of Containers 0
Location Changed SIGNAL 'file:~/banana.mov'
State change SIGNAL 'The recording is requested.'
Recording should have started
2015 01 05 14:59:58.111 Number of supported AUDIO Codecs 0
2015 01 05 14:59:58.111 Number of Audio sample rates 0
2015 01 05 14:59:58.111 Number of Video Codecs 0
2015 01 05 14:59:58.111 Number of Video Frame Rates 0
2015 01 05 14:59:58.111 Number of Containers 0
Status change SIGNAL 'Recording is requested but not active yet.'
我有一种感觉,我错过了一些非常明显的东西,我还没有发现它!
编辑1 显而易见,状态为Recording is requested but not active yet
而不是Recording is active
。我目前正在努力解决为什么录音还没有开始。
编辑2 录音机示例会录制并保存音频文件。看起来QMediaRecorder 不返回可用音频编解码器列表,但QAudioRecorder 确实返回音频编解码器列表。我在使用Qt5.3的Windows 8.1和使用Qt 5.4的OSX上获得了相同的结果
答案 0 :(得分:2)
您很有可能在查看特定于操作系统的工件,而不是QT的核心问题。
我在很多工具包和框架中已经多次看到过这个问题,让我感到害怕的是,还没有人找到一个优雅的解决方案。
大多数操作系统都会对关键系统文件实施某种保护。
在* nix下,这是用户/组权限系统的形式,在windows下它与UAC(用户访问控制)子系统类似。
这归结为您经常无法选择任意位置来编写文件,而不是首先寻求操作系统中各种安全API和机制的许可。
问题的后半部分来自变量扩展。
在* nix中特别是波浪形的char&#39;〜&#39;由shell扩展为用户主目录。
当我们说shell时,我们指的是运行应用程序的bash,tch,csh或者环境。
在这种混合中,我们也会放置桌面环境,因为像Kde,Gnome,Unity或其他任何东西正在使用的大多数东西都有某种操作系统调用,当一个&#39; 〜&#39;传递给它,知道将其转换为&#39; / home / neil /&#39;或者它还需要扩展什么。
Windows也有类似的东西,你可以拨打操作系统,然后说'嘿嘿mr操作系统,我的用户文件夹存放在哪里&#39;,它会很乐意回答#&39; ; C:\用户\&#39;只是因为当你自己负责创建路径字符串时,在你自己的应用程序中,事情通常不会传递给这些各种OS调用以进行扩展和安全许可,你几乎必须确保你的那个调用它们的那个
此规则的例外情况是,如果您使用* nix的小工具理念结合起来完成一项工作。在这种情况下,您经常会将结果传递给基于shell的程序,因为它通过shell运行然后知道如果它看到&#39;〜&#39;它必须扩大它。
请注意您使用直接文件访问权限,当您认为在哪里写入&#39; \ home \ neil \ file.mov&#39;时管理您自己的文件路径你实际上在哪里试图写一个名为&#39; file.mov&#39;的文件。在运行应用程序的当前文件夹中,在名为&#39;〜&#39;的文件夹中。我愿意做的事情并不存在。
除此之外,很多这些框架(QT也不例外)的目的是隐藏和抽象出所有丑陋的细节,很有可能它消耗了实际生成的操作系统异常。试图编写该文件,如果没有,那么你的应用程序很可能会因某种异常对话而崩溃。
您可以采取3种方法来减轻这种情况。
1)您可以对路径进行硬编码,也就是说您可以明确地告诉应用程序始终将文件存储在&#39; /home/neil/videos/blah.mov' ;,这有一个然而,应用程序的每个用户都需要自定义构建,因为它不太可能是“人”2。将在&neil的主目录上拥有写权限。
2)您可以构建为用户提供对话框的功能,并询问他们要保存文件的位置。由于您使用QT之类的东西应该非常简单,因此大多数这些UI工具包都具有内置功能,可以轻松地为用户提供这样的体验。
3)您可以查看您的框架或底层操作系统是否有任何要求您询问当前用户是谁以及他们的主目录所在的位置,然后您可以使用返回的信息动态构建静态补丁类似于选项1中的静态补丁。这样做可以确保应用程序自动适应其环境,无论用户如何。
我自己,我一般在开发过程中采用选项1,然后在开发完成后我切换到2号,很少在基于桌面的软件中使用3号。
通常在有问题的应用程序用于执行单个作业时使用选项3,例如转换文件以供其他进程使用,或者为服务器生成一些输出以显示在网页中等。
对于你,现在作为这个问题的解决方案,选项1是你最好的选择。
答案 1 :(得分:0)
为了增加Shawty的好答案,我发现Qt不支持在Windows上录制http://doc.qt.io/qt-5/qtmultimedia-windows.html
这可能会有所帮助https://github.com/kibsoft/QtMEL