网页设计新手制作的网站代码mip网站怎么做匹配

web/2025/9/30 14:46:35/文章来源:
网页设计新手制作的网站代码,mip网站怎么做匹配,公司网站如何做,站群系统开发在前面的文章中#xff0c;我们使用libvlc_media_player_set_hwnd设置了视频的显示的窗口。 libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow-winId()); 如果我们想要提取每一帧数据#xff0c;将数据渲染到QWidget上#xff0c;该如何操作呢我们使用libvlc_media_player_set_hwnd设置了视频的显示的窗口。 libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow-winId()); 如果我们想要提取每一帧数据将数据渲染到QWidget上该如何操作呢 以下是操作流程 1.初始化 libVLC 实例。 vlc_base libvlc_new(0, NULL); 2.创建一个媒体播放器。 vlc_media libvlc_media_new_path(vlc_base, filename.toUtf8().data());if (!vlc_media) {return;}// 创建libvlc实例和媒体播放器vlc_mediaPlayer libvlc_media_player_new_from_media(vlc_media);if (!vlc_mediaPlayer) {return;} 3.设置视频回调。 libvlc_video_set_format_callbacks(vlc_mediaPlayer, setup, NULL);// 设置自定义视频输出libvlc_video_set_callbacks(vlc_mediaPlayer, lock, unlock, display, NULL); 4.提取视频帧数据创建QImage对象。 //保存100~110帧 static void unlock(void *opaque, void *picture, void *const *planes) {// 这里可以释放视频帧的锁char *buffer (char *)*planes; //planes即为帧数据QImage image((unsigned char*)buffer, g_frame-width, g_frame-height, QImage::Format_ARGB32);m_this-updatePic(image);g_frame-mutex.unlock(); } 5.使用QLabel加载QImage对象或者使用QWidget的绘图事件绘制QImage在QWidget上。 这里使用QLabel加载。 void showWidget::slotUpdate(const QImage image) {ui.lbImage-setPixmap(QPixmap::fromImage(image)); } 这里介绍libvlc_video_set_callbacks的lock和unlock两个回调。更多的回调介绍请看 libVLC 提取视频帧-CSDN博客 以下是libvlc_video_lock_cb声明。 typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes); opaque是一个用户数据指针libvlc_video_set_callbacks最后一个参数会传递给lock。planes是一个指向指针的指针它指向一个指针数组每个指针指向一个视频平面对于 YUV 格式通常有三个平面Y、U 和 V。对于 RGB 格式通常只有一个平面。返回值传递给unlock的参数2。 如果应用程序需要在视频渲染前对视频帧进行一些处理那么可以在libvlc_video_lock_cb中进行这些处理并将处理后的帧数据地址赋值给 *planes。 以下是libvlc_video_unlock_cb声明。 typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture,void *const *planes); opaque是一个用户数据指针libvlc_video_set_callbacks最后一个参数会传递给lock。picture是libvlc_video_lock_cb返回值。planes是平面像素数据。 以下是ui界面设计。 运行结果 代码示例 #pragma once#include QtWidgets/QWidget #include ui_showWidget.h #include QMenu #include QActionGroup #include vlc/vlc.h #include QDebug #include QFileDialog #include QThread #include QMouseEvent #include QKeyEventenum Rate {Rate2X,Rate1_5X,Rate1_25X,Rate1_0X,Rate0_75X,Rate0_5X };class showWidget : public QWidget {Q_OBJECTpublic:showWidget(QWidget *parent nullptr);~showWidget();public:void updatePic(const QImage image);private slots:void slotOpenFile();void slotPlay();void slotPause();void slotStop();void slotValueChanged(int value);void slotCurrentIndexChanged(int index);private://事件处理回调static void vlcEvents(const libvlc_event_t *ev, void *param);private:Ui::showWidgetClass ui;private:libvlc_instance_t *vlc_base nullptr;libvlc_media_t *vlc_media nullptr;libvlc_media_player_t *vlc_mediaPlayer nullptr;QListfloat m_lstRate;QListQString m_lstAudioDevice; };这里使用声明了static showWidget* m_this nullptr。在构造函数中使用m_this this赋值。在unlock回调中构造好QImage对象使用m_this-updatePic(image)更新界面。 cpp源码。  #include showWidget.h #include QTimer #include QTime #include QMutex #include stdlib.h #pragma execution_character_set(utf-8)static showWidget* m_this nullptr;struct Frame {int width;int height;uchar * pixels;QMutex mutex; };static Frame *g_frame nullptr;// 自定义视频输出模块的回调函数 static void *lock(void *opaque, void **planes) {g_frame-mutex.lock();*planes g_frame-pixels;return 0; }//保存100~110帧 static void unlock(void *opaque, void *picture, void *const *planes) {// 这里可以释放视频帧的锁char *buffer (char *)*planes; //planes即为帧数据QImage image((unsigned char*)buffer, g_frame-width, g_frame-height, QImage::Format_ARGB32);m_this-updatePic(image);g_frame-mutex.unlock(); }static void display(void *opaque, void *picture) {// 这里可以进行视频帧的显示或其他处理(void)opaque; }static unsigned setup(void **opaque, char *chroma,unsigned *width, unsigned *height,unsigned *pitches,unsigned *lines) {qDebug() chroma: QString(chroma) width: *width , height: *height;/* 开辟存放图像数据的内存块 */if (g_frame){if (g_frame-pixels){delete[] g_frame-pixels;g_frame-pixels NULL;}delete g_frame;g_frame NULL;}int w *width;int h *height;g_frame new Frame;g_frame-pixels new uchar[w * h * 4]; // 申请大小也为4通道的像素memset(g_frame-pixels, 0, w * h * 4);memcpy(chroma, RV32, 4);g_frame-width w;g_frame-height h;*pitches w * 4;*lines h;return 1; }showWidget::showWidget(QWidget *parent): QWidget(parent) {ui.setupUi(this);m_this this;this-setWindowTitle(视频播放器);vlc_base libvlc_new(0, NULL);ui.cbxRate-setCurrentIndex(Rate1_0X);m_lstRate 2.0 1.5 1.25 1.0 0.75 0.5;ui.btnOpen-setFocusPolicy(Qt::NoFocus);ui.btnPlay-setFocusPolicy(Qt::NoFocus);ui.btnPause-setFocusPolicy(Qt::NoFocus);ui.btnStop-setFocusPolicy(Qt::NoFocus);ui.hSliderVolumn-setFocusPolicy(Qt::NoFocus);ui.cbxRate-setFocusPolicy(Qt::NoFocus);connect(ui.btnOpen, QPushButton::clicked, this, showWidget::slotOpenFile);connect(ui.btnPlay, QPushButton::clicked, this, showWidget::slotPlay);connect(ui.btnPause, QPushButton::clicked, this, showWidget::slotPause);connect(ui.btnStop, QPushButton::clicked, this, showWidget::slotStop);connect(ui.hSliderVolumn, QSlider::valueChanged, this, showWidget::slotValueChanged);connect(ui.cbxRate,SIGNAL(currentIndexChanged(int)), this, SLOT(slotCurrentIndexChanged(int))); }showWidget::~showWidget() {libvlc_release(vlc_base); //减少libvlc实例的引用计数并销毁 }void showWidget::updatePic(const QImage image) {ui.lbImage-setPixmap(QPixmap::fromImage(image)); }void showWidget::slotOpenFile() {/*选择文件*/QString filename QFileDialog::getOpenFileName(this, 选择打开的文件, D:/, tr(*.*));std::replace(filename.begin(), filename.end(), QChar(/), QChar(\\));vlc_media libvlc_media_new_path(vlc_base, filename.toUtf8().data());if (!vlc_media) {return;}// 创建libvlc实例和媒体播放器vlc_mediaPlayer libvlc_media_player_new_from_media(vlc_media);if (!vlc_mediaPlayer) {return;}libvlc_video_set_format_callbacks(vlc_mediaPlayer, setup, NULL);// 设置自定义视频输出libvlc_video_set_callbacks(vlc_mediaPlayer, lock, unlock, display, NULL);// 等待元数据加载完成libvlc_media_parse(vlc_media);// 获取各种元数据const char *title libvlc_media_get_meta(vlc_media, libvlc_meta_Title);const char *artist libvlc_media_get_meta(vlc_media, libvlc_meta_Artist);const char *album libvlc_media_get_meta(vlc_media, libvlc_meta_Album);const char *url libvlc_media_get_meta(vlc_media, libvlc_meta_URL);const char *date libvlc_media_get_meta(vlc_media, libvlc_meta_Date);const char *lang libvlc_media_get_meta(vlc_media, libvlc_meta_Language);int duration libvlc_media_get_duration(vlc_media); // 获取时长单位毫秒qDebug(Title: %s, title ? title : N/A);qDebug(Artist: %s, artist ? artist : N/A);qDebug(Album: %s, album ? album : N/A);qDebug(Duration: %d ms, duration);qDebug(url: %s, url ? url : N/A);qDebug(date: %s, date ? date : N/A);qDebug(lang: %s, lang ? lang : N/A);libvlc_media_track_t **tracks;int track_count libvlc_media_tracks_get(vlc_media,tracks);for (unsigned i 0; i track_count; i) {libvlc_media_track_t* track tracks[i];// 显示轨道信息printf(Track #%u: %s\n, i, track-psz_description);// 这里可以获取到每一个轨道的信息比如轨道类型 track-i_type// 可能是 libvlc_track_video, libvlc_track_audio 或者 libvlc_track_text (字幕)if (track-i_type libvlc_track_video) {// 处理视频轨道信息qDebug(width %d,track-video-i_width);qDebug(height %d, track-video-i_height);qDebug(rate_num %d, track-video-i_frame_rate_num);qDebug(rate_den %d, track-video-i_frame_rate_den);}else if (track-i_type libvlc_track_audio) {// 处理音频轨道信息qDebug(channels %d, track-audio-i_channels);qDebug(rate %d, track-audio-i_rate);}else if (track-i_type libvlc_track_text) {// 处理字幕轨道信息}}//获取事件管理器libvlc_event_manager_t *em libvlc_media_player_event_manager(vlc_mediaPlayer);// 注册事件监听器libvlc_event_attach(em, libvlc_MediaPlayerTimeChanged, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerEndReached, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerStopped, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerPlaying, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerPaused, vlcEvents, this);QTimer::singleShot(1000, this, showWidget::slotPlay);libvlc_video_filter_list_get(vlc_base); }void showWidget::slotPlay() {if (vlc_mediaPlayer){libvlc_media_player_play(vlc_mediaPlayer);} }void showWidget::slotPause() {if (vlc_mediaPlayer)libvlc_media_player_pause(vlc_mediaPlayer); }void showWidget::slotStop() {if (vlc_mediaPlayer)libvlc_media_player_stop(vlc_mediaPlayer); }void showWidget::slotValueChanged(int value) {if (vlc_mediaPlayer)libvlc_audio_set_volume(vlc_mediaPlayer, value); }void showWidget::slotCurrentIndexChanged(int index) {if (vlc_mediaPlayer)libvlc_media_player_set_rate(vlc_mediaPlayer, m_lstRate[index]); }//事件回调 void showWidget::vlcEvents(const libvlc_event_t *ev, void *param) {showWidget *w (showWidget*)param;//处理不同的事件switch (ev-type) {case libvlc_MediaPlayerTimeChanged:{//qDebug() VLC媒体播放器时间已更改;qint64 len libvlc_media_player_get_time(w-vlc_mediaPlayer);libvlc_time_t lenSec len / 1000;libvlc_time_t totalLen libvlc_media_player_get_length(w-vlc_mediaPlayer);libvlc_time_t totalLenSec totalLen / 1000;int thh, tmm, tss;thh lenSec / 3600;tmm (lenSec % 3600) / 60;tss (lenSec % 60);QTime time(thh, tmm, tss);w-ui.lbCurTime-setText(time.toString(hh:mm:ss));thh totalLenSec / 3600;tmm (totalLenSec % 3600) / 60;tss (totalLenSec % 60);QTime TotalTime(thh, tmm, tss);w-ui.lbTotalTime-setText(TotalTime.toString(hh:mm:ss));double pos (double)lenSec / totalLenSec * 100;w-ui.horizontalSlider-setValue(pos);}break;case libvlc_MediaPlayerEndReached:qDebug() VLC播放完毕.;break;case libvlc_MediaPlayerStopped:qDebug() VLC停止播放;break;case libvlc_MediaPlayerPlaying:qDebug() VLC开始播放;break;case libvlc_MediaPlayerPaused:qDebug() VLC暂停播放;break;} } 经过上面的步骤我们已经完成了整个视频的渲染我们不停的生成的是 QImage 对象因此对 CPU 负荷较高。其实在绘制这块我们可以使用 Opencv 或者 openGL 去绘制利用 GPU 减轻 CPU 计算负荷。下一节使用openGL进行绘制减轻CPU的压力。 更多参考 libVLC 添加图片和文本水印-CSDN博客 libVLC 音频输出设备切换-CSDN博客 libVLC 音频立体声模式切换-CSDN博客 libVLC 提取视频帧-CSDN博客

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

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

