2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00
2025-04-28 09:11:51 +08:00

video_decode_plugin

一个高性能的 Flutter 插件,用于在 Android 原生层解码 H.264 裸流数据,并支持两种渲染模式。

功能特点

  • 支持 H.264 Annex B 格式裸流解码(含 NALU 单元)
  • 使用 Android MediaCodec 硬解码,提供高性能解码能力
  • 支持两种渲染模式:
    • Flutter 纹理渲染:将解码后的帧通过 Flutter Texture 传递到 Flutter UI
    • 原生 SurfaceView 渲染:在原生 Android 层直接渲染
  • 提供完善的配置管理和性能监控
  • 支持动态丢帧策略,优化内存使用
  • 适配低端设备的性能优化措施

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  video_decode_plugin: ^0.0.1

使用方法

基本用法

import 'package:video_decode_plugin/video_decode_plugin.dart';

// 创建解码器Flutter 渲染模式)
final decoder = H264Decoder(renderMode: RenderMode.flutter);

// 初始化解码器
await decoder.init(
  const H264DecoderConfig(
    bufferSize: 10,
    maxWidth: 1280,
    maxHeight: 720,
    useDropFrameStrategy: true,
    debugMode: true,
  ),
);

// 开始解码
await decoder.start();

// 输入 H.264 数据
await decoder.feedData(h264Data);

// 暂停解码
await decoder.pause();

// 恢复解码
await decoder.resume();

// 释放资源
await decoder.release();

渲染视图

Flutter 渲染模式

// 使用 Flutter 渲染模式显示视频
H264VideoPlayerWidget(
  decoder: decoder,
  width: 640,
  height: 360,
  backgroundColor: Colors.black,
)

原生渲染模式

// 使用原生渲染模式显示视频
const H264NativePlayerWidget(
  width: 640,
  height: 360,
  backgroundColor: Colors.black,
)

监听事件

// 订阅解码器事件
decoder.eventStream.listen((event) {
  switch (event.type) {
    case H264DecoderEventType.frameAvailable:
      // 新帧可用
      break;
    case H264DecoderEventType.stats:
      // 性能统计信息
      final stats = event.data as Map<String, dynamic>;
      print('总帧数: ${stats['totalFrames']}');
      print('丢弃帧数: ${stats['droppedFrames']}');
      print('缓冲区使用: ${stats['bufferUsage']}');
      print('解码耗时: ${stats['lastDecodingTimeMs']}ms');
      break;
    case H264DecoderEventType.error:
      // 解码错误
      break;
  }
});

配置选项

H264DecoderConfig 类提供以下配置选项:

参数 类型 默认值 说明
bufferSize int 5 缓冲区大小(帧数)
maxWidth int 1280 最大解码宽度
maxHeight int 720 最大解码高度
useDropFrameStrategy bool true 是否启用丢帧策略
debugMode bool false 是否启用调试模式

性能优化

本插件提供多项性能优化措施:

  1. 动态丢帧策略:缓冲区满时,优先保留 I 帧,丢弃 P 帧,确保解码连续性。
  2. 零拷贝传输:使用 Surface 和 SurfaceTexture 直接渲染,避免内存拷贝。
  3. 异步处理:解码和渲染在独立线程进行,不阻塞主线程。
  4. 低端设备适配:可设置最大解码分辨率,避免低端设备性能问题。

示例应用

本项目自带一个完整的示例应用,演示如何使用这个插件播放 H.264 视频流。

运行示例:

cd example
flutter run

注意事项

  • 目前仅支持 Android 平台
  • 需要确保输入的 H.264 数据是有效的 Annex B 格式(含 NALU 开始码)
  • 建议在实际项目中根据设备性能动态调整解码配置

许可证

MIT

Description
可视对讲的原生端解码插件
Readme 48 MiB
Languages
Dart 46.8%
Swift 28.3%
Kotlin 22.9%
Ruby 2%