[✔️]cocos2dx中播视频的实现思路以及存在的问题

简介: [✔️]cocos2dx中播视频的实现思路以及存在的问题

视频、动画的原理就是逐帧播放


先看一段伪代码:


class VideoPlayer{
    void init(string mp4File) {
        auto textures = ffmpeg.decode(mp4File);
        for(int i=0; i< textures.size(); i++){
           this->_textureMaps[i]=textures.at(i);
        }
    }
    void play() {
        this->_state="playing";
    }
    void update(float dt){
        if(this->_state == "playing"){
            this->frameIndex++;
            auto frame = video->getFrame();
            this->render(frame);
        }
    }
    Texture* getFrame(){
        return this->_textureMaps[this->frameIndex];
    }
}


这段代码是最初我对视频的一个理解,大致的思路就是将视频的每一帧画面都解析出来后,以帧为key,保存到一个map中,当播放的时候,依次按照顺序从头开始依次播放。

这么实现视频播放的确能看到效果,视频的确播放起来了。


存在的问题


上边的思路,其实存在非常多的问题。


内存会爆表


如果一个60fps的10秒时长视频,分辨率是 1920 * 1080 分辨率,如果解析为RGBA8888,大概占用的内存大小为60x10x1920x1080x4字节这么大,当然你可以给视频减配,但是这个问题仍旧存在,本质是缓存cache导致的。


导致严重的卡顿


因为视频的解码是一个密集运算的逻辑,当然也可以通过多线程解决这个问题。


播放速率


每一帧所处的时间,在解码结果里面是有这个信息的,因为播放依赖update驱动,需要自己根据update的dt参数,自己计算当前走到了第几帧,这里面就牵扯到了同步的问题,有很多思路,后续会逐步展开。


音频怎么同步


上述代码中其实也没有说明音频是如何同步的,在FFMpeg中,音视频都是一个stream,我们需要做的就是拿到这个steam之后,按照自己的需求处理,但是因为音视频的处理方式是不同的,所以这里又牵扯到了同步问题


总结


初次接触音视频开发,可以看到细节还是非常多的,经过我的深入思考和多方面的请教,在主线程中解码视频并立即播放,这种方式存在大量的弊端,所以专业的音视频开发者都不会这么搞,多线程是肯定的,其次,关于cache,一般都会做容量的限制,像伪代码里面这种做法,会被人笑掉大牙的。


目录
相关文章
|
缓存 Linux
kswapd0内存过高排查经历
kswapd0内存过高排查经历
809 1
|
安全 Java Spring
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
本篇带大家一起从源码了解 Spring Boot 内置的Http编码功能
366 8
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
|
JSON Go 数据格式
【Golang】解决使用interface{}解析json数字会变成科学计数法的问题
【2月更文挑战第9天】解决使用interface{}解析json数字会变成科学计数法的问题
800 0
|
存储 算法 NoSQL
还分不清 Cookie、Session、Token、JWT?看这一篇就够了
Cookie、Session、Token 和 JWT(JSON Web Token)都是用于在网络应用中进行身份验证和状态管理的机制。虽然它们有一些相似之处,但在实际应用中有着不同的作用和特点,接下来就让我们一起看看吧,本文转载至http://juejin.im/post/5e055d9ef265da33997a42cc
50447 14
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
461 12
|
8月前
|
JSON 人工智能 JavaScript
cursor 如何调用 MCP server
本文介绍了如何在 Cursor 中配置并调用 MCP Server,以实现天气信息查询功能。内容涵盖 MCP 配置步骤、JSON 文件设置、MCP Server 的调用方法及结果展示,帮助开发者快速集成外部服务。
|
API C# 图形学
Unity调用Windows弹出确认框
在 Unity 中调用 Windows 弹出确认框,可通过 Windows API 或 .NET 框架实现。使用 Windows API 的方式是通过 P/Invoke 技术调用 MessageBox 函数,创建模态对话框。代码示例展示了如何在应用退出时弹出确认框,用户选择“确定”则退出游戏。此方法也适用于 ALT+F4 触发的退出确认。
|
人工智能 自然语言处理 并行计算
MeteoRA:多任务AI框架革新!动态切换+MoE架构,推理效率提升200%
MeteoRA 是南京大学推出的多任务嵌入框架,基于 LoRA 和 MoE 架构,支持动态任务切换与高效推理。
700 3
|
缓存 Java Maven
Spring Boot 启动错误:To display the conditions report re-run your application with ‘debug‘ enable —【已解决】
Spring Boot 启动错误:To display the conditions report re-run your application with ‘debug‘ enable —【已解决】
5097 1
|
存储 SQL 数据库
【Android 从入门到出门】第六章:使用Room数据库并测试
【Android 从入门到出门】第六章:使用Room数据库并测试
372 4