相关文章

石家庄建设厅网站首页单页主题 wordpress

文章目录 一、PhPstudy下载、安装二、Sqli-libs下载、搭建三、启用Sqli-libs phpstudy地址:https://www.xp.cn/ sqli-libs地址:https://github.com/Audi-1/sqli-labs 一、PhPstudy下载、安装 1、下载–解压–安装,安装完成如下图 2、更换php…

网站制作哪家实惠源码之家网站模板

Eclipse GlassFish 5.1的发布是Jakarta EE的重要里程碑! 首先,这证实了Oracle提供的GlassFish源代码可以在Eclipse Infrastructure上构建和组装。 第二, 通过通过Java EE 8兼容性测试,它可以验证所贡献的代码是否符合Java EE 8…

因脉网站建设公司怎么呀韩国开发一个淘宝app需要多少钱

Java面试:技巧与实践 在当今的IT行业中,Java已经成为了一种非常流行的编程语言。它以其跨平台、面向对象、安全性高等特点,吸引了无数的开发人员。然而,掌握Java并不是一件容易的事情,尤其是在面试过程中。本文将为您…

什么网站免费建设wordpress获取首页id

琪琪格的私人日记! 不要的就干脆放弃,不要再回头看往情留下的痕迹,自己终究要逃离这个圈,选择走自己该走的路,给他留下百分的祝福,已足够。拥有过爱情的人才知这份难舍的痛楚,为了自己爱的他而离…

