lv_ffmpeg学习及播放rtsp

news2024/12/28 9:45:01

lvgl8.3有ffmpeg支持

FFmpeg support

typedef struct {
    lv_img_t img;
    lv_timer_t * timer;
    lv_img_dsc_t imgdsc;
    bool auto_restart;
    struct ffmpeg_context_s * ffmpeg_ctx;
} lv_ffmpeg_player_t;

typedef enum {
    LV_FFMPEG_PLAYER_CMD_START,
    LV_FFMPEG_PLAYER_CMD_STOP,
    LV_FFMPEG_PLAYER_CMD_PAUSE,
    LV_FFMPEG_PLAYER_CMD_RESUME,
    _LV_FFMPEG_PLAYER_CMD_LAST
} lv_ffmpeg_player_cmd_t;

struct ffmpeg_context_s {
    AVFormatContext * fmt_ctx;
    AVCodecContext * video_dec_ctx;
    AVStream * video_stream;
    uint8_t * video_src_data[4];
    uint8_t * video_dst_data[4];
    struct SwsContext * sws_ctx;
    AVFrame * frame;
    AVPacket pkt;
    int video_stream_idx;
    int video_src_linesize[4];
    int video_dst_linesize[4];
    enum AVPixelFormat video_dst_pix_fmt;
    bool has_alpha;
};

1. lv_ffmpeg_player_create 调用构造函数创建播放器


//构造函数
lv_ffmpeg_player_constructor
{
// 主要创建用于刷新图像的定时器
player->timer = lv_timer_create(lv_ffmpeg_player_frame_update_cb,
                                    FRAME_DEF_REFR_PERIOD, obj);
}

2.lv_ffmpeg_player_set_src(player, "/userdata/lvgl_app/birds.mp4");

2.1 打开给定视频文件

    //打开文件, 寻找视频流及对应解码器 设置最终像素格式等参数
    player->ffmpeg_ctx = ffmpeg_open_file(path);

    //根据获得的视频流信息申请图像空间及ffmpeg需要的frame pkt
    if(ffmpeg_image_allocate(player->ffmpeg_ctx) < 0) 
    
    //将ffmpeg解码数据与lvgl图片刷新区域相关联
    player->imgdsc.data = ffmpeg_get_img_data(player->ffmpeg_ctx);
    lv_img_set_src(&player->img.obj, &(player->imgdsc));

3. lv_ffmpeg_player_set_cmd(player, LV_FFMPEG_PLAYER_CMD_START);开始播放

            //重新启动图像刷新定时器
            lv_timer_resume(timer);
            
构造函数中创建
    // 主要创建用于刷新图像的定时器
    player->timer = lv_timer_create(lv_ffmpeg_player_frame_update_cb,
                                    FRAME_DEF_REFR_PERIOD, obj);

4.简单修改,实现播放rtsp流

    lv_obj_t * player = lv_ffmpeg_player_create(lv_scr_act());
    //lv_ffmpeg_player_set_src(player, "/userdata/lvgl_app/birds.mp4");
    lv_ffmpeg_player_set_src(player, "rtsp://admin:p@ssw0rd@192.168.51.210/h264/ch33/main/av_stream");
    //lv_ffmpeg_player_set_auto_restart(player, true);
    lv_ffmpeg_player_set_cmd(player, LV_FFMPEG_PLAYER_CMD_START);
    lv_obj_center(player);

4.1 关闭所有暂停及seek操作

            av_seek_frame(player->ffmpeg_ctx->fmt_ctx,
                          0, 0, AVSEEK_FLAG_BACKWARD);
                          
                           lv_timer_pause(player->timer);

4.1 网络初始化

avformat_network_init();

4.2 设置帧率

lv_res_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path)
{
   if(period > 0) {
        LV_LOG_INFO("frame refresh period = %d ms, rate = %d fps",
                    period, 1000 / period);
        lv_timer_set_period(player->timer, period);
    }
    else {
        LV_LOG_WARN("unable to get frame refresh period");
#if rtsp
        lv_timer_set_period(player->timer, (1/25)*1000);
#endif
    }
    }

4.3 设置参数

