React Native中FFmpegKit报错:Cannot read property 'ffmpegSession' of null
排查与解决方案
1. 确认FFmpegKit的安装与初始化正确性
- 确保安装适配Expo的完整功能包,推荐安装
ffmpeg-kit-react-native-full,执行命令:npm install ffmpeg-kit-react-native-full # 或 yarn add ffmpeg-kit-react-native-full - 将初始化时机提前到App启动阶段,而非仅在调用FFmpeg命令前执行,比如在
App.js中:import { useEffect } from 'react'; import { FFmpegKitConfig } from 'ffmpeg-kit-react-native'; function App() { useEffect(() => { const initFFmpeg = async () => { try { await FFmpegKitConfig.init(); console.log('FFmpegKit初始化成功'); } catch (err) { console.error('FFmpegKit初始化失败:', err); } }; initFFmpeg(); }, []); // 其余App代码 } - 查看初始化阶段的错误日志,若初始化失败,后续调用必然出现
ffmpegSession为null的问题。
2. 修正视频路径处理逻辑
Expo Image Picker返回的URI多为临时或系统媒体库路径,FFmpegKit无法直接访问,需先将视频复制到Expo沙箱目录:
import * as ImagePicker from 'expo-image-picker'; import * as FileSystem from 'expo-file-system'; import { FFmpegKit } from 'ffmpeg-kit-react-native'; const pickVideoAndExtractFrame = async () => { // 选择视频 const result = await ImagePicker.launchVideoLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Videos, allowsEditing: false, }); if (!result.canceled && result.assets[0].uri) { const videoUri = result.assets[0].uri; // 生成沙箱内的目标路径 const fileName = videoUri.split('/').pop(); const targetPath = `${FileSystem.documentDirectory}${fileName}`; try { // 复制视频到沙箱目录 await FileSystem.copyAsync({ from: videoUri, to: targetPath, }); // 执行FFmpeg命令提取第1秒的帧 const command = `-i "${targetPath}" -ss 00:00:01 -vframes 1 "${FileSystem.documentDirectory}frame.jpg"`; const session = await FFmpegKit.executeAsync(command); // 检查执行结果 const returnCode = await session.getReturnCode(); if (returnCode.isValueSuccess()) { console.log('帧提取成功'); console.log('帧路径:', `${FileSystem.documentDirectory}frame.jpg`); } else { const error = await session.getFailStackTrace(); console.error('帧提取失败:', error); } } catch (copyErr) { console.error('复制视频失败:', copyErr); } } };
- 路径含空格或特殊字符时,必须用引号包裹,避免FFmpeg命令解析错误。
3. 检查Expo Workflow兼容性
- 若使用Expo Managed Workflow,需在
app.json/app.config.js中添加配置插件:
执行{ "expo": { "plugins": [ "ffmpeg-kit-react-native" ] } }expo prebuild生成原生配置后,重启项目。 - 若使用Bare Workflow,确保已执行
pod install(iOS)或同步Android原生依赖,保证FFmpegKit原生模块正确链接。
4. 验证FFmpegKit调用方式
- 使用
FFmpegKit.executeAsync()异步调用,避免使用已废弃的FFmpegKit.execute(),异步调用能正确返回会话对象,减少空指针问题。 - 若仍出现会话为null,可尝试用
FFmpegKit.execute()同步调用测试,排查是否异步初始化未完成就执行命令。
内容的提问来源于stack exchange,提问作者ragav ravi
相关产品推荐
相关产品推荐