布吉网站的建设wordpress站群管理系统

我们都知道模板一般会用到继承,导航栏就是一个很好的例子,但是导航栏的数据如何共享,比如有个导航的文件叫在view/navigation.blade.php为了简单一点,文件里只有设置了一个变量1{{ $cqh }}现在的要求是每个页面都会用到这个变量&a…

各大网站ip地址上海展览公司

stringstring是常用的类型,它具有不可变性:就是一旦赋值,就不可变,如果再赋值 ,就重新开辟内存空间;保留性:如果一个字符串存在,另一个与其相同,他们会指向同一个地址&am…

深圳网站设计哪家好易语言做网站登录

指定的字符串: 白天走在街道上,伸手不见五指,周围的建筑全被雾笼罩了,在家里通过窗户往外望去,外面就像仙境一般,雾把所有的东西都淹没了,能看到的,只有白色的雾。!文件…

湖南自考网站建设与管理非物质文化遗产网站怎么做

是的,标题没错。C#其中一份新提案假定,所有的引用类型在默认情况下都是不可空的。在新语法下,你需要显式地标明一个引用变量是可空的,就像对值类型所做的那样。 和值类型一样,T是指不可空类型,而T?是指可…

大型网站服务器架构沧州网站建设报价

Redis中的Lua脚本到底能不能保证原子性? Redis中Lua脚本的执行,可以保证并发编程中不可再拆分的这个原子性,但是没有保证数据库ACID中要么都执行要么都回滚的这个原子性。Lua脚本执行过程中命令产生错误,是不会回滚的&#xff0c…

