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 | 是否启用调试模式 |
性能优化
本插件提供多项性能优化措施:
- 动态丢帧策略:缓冲区满时,优先保留 I 帧,丢弃 P 帧,确保解码连续性。
- 零拷贝传输:使用 Surface 和 SurfaceTexture 直接渲染,避免内存拷贝。
- 异步处理:解码和渲染在独立线程进行,不阻塞主线程。
- 低端设备适配:可设置最大解码分辨率,避免低端设备性能问题。
示例应用
本项目自带一个完整的示例应用,演示如何使用这个插件播放 H.264 视频流。
运行示例:
cd example
flutter run
注意事项
- 目前仅支持 Android 平台
- 需要确保输入的 H.264 数据是有效的 Annex B 格式(含 NALU 开始码)
- 建议在实际项目中根据设备性能动态调整解码配置
许可证
MIT
Description
Languages
Dart
46.8%
Swift
28.3%
Kotlin
22.9%
Ruby
2%