startRecording(saveDirectory)异常:flutter_vlc_player录制无人机视频未保存至指定目录
解决flutter_vlc_player录制无人机视频后无文件留存的问题
1. 先确认权限配置是否到位
不管Android还是iOS,录制视频+存储文件都需要对应权限,缺了权限就算startRecording返回true,最终也存不了文件:
- Android:
在AndroidManifest.xml里添加权限(Android 13+要用新的媒体权限):
还要在代码里用<!-- Android 12及以下 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Android 13+ --> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.WRITE_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />permission_handler库主动动态申请权限。 - iOS:
在Info.plist里添加:<key>NSCameraUsageDescription</key> <string>需要相机权限录制视频</string> <key>NSMicrophoneUsageDescription</key> <string>需要麦克风权限录制音频</string> <key>NSPhotoLibraryAddUsageDescription</key> <string>需要存储权限保存录制的视频</string>
2. 确保录制目录存在且路径正确
VLC不会自动创建不存在的文件夹,必须提前生成目录:
final saveDir = '/storage/emulated/0/MyDroneRecordings'; // 示例路径,根据平台调整 final directory = Directory(saveDir); if (!await directory.exists()) { await directory.create(recursive: true); } // 再调用录制 await _vlcController.startRecording(saveDir);
另外,打印实际录制路径,手动去文件管理器核实路径是否正确,避免用相对路径或错误的沙箱路径(iOS需用getApplicationDocumentsDirectory()等API获取合法路径)。
3. 正确调用录制结束方法,别着急检测文件
stopRecording()是异步操作,刚调用就检测文件会因为未完成写入而返回false,必须等待执行完成:
// 等待录制结束完成 await _vlcController.stopRecording(); // 再检测文件(注意文件名,部分插件版本会自动生成,可打印完整路径确认) final recordFile = File('$saveDir/recording.mp4'); if (await recordFile.exists()) { print('文件已保存'); } else { print('文件未找到'); }
4. 排查flutter_vlc_player版本与兼容性
旧版本插件可能存在录制bug,建议升级到最新稳定版,同时确认Flutter版本与插件版本兼容。Android端还要检查build.gradle中的VLC依赖配置是否正常,无版本冲突。
5. 检查无人机流的编码格式
部分无人机的视频流编码(如H.265)可能不被VLC录制功能支持,尝试切换无人机流编码为H.264,或调用startRecording时指定录制格式:
await _vlcController.startRecording(saveDir, format: 'mp4');
6. 查看Native端日志定位具体错误
如果以上步骤都无效,查看Native端日志找根源:
- Android:用Android Studio的Logcat,过滤“VLC”或“Recording”关键词,查找“无法打开输出文件”“权限被拒”等错误信息。
- iOS:用Xcode打开Runner项目,查看控制台输出,定位录制相关报错。
内容的提问来源于stack exchange,提问作者Ryan Himongala
相关产品推荐
相关产品推荐

