React Native中FFprobeKit偶发执行失败,无法获取具体错误求助
获取FFprobeKit执行失败的精确错误信息方法
针对你用FFprobeKit偶发获取视频时长失败但无详细错误的问题,可以通过以下几种方式排查:
1. 调整FFprobe命令的日志级别
当前命令使用-v error会过滤掉大部分调试信息,改为更详细的日志级别,比如-v verbose或-v debug,能输出执行过程中的所有细节,包括文件读取、流解析的错误:
-v verbose -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 ${uri}
2. 优化错误捕获逻辑,获取错误输出与完整日志
原代码混用async/await和then,且未获取FFprobe的错误输出(stderr),修改后统一用async/await,同时捕获错误输出和完整日志:
const getVideoDuration = async (uri: string): Promise<void> => { try { const information = await FFprobeKit.executeAsync( `-v verbose -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 ${uri}` ); const returnCode = information.getReturnCode(); if (returnCode.isError()) { // 获取错误输出(stderr) const errorOutput = await information.getErrorOutput(); console.error("FFprobe执行错误:", errorOutput.toString()); // 获取全部执行日志 const allLogs = await information.getAllLogs(); console.error("完整日志:", allLogs.map(log => log.getMessage()).join("\n")); return; } const output = await information.getOutput(); const durationValue = parseFloat(output.toString()); if (!isNaN(durationValue)) { setInputVideoDuration(durationValue * 1000); } else { console.error("时长解析失败,输出内容:", output.toString()); } } catch (error) { console.error("全局异常捕获:", error); } };
3. 启用全局日志回调
通过FFmpegKit的全局日志监听,捕获所有底层库的输出,包括libswscale、libswresample等组件的日志:
import { FFmpegKitConfig } from 'ffmpeg-kit-react-native'; // 在App初始化阶段设置 FFmpegKitConfig.enableLogCallback(log => { console.log(`FFmpegKit日志: ${log.getMessage()}`); }); FFmpegKitConfig.enableStatisticsCallback(stats => { console.log(`执行统计: ${JSON.stringify(stats)}`); });
4. 检查URI合法性与文件权限
偶发失败可能和文件访问权限、URI格式有关:
- Android上如果使用
content://格式的URI,需确保App有读取媒体文件的权限; - iOS上要确认文件在App沙盒可访问范围内,必要时将
content://URI转换为沙盒文件路径。
内容的提问来源于stack exchange,提问作者sandulasanth-7
相关产品推荐
相关产品推荐

