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

React Native Expo中m3u8转mp4求助:FFmpegKit报错及构建失败

在React Native Expo中将m3u8转成mp4的简单实现方法

你遇到的FFmpegKit报错,核心原因是它属于原生依赖包,在Expo的managed workflow下没法直接兼容,导致构建失败和运行时的null错误。下面给你两种Expo友好的实现方案:

方案一:用expo-ffmpeg(最直接)

这是Expo官方适配的FFmpeg库,不用 eject 就能用,步骤简单:

  1. 安装依赖
npx expo install expo-ffmpeg
  1. 编写转换代码
    注意要确保文件路径正确,这里结合Expo FileSystem来处理本地文件:
import { FFmpeg } from 'expo-ffmpeg';
import * as FileSystem from 'expo-file-system';

export async function convertM3u8ToMp4(m3u8Uri, outputFileName) {
  try {
    // 生成输出mp4的本地存储路径
    const mp4Uri = `${FileSystem.documentDirectory}${outputFileName}.mp4`;
    
    // FFmpeg转换命令,用-c:v copy和-c:a copy直接复制流,提升转换速度
    const command = `-i ${m3u8Uri} -c:v copy -c:a copy ${mp4Uri}`;
    const result = await FFmpeg.executeAsync(command);

    if (result.returnCode === 0) {
      console.log('转换成功!文件路径:', mp4Uri);
      return mp4Uri;
    } else {
      console.error('转换失败,返回码:', result.returnCode);
      // 查看日志排查问题
      const logs = await FFmpeg.getLogsAsync();
      console.log('FFmpeg运行日志:', logs);
    }
  } catch (err) {
    console.error('转换出错:', err);
  }
}
  1. 额外提示
    如果你的m3u8是网络链接,建议先下载到本地再转换,避免网络波动或跨域问题:
// 下载网络m3u8到本地
const downloadResult = await FileSystem.downloadAsync(
  'https://your-stream-url.m3u8',
  `${FileSystem.documentDirectory}input.m3u8`
);
// 用下载后的本地URI调用转换函数
await convertM3u8ToMp4(downloadResult.uri, 'output-video');

方案二:云端转换API(适合复杂场景)

如果本地FFmpeg还是有性能或兼容性问题,可以考虑用第三方云端转换服务:

  • 把m3u8文件上传到云端存储(比如Firebase Storage)
  • 调用转换API将m3u8转成mp4
  • 把转换后的mp4下载回本地

这个方案不用处理本地FFmpeg的配置,但需要依赖外部服务,注意费用和网络要求。

关于原FFmpegKit的补充

如果你一定要用FFmpegKit,必须切换到Expo的bare workflow,手动配置Android和iOS的原生依赖,但步骤繁琐,不推荐在managed workflow下尝试。你遇到的构建错误就是因为Expo没法自动处理原生包的依赖链。

内容的提问来源于stack exchange,提问作者DRx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:53:22