React Native Expo中m3u8转mp4求助:FFmpegKit报错及构建失败
在React Native Expo中将m3u8转成mp4的简单实现方法
你遇到的FFmpegKit报错,核心原因是它属于原生依赖包,在Expo的managed workflow下没法直接兼容,导致构建失败和运行时的null错误。下面给你两种Expo友好的实现方案:
方案一:用expo-ffmpeg(最直接)
这是Expo官方适配的FFmpeg库,不用 eject 就能用,步骤简单:
- 安装依赖
npx expo install expo-ffmpeg
- 编写转换代码
注意要确保文件路径正确,这里结合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); } }
- 额外提示
如果你的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
相关产品推荐
相关产品推荐