河南便宜网站建设费用郑州网络营销网站优化

收集了各大公司的面试经验,现整理出来,希望能给正在找工作的志同道合的小伙伴一些指引,本文会持续更新的哦。 1、 CPU 和 GPU的区别 一个是通用计算,一个是专用计算。 CPU主要负责操作系统和应用程序,GPU主要负责跟…

网站如何做手机端页面seo短视频新地址在哪里?

1、sex存为01还是男女? 存为01主要是为了国际化和节省存储空间。存为01很容易转换成不同语言表示的男女。 2、文件存储方案 MongoDB有GirdFS用来将文件直接保存到数据库,如果使用nginx,可以直接使用http读取GridFS里面的文件。 所以&…

药剂学教学网站的建设福田公司门口

国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题 国庆中秋特辑&…

机关单位网站建设工作方案中国网站模板下载

强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性。自愈的默认实现方式是自动重启发生故障的容器。除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精细的健康检查,进而实现如下需求: 零停机部署。 避免部署无效…

广东企业移动网站建设哪家好上海好的设计公司

目录 一、预装软件 二、创建sftp管理组 三、SSH设置 三、创建用户家目录和设置home权限 四、创建用户并设置上传目录权限控制 五、用户初始化密码 六、说明 需求客户要求与第三方通过sftp交互文件,需要在Linux系统部署sftp服务器。考虑安全,计划对…

