lv_ffmpeg学习及播放rtsp

server/2024/12/26 12:14:43/

ffmpeg_0">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;
};

ffmpeg_player_create__36">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);
}

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

2.1 打开给定视频文件

    //打开文件, 寻找视频流及对应解码器 设置最终像素格式等参数player->ffmpeg_ctx = ffmpeg_open_file(path);//根据获得的视频流信息申请图像空间及ffmpeg需要的frame pktif(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));

ffmpeg_player_set_cmdplayer_LV_FFMPEG_PLAYER_CMD_START_61">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 rtsplv_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替换为udpav_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.ppmy.cn/server/153309.html

相关文章

3D视觉坐标变换(像素坐标转换得到基于相机坐标系的坐标)

在图像处理中,我们经常得到目标的坐标是像素坐标,需要将其转换到相机坐标系下的实际物理坐标。 使用场景:根据深度学习模型,已经完成了目标检测,使用3D相机,得到目标在图像中的像素坐标和深度信息,需要将2D图像中得到的像素坐标,利用深度图计算出对应目标在空间中的位姿…

qt实现socketCAN

一.初始化Init函数 1.点击 连接CAN 按键(默认为连接CAN&#xff0c;点击一次变为断开CAN)--->进入connectDevice函数 1.1按键为连接CAN&#xff1a;根据当前选择的可用接口&#xff0c;比特率初始化CAN QString cmd1tr("ifconfig %1 down").arg(ui->comboBox…

python中bug修复案例-----图形界面程序中修复bug

我在开发一个小型的图形界面应用程序时&#xff0c;使用了 Tkinter 库来创建窗口和各种组件。代码的目标是实现一个简单的登录界面&#xff0c;用户输入用户名和密码后&#xff0c;点击登录按钮&#xff0c;程序会验证输入的信息并给出相应提示。然而&#xff0c;当我运行程序并…

Max AI prompt1

1&#xff0c;内容/要点逻辑链&#xff0c;层次结构可视化 请提取其中的主要内容以及观点&#xff0c;以及对应的逻辑链&#xff0c;以图示化、层次结构通俗易懂地展现&#xff0c;要求使用中文 #我目前常用的文献阅读prompt提示词&#xff0c;主要是内容、逻辑链2者兼备2&…

CSS(二):美化网页元素

目录 字体样式 文本样式 列表样式 背景图片 字体样式 字体相关的 CSS 属性&#xff1a; font-family&#xff1a;设置字体font-size&#xff1a;设置字体大小font-weight&#xff1a;设置字体的粗细&#xff08;如 normal, bold, lighter 等&#xff09;color&#xff1a;…

lookup join 使用缓存参数和不使用缓存参数的执行前后对比

0.先看结论 #缓存开启参数&#xff0c;默认关闭lookup.cache.max-rows 1000, -- 设置最大缓存条目数为 1000lookup.cache.ttl 10 min -- 设置缓存条目的最大存活时间为 10 分钟启用缓存 查询时性能较高&#xff0c;因为数据直接从缓存中读取。缓存未过期时&#xff0c…

可以免费制作翻页电子书的软件

​随着数字化时代的到来&#xff0c;电子书已经成为人们阅读的重要方式之一。翻页电子书以其独特的视觉效果和便捷性&#xff0c;受到了广大读者的喜爱。今天推荐一款免费制作翻页电子书的软件。 1. 实用工具&#xff1a;打开FLBOOK在线制作电子杂志平台。 2. 设计模板&#xf…

在 CentOS 8 系统上安装 Jenkins 的全过程

一、前言 我是一个前端开发&#xff0c;需要频繁将编写的前端系统打包更新到公司的linux服务器&#xff0c;觉得这种工作纯体力活&#xff0c;有时候太浪费时间&#xff0c;以前用过别人搭建的Jenkins可以很好的解决这个问题。 Jenkins 是一款流行的开源持续集成和持续交付&a…