You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:27:44