网站里的课程配图怎么做电子商务网站建设读书笔记

AWS Fargate 是一个由 Amazon Web Services (AWS) 提供的无服务器容器计算引擎。它使开发者能够运行容器化应用程序,而无需管理底层的服务器或虚拟机。简而言之,AWS Fargate 让你只需关注应用的容器本身,而不需要管理运行容器的基础设施&…

想做网站的公司好国家的企业信息网

上一篇我们学习了CSS基本样式和选择器,相信大家对于样式的使用有了初步认知。 本篇我们继续来学习CSS中的扩展选择器及CSS继承性,如何使用这些扩展选择器更好的帮助我们美化页面。 下一篇我们将会学习CSS中常用的属性。 喜欢的 【点赞】【关注】【收藏】…

网站建设与排名wangzhan

并查集、树状数组、线段树 并查集树状数组树状数组1 (单点修改,区间查询)树状数组2 (单点查询,区间修改) 并查集 【模板】并查集 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作。 输入格式 第一行包含两个整数 …

建设网站的难点微信朋友圈软文大全

1.语法顺序 select语句的语法格式如下。 select 字段列表 from 数据源 [ where条件表达式 ] [ group by 分组字段 ] [ having条件表达式 ] [ order by 排序字段 [ asc | desc ] ] 2.执行顺序 FROM 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1 ON 对虚表VT…

网站上常用字体寻找合肥网站建设

下面这个TXT文档里面是一篇长篇小说,大家都知道一般小说文字内容是比较大的一个文件呢,想要拆分,拆分肯定是有方法呢,比如比较重统的方法手动一章一章复制出来,粘贴到另一个文档里面去粘贴,手动操作是不是很…

专做男装的网站施工企业安全文明施工费取费

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接keyvalue格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。1. 配置文件Log4J配置文件的基本格式如下: #配置根Loggerlog4j.rootLog…