struct ffmpeg_context_s * ffmpeg_open_file(const char * path){
    //3.设置打开媒体文件的相关参数
    AVDictionary *options = NULL;
    av_dict_set(&options, "buffer_size", "6M", 0); // 设置 buffer_size 为 2MB
    //以tcp方式打开,如果以udp方式打开将tcp替换为udp
    av_dict_set(&options, "rtsp_transport", "tcp", 0);
    //设置超时断开连接时间,单位微秒,3000000表示3秒
    av_dict_set(&options, "stimeout", "1000000", 0);
    //设置最大时延,单位微秒,1000000表示1秒
    av_dict_set(&options, "max_delay", "1000000", 0);
    //自动开启线程数
    av_dict_set(&options, "threads", "auto", 0);
    // 设置分析持续时间
    //av_dict_set(&options, "analyzeduration", "1000000", 0);
    // 设置探测大小
    av_dict_set(&options, "probesize", "5000000", 0);

    if(avformat_open_input(&(ffmpeg_ctx->fmt_ctx), path, NULL, &options) < 0) {
        LV_LOG_ERROR("Could not open source file %s", path);
        goto failed;
    }

        //修改解码帧颜色格式
        ffmpeg_ctx->video_dst_pix_fmt = AV_PIX_FMT_RGBA ;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自定义kali:增加60+常用渗透工具,哥斯拉特战版,cs魔改应有尽有,菜单栏启动

前言&#xff1a; 集合了六十多个工具&#xff0c;有师傅说需要&#xff0c;特搞来&#xff0c;我是脚本小子我爱用 介绍&#xff1a; 主要在菜单增加了非常多别人现成的工具&#xff0c;工具名单&#xff1a; 信息收集&#xff1a; 密探渗透测试工具 水泽 ehole 灯塔 …

数据结构(Java)——链表

1.概念及结构 链表是一种 物理存储结构上非连续 存储结构&#xff0c;数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 2.分类 链表的结构非常多样&#xff0c;以下情况组合起来就有 8 种链表结构&#xff1a; &#xff08;1&#xff09;单向或者双向 &#xff08;…

Linux 文件的特殊权限—Sticky Bit(SBIT)权限

本文为Ubuntu Linux操作系统- 第十九期~~ 其他特殊权限: 【SUID 权限】和【SGID 权限】 更多Linux 相关内容请点击&#x1f449;【Linux专栏】~ 主页&#xff1a;【练小杰的CSDN】 文章目录 Sticky&#xff08;SBIT&#xff09;权限基本概念Sticky Bit 的表示方式举例 设置和取…

PPT画图——如何设置导致图片为600dpi

winr&#xff0c;输入regedit打开注册表 按路径找&#xff0c;HKEY_CURRENT_USER\Software\Microsoft\Office\XX.0\PowerPoint\Options&#xff08;xx为版本号&#xff0c;16.0 or 15.0或则其他&#xff09;。名称命名&#xff1a;ExportBitmapResolution 保存即可&#xff0c;…

小米汽车加速出海,官网建设引领海外市场布局!

面对国内市场的饱和态势&#xff0c;中国企业出海步伐纷纷加速&#xff0c;小米也是其中的一员。Canalys数据显示&#xff0c;2024年第三季度&#xff0c;小米以13.8%的市场份额占比&#xff0c;实现了连续17个季度位居全球前三的成绩。 据“36 氪汽车”报道&#xff0c;小米汽…

Cocos Creator 试玩广告开发 第二弹

上一篇的项目是2d的&#xff0c;现在谈谈对于3d试玩项目的一些经历。 相对于2d来说&#xff0c;3d的项目更接近于Unity的开发&#xff0c;但是也有很多不一样的地方&#xff0c;具体的也可以参考Cocos给他官方示例。 Unity 开发者入门 Cocos Creator 快速指南 | Cocos Creator…

CTFshow—爆破

Web21 直接访问页面的话会弹窗需要输入密码验证&#xff0c;抓个包看看&#xff0c;发现是Authorization认证&#xff0c;Authorization请求头用于验证是否有从服务器访问所需数据的权限。 把Authorization后面的数据进行base64解码&#xff0c;就是我们刚刚输入的账号密码。 …

docker-开源nocodb,使用已有数据库

使用已有数据库 创建本地数据库 数据库&#xff1a;nocodb 用户&#xff1a;nocodb 密码&#xff1a;xxxxxx修改docker-compose.yml 默认网关的 IP 地址是 172.17.0.1&#xff08;适用于 bridge 网络模式&#xff09;version: "2.1" services:nocodb:environment:…

UGUI简单动画制作

一、最终效果 UI简单动画制作 二、制作过程 1、打开动画制作窗口 2、新建一个动画 3、给一个对象制作动画 4、创建动画控制器进行不同动画变换控制 5、书写脚本&#xff0c;通过按钮来进行不同动画切换 using System.Collections; using System.Collections.Generic; using U…

[SAP ABAP] 程序备份

备份当前程序到本地的方式如下&#xff1a; 1.复制粘贴 Ctrl A 、Ctrl V 2.【实用程序】|【更多实用程序】|【上载/下载】|【下载】 ​ 3.快捷键&#xff0c;支持多种格式导出(.abap .html .pdf 等) 在事务码SE38(ABAP编辑器)屏幕右下角&#xff0c;点击【Options选项】图…

代码随想录Day51 99. 岛屿数量,99. 岛屿数量,100. 岛屿的最大面积。

1.岛屿数量深搜 卡码网题目链接&#xff08;ACM模式&#xff09;(opens new window) 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接…

【漏洞复现】CVE-2022-41678 Arbitrary JMX Service Invocation with Web Interface

漏洞信息 NVD - cve-2022-41678 Apache ActiveMQ prior to 5.16.5, 5.17.3, there is a authenticated RCE exists in the Jolokia /api/jolokia. 组件影响版本安全版本Apache:ActiveMQ< 5.16.6> 5.16.6Apache:ActiveMQ5.17.0 - 5.17.4> 5.17.4&#xff0c;> 6.…

Bash 脚本教程

注&#xff1a;本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程&#xff0c;非常不错&#xff0c;至少没接触过 BASH 的也能看懂&#xff01; 建立一个脚本 Linux 中有…

操作系统(26)数据一致性控制

前言 操作系统数据一致性控制是确保在计算机系统中&#xff0c;数据在不同的操作和处理过程中始终保持正确和完整的一种机制。 一、数据一致性的重要性 在当今数字化的时代&#xff0c;操作系统作为计算机系统的核心&#xff0c;负责管理和协调各种资源&#xff0c;以确保计算机…

48页PPT|2024智慧仓储解决方案解读

本文概述了智慧物流仓储建设方案的行业洞察、业务蓝图及建设方案。首先&#xff0c;从政策层面分析了2012年至2020年间国家发布的促进仓储业、物流业转型升级的政策&#xff0c;这些政策强调了自动化、标准化、信息化水平的提升&#xff0c;以及智能化立体仓库的建设&#xff0…

Windows和Linux安全配置和加固

一.A模块基础设施设置/安全加固 A-1.登录加固 1.密码策略 a.最小密码长度不少于8个字符&#xff0c;将密码长度最小值的属性配置界面截图。 练习用的WindowsServer2008,系统左下角开始 > 管理工具 > 本地安全策略 > 账户策略 > 密码策略 > 密码最小长度&#…

EleutherAI/pythia-70m

EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型&#xff0c;它是 Pythia Scaling Suite 系列中参数量最小的模型&#xff0c;拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究&#xff1b; Pythia Scaling Suite是为促进可解释性…

Linux系统编程——详解页表

目录 一、前言 二、深入理解页表 三、页表的实际组成 四、总结&#xff1a; 一、前言 页表是我们之前在讲到程序地址空间的时候说到的&#xff0c;它是物理内存到进程程序地址空间的一个桥梁&#xff0c;通过它物理内存的数据和代码才能映射到进程的程序地址空间中&#xff…

GTM023 W.H.Greub线性代数经典教材:Linear Algebra

这本教材是我高中时期入门线性代数的主要教材&#xff0c;我的很多基础知识都来源于这本书&#xff0c;如今看回这本书可以说满满的回忆。这本书可以说&#xff0c;是我读过的内容最为全面且完备的线性代数教材了。而且它的语言风格非常的代数化&#xff0c;没有什么直观可言&a…

多视图 (Multi-view) 与多模态 (Multi-modal)

多视图 (Multi-view) 与多模态 (Multi-modal) 是两种不同的数据处理方式&#xff0c;它们在机器学习和数据分析中有着重要的应用。尽管这两者有一些相似之处&#xff0c;但它们关注的角度和处理方法有所不同。 多视图 (Multi-view) 定义&#xff1a;多视图指的是同一数据对象…