#h264 #bevy #bevy-plugin

bevy_h264

Bevy的一个基础h264播放器

1 个不稳定版本

0.1.0 2024年4月1日

#294 in 视频

MIT许可证

15KB
237 代码行

Bevy H264

此插件是Bevy中播放.h264视频的一个非常基础的解决方案。请注意,这只能播放.h264视频,不支持b帧。没有音频支持!

这是对Bevy Video的延续

建议使用ffmpeg进行视频编码,并使用以下参数:-bf 0和x264-param slices=1

ffmpeg -i test.mkv -c:v libx264 -bf 0 -x264-params slices=1 test.h264

您的ffmpeg必须使用libx264编译

用法

使用以下方式创建组件

let decoder = H264Decoder::new(
    &mut images, // ResMut<Assets<Images>>
    asset_server.load("test.h264"), // The video file to load
    false, // Repeat?
    1.0 / 60.0, // Frame Time. This will play the video at 60 FPS
);

使用以下方式获取图像句柄

decoder.get_render_target();

建议将解码器组件插入到将使用渲染目标句柄的材料中的实体上。如果从文件加载视频,则插入H264DecoderLoading组件

H264DecoderLoading {}

由于图像更改只有在材料被可变访问后才会反映在材料上,因此请读取事件

fn modify_materials(
    query: Query<&Handle<StandardMaterial>, With<H264Decoder>>,
    mut update_ev: EventReader<H264UpdateEvent>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    for update in update_ev.read() {
        if let Ok(asset_handle) = query.get(update.0) {
            let _ = materials.get_mut(asset_handle);
        }
    }
}

并将系统添加到您的应用中

.add_systems(Update, modify_materials.after(decode_video))

通过在解码器实体上插入H264DecoderPause组件来暂停视频。如果decoder.repeat == false,则在视频结束时H264DecoderPause将被插入。

这完全不进行硬件加速。如果您想达到60+ FPS,请确保以发布模式编译

关于h264的专利和许可

以下内容不是法律建议,只是我对该主题的研究结果。h264编解码器与其相关的专利很多,在此列出 https://www.reddit.com/r/linux/comments/10v3op0/which_year_should_we_treat_h264_patents_as/

MPEG LA还要求在您将视频与应用程序捆绑销售时获得许可 https://www.via-la.com/licensing-2/avc-h-264/avc-h-264-license-fees/ 编码器本身随Windows和Mac一起发货,因此应用程序应关注的唯一费用是第2节标题。如果您发货不超过12分钟,则无需支付版税费。否则,费用为每标题0.02美元。我假设销售您的应用程序的1份副本算作1个“标题”。

如果您决定将带有h264视频的商业应用程序进行发货,我强烈建议您进行研究并联系律师

依赖项

~38–74MB
~1.5M SLoC