QT6中MediaRecorder录制视频的文件名与保存路径设置问题
解决QT6 QML中MediaRecorder视频保存路径与文件名的问题
问题原因
在Windows系统下直接给MediaRecorder.outputLocation设置字符串格式的完整路径时,QT的路径解析可能出现偏差,导致系统误将整个路径字符串识别为文件名,而非正确解析目录与文件名的组合。这通常是因为字符串路径的转义处理或类型不匹配导致的。
解决方案
- 使用Url类型指定路径:
outputLocation的属性类型是url,直接传入字符串可能引发解析问题,应使用url()函数将路径转为正确的Url类型。 - 使用正斜杠作为路径分隔符:Windows系统支持正斜杠作为路径分隔符,避免双反斜杠的转义麻烦。
- 确保目标目录存在:如果保存目录不存在,
MediaRecorder无法创建文件,会导致录制失败,需提前创建目录(可手动或通过代码处理)。 - 动态生成文件名(可选):为避免覆盖已有文件,可通过JS生成带时间戳的唯一文件名。
修改后的完整代码
import QtQuick 6.2 import QtMultimedia import recordcamera Window { width: 800 height: 600 visible: false title: "recordcamera" // 定义保存目录与文件名 property string saveDirectory: "D:/recordcamera/build/Desktop_Qt_6_6_3_MSVC2019_64bit-Release/" // 生成带时间戳的文件名,避免覆盖 property string videoFileName: "recording_" + new Date().toISOString().replace(/[:.]/g, "-") + ".mp4" MediaDevices { id: mediaDevices } Component.onCompleted: { recorder.record(); } Component.onDestruction: { recorder.stop(); } CaptureSession { id: captureSession camera: Camera { id: camera cameraDevice: mediaDevices.defaultVideoInput focusMode: Camera.FocusModeAutoNear active: true onErrorOccurred: (error, errorString) => { console.log("camera error:", errorString, error); } } audioInput: AudioInput {} recorder: MediaRecorder { id: recorder onErrorOccurred: (error, errorString) => { console.log("recorder error:", errorString, error); } quality: MediaRecorder.NormalQuality // 使用url()指定完整路径,确保正确解析目录与文件名 outputLocation: url(saveDirectory + videoFileName) } videoOutput: videoOutput } VideoOutput { id: videoOutput anchors.fill: parent fillMode: Image.Stretch } }
额外说明
- 若需要在代码中自动创建目录,可引入
Qt.labs.folderlistmodel模块,通过Folder类型检查并创建目录:import Qt.labs.folderlistmodel 6.2 Component.onCompleted: { let folder = Folder { url: saveDirectory } if (!folder.exists) { folder.createDirectory(); } recorder.record(); } - 确保你的QT项目已正确配置多媒体模块,并且Windows下的视频编码组件正常(QT6默认支持的编码格式可能需要额外的插件,若录制失败可检查编码器是否可用)。
内容的提问来源于stack exchange,提问作者KaiAkiho
相关产品推荐
相关产品推荐

