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

React-Native中H264流ArrayBuffer的JS解码方案求助

React Native 解码H264 ArrayBuffer的JS端解决方案

你的核心问题在于H264裸流没有标准容器结构(比如MP4、FLV),react-native-video无法直接识别裸流,所以之前转Blob的方法失效。以下是几个可行的JS/库实现方案:

1. 使用专门处理H264裸流的RN库

直接用react-native-h264-player这类库,它原生支持喂入H264 ArrayBuffer进行解码播放,无需转格式:

import H264Player from 'react-native-h264-player';

// 假设data是你的H264 ArrayBuffer
<H264Player
  buffer={data}
  style={{ width: 300, height: 200 }}
  fps={30} // 根据你的流帧率调整
/>

2. 在JS端将H264裸流封装为MP4容器

用mp4box.js把H264帧打包成标准MP4文件,再交给react-native-video播放。注意需要先提取H264流中的SPS/PPS参数(裸流开头通常包含这些信息):

import MP4Box from 'mp4box';

function wrapH264ToMP4(h264Buffer) {
  const mp4File = MP4Box.createFile();
  // 替换为你的H264实际编码参数(codec、分辨率等)
  const track = mp4File.addTrack({
    type: 'avc',
    codec: 'avc1.42E01E',
    width: 1920,
    height: 1080,
  });

  // 写入帧数据,需同步时间戳(示例为30fps)
  mp4File.addSample(track.id, h264Buffer, {
    duration: 1000 / 30,
    dts: 0,
    pts: 0,
    is_sync: true, // 标记为关键帧(根据实际帧类型调整)
  });

  // 生成MP4 Blob
  const buffers = [];
  mp4File.onSegment = (_, buffer) => buffers.push(buffer);
  mp4File.flush();
  
  return new Blob(buffers, { type: 'video/mp4' });
}

// 使用示例
const mp4Blob = wrapH264ToMP4(data);
const videoUrl = URL.createObjectURL(mp4Blob);

3. 写入本地文件(适合大流量/实时流场景)

如果内存占用过高(比如长时间实时流),可以用react-native-fs将H264流逐帧写入本地MP4文件,再让react-native-video播放本地路径:

import RNFS from 'react-native-fs';
import MP4Box from 'mp4box';

async function writeH264ToLocalFile(h264Buffer) {
  const filePath = `${RNFS.DocumentDirectoryPath}/stream.mp4`;
  const mp4File = MP4Box.createFile();
  const track = mp4File.addTrack({
    type: 'avc',
    codec: 'avc1.42E01E',
    width: 1920,
    height: 1080,
  });

  mp4File.addSample(track.id, h264Buffer, {
    duration: 1000 / 30,
    dts: 0,
    pts: 0,
    is_sync: true,
  });

  // 生成MP4分段并追加到本地文件
  mp4File.onSegment = async (_, buffer) => {
    await RNFS.appendFile(filePath, buffer.toString('base64'), 'base64');
  };
  mp4File.flush();

  return filePath;
}

// 播放本地文件
<Video source={{ uri: `file://${filePath}` }} />

关键注意事项

  • 必须确保H264流包含SPS/PPS参数,否则解码器无法初始化;如果流中没有,需要单独传入这些参数给播放器/封装库
  • 实时流场景要严格同步帧的DTS/PTS时间戳,避免播放卡顿、跳帧
  • 不同设备对H264的profile/level支持有差异,需确保编码参数与播放器兼容

内容的提问来源于stack exchange,提问作者Stéphane R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:30:41