网站类别标签文本/广告发布平台app

网站类别标签文本,广告发布平台app,搜索引擎营销的案例有哪些,wordpress 中文测试数据运行效果 简介 上一个教程演示了时间管理及seek操作。本教程介绍如何将 GStreamer 集成到图形用户中 接口 (GUI) 工具包,如 GTK。基本上 GStreamer 负责媒体播放,而 GUI 工具包处理 用户交互。最有趣的部分是那些 库必须进行交互&…
运行效果

在这里插入图片描述

简介

     上一个教程演示了时间管理及seek操作。本教程介绍如何将 GStreamer 集成到图形用户中 接口 (GUI) 工具包,如 GTK+。基本上 GStreamer 负责媒体播放,而 GUI 工具包处理 用户交互。最有趣的部分是那些 库必须进行交互:指示 GStreamer 将视频输出到 GTK+ 窗口并将用户作转发到 GStreamer。特别是,您将学习:

          • 如何告诉 GStreamer 将视频输出到特定窗口 (而不是创建自己的窗口)。

          • 如何使用来自 GStreamer 的信息持续刷新 GUI。

          • 如何从 GStreamer 的多个线程更新 GUI,一个 在大多数 GUI 工具包上禁止作。

          • 一种仅订阅您感兴趣的消息的机制, 而不是收到所有通知。

     我们将使用 GTK+ 工具包构建一个媒体播放器,但这些概念适用于其他 例如,像 Qt 这样的工具包。最小值 了解 GTK+ 将有助于理解这一点 教程。重点是告诉 GStreamer 将视频输出到 我们的选择。一个常见的问题是 GUI 工具包通常只允许对 通过主(或应用程序)线程的图形“小部件”, 而 GStreamer 通常会生成多个线程来处理 不同的任务。从 的 SET SET THE S Ransomware 通常会失败,因为回调在 调用 thread,它不需要是主线程。此问题 可以通过在回调中的 GStreamer 总线上发布消息来解决: 消息将由主线程接收,然后主线程将做出反应 因此。最后,到目前为止,我们已经注册了一个函数,该函数得到了 每次公交车上出现消息时都打电话,这迫使我们 解析每条消息,看看我们是否对此感兴趣。在本教程中 使用不同的方法为每种 消息,因此解析更少,整体代码也更少。

GStreamer相关运行库
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0/gst
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/glib-2.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0/includeLIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gstreamer-1.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gobject-2.0.lib

GTK3 相关运行库 - gtk官网下载安装教程

完整源码
#include <string.h>#include <gtk.h>
#include <gst.h>
#include <gdk.h>typedef struct _CustomData
{GstElement *playbin;            /* playbin元素 */GtkWidget *sink_widget;         /* 显示视频的窗口 */GtkWidget *slider;              /* 进度条滑块控件 */GtkWidget *streams_list;        /* 显示流信息的文本控件 */gulong slider_update_signal_id; /* 更新进度滑块信号的ID */GstState state;                 /* 管道状态 */gint64 duration;                /* 进度持续时间 */
} CustomData;/* 单击“播放”按钮时调用此函数 */
static void play_cb (GtkButton *button, CustomData *data)
{gst_element_set_state (data->playbin, GST_STATE_PLAYING);
}/* 单击PAUSE按钮时调用此函数 */
static void pause_cb (GtkButton *button, CustomData *data)
{gst_element_set_state (data->playbin, GST_STATE_PAUSED);
}/* 单击STOP按钮时调用此函数 */
static void stop_cb (GtkButton *button, CustomData *data)
{gst_element_set_state (data->playbin, GST_STATE_READY);
}/* 当主窗口关闭时调用此函数 */
static void delete_event_cb (GtkWidget *widget, GdkEvent *event, CustomData *data)
{stop_cb (NULL, data);gtk_main_quit ();
}/* 当滑块改变其位置时,会调用此函数。我们在这里寻求新的职位。 */
static void slider_cb (GtkRange *range, CustomData *data)
{gdouble value = gtk_range_get_value (GTK_RANGE (data->slider));gst_element_seek_simple (data->playbin, (GstFormat)(GST_FORMAT_TIME), (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT), (gint64)(value * GST_SECOND));
}/* 这将创建组成我们应用程序的所有GTK+小部件,并注册回调 */
static void create_ui (CustomData *data)
{/* 主窗口 */GtkWidget *main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);g_signal_connect (G_OBJECT (main_window), "delete-event", G_CALLBACK (delete_event_cb), data);/* 播放按钮 */GtkWidget *play_button = gtk_button_new_from_icon_name ("media-playback-start", GTK_ICON_SIZE_SMALL_TOOLBAR);g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), data);/* 暂停按钮 */GtkWidget *pause_button = gtk_button_new_from_icon_name ("media-playback-pause", GTK_ICON_SIZE_SMALL_TOOLBAR);g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), data);/* 停止按钮 */GtkWidget *stop_button = gtk_button_new_from_icon_name ("media-playback-stop", GTK_ICON_SIZE_SMALL_TOOLBAR);g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), data);/* 进度条滑块控件 */data->slider = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);gtk_scale_set_draw_value (GTK_SCALE (data->slider), 0);data->slider_update_signal_id = g_signal_connect (G_OBJECT (data->slider), "value-changed", G_CALLBACK (slider_cb), data);/* 显示流信息的文本控件 */data->streams_list = gtk_text_view_new ();gtk_text_view_set_editable (GTK_TEXT_VIEW (data->streams_list), FALSE);/* HBox用于按住按钮和滑块 */GtkWidget *controls = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);gtk_box_pack_start (GTK_BOX (controls), play_button, FALSE, FALSE, 2);gtk_box_pack_start (GTK_BOX (controls), pause_button, FALSE, FALSE, 2);gtk_box_pack_start (GTK_BOX (controls), stop_button, FALSE, FALSE, 2);gtk_box_pack_start (GTK_BOX (controls), data->slider, TRUE, TRUE, 2);/* HBox,用于容纳视频接收器和流信息文本小部件 */GtkWidget *main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);gtk_box_pack_start (GTK_BOX (main_hbox), data->sink_widget, TRUE, TRUE, 0);gtk_box_pack_start (GTK_BOX (main_hbox), data->streams_list, FALSE, FALSE, 2);/* VBox用于容纳main_hbox和控件 */GtkWidget *main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);gtk_box_pack_start (GTK_BOX (main_box), main_hbox, TRUE, TRUE, 0);gtk_box_pack_start (GTK_BOX (main_box), controls, FALSE, FALSE, 0);gtk_container_add (GTK_CONTAINER (main_window), main_box);gtk_window_set_default_size (GTK_WINDOW (main_window), 640, 480);/* 显示主窗口 */gtk_widget_show_all (main_window);
}/* 定期调用此函数以刷新GUI */
static gboolean refresh_ui (CustomData *data)
{gint64 current = -1;/* 除非我们处于暂停或播放状态,否则我们不想更新任何内容 */if (data->state < GST_STATE_PAUSED){return TRUE;}/* 如果我们还不知道,请查询流持续时间 */if (!GST_CLOCK_TIME_IS_VALID (data->duration)){if (!gst_element_query_duration (data->playbin, GST_FORMAT_TIME, &data->duration)){g_printerr ("Could not query current duration.\n");}else{/* 将滑块的范围设置为剪辑持续时间,单位为秒 */gtk_range_set_range (GTK_RANGE (data->slider), 0, (gdouble)data->duration / GST_SECOND);}}if (gst_element_query_position (data->playbin, GST_FORMAT_TIME, &current)){/* 阻止“值已更改”信号,因此不调用slider_cb函数(这将触发用户未请求的寻道) */g_signal_handler_block (data->slider, data->slider_update_signal_id);/* 将滑块的位置设置为当前管道位置,单位为秒 */gtk_range_set_value (GTK_RANGE (data->slider), (gdouble)current / GST_SECOND);/* 重新启用信号 */g_signal_handler_unblock (data->slider, data->slider_update_signal_id);}return TRUE;
}/* 当在流中发现新的元数据时,会调用此函数 */
static void tags_cb (GstElement *playbin, gint stream, CustomData *data)
{/* 我们可能处于GStreamer工作线程中,因此我们通过总线中的消息通知主线程此事件 */gst_element_post_message (playbin, gst_message_new_application (GST_OBJECT (playbin), gst_structure_new_empty ("tags-changed")));
}/* 当总线上发布错误消息时,会调用此函数 */
static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data)
{GError *err;gchar *debug_info;/* 在屏幕上打印错误详细信息 */gst_message_parse_error (msg, &err, &debug_info);g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");g_clear_error (&err); g_free (debug_info);/* 将管道设置为READY(停止播放) */gst_element_set_state (data->playbin, GST_STATE_READY);
}/* 当总线上发布流结束消息时,会调用此函数。我们只是将管道设置为READY(停止播放) */
static void eos_cb (GstBus *bus, GstMessage *msg, CustomData *data)
{g_print ("End-Of-Stream reached.\n");gst_element_set_state (data->playbin, GST_STATE_READY);
}/* 当管道状态发生变化时,会调用此函数。我们用它来跟踪当前状态。 */
static void state_changed_cb (GstBus *bus, GstMessage *msg, CustomData *data)
{GstState old_state, new_state, pending_state;gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->playbin)){data->state = new_state;g_print ("State set to %s\n", gst_element_state_get_name (new_state));if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED){/* 为了提高响应速度,我们在达到PAUSED状态后立即刷新GUI */refresh_ui (data);}}
}/* 从所有流中提取元数据并将其写入GUI中的文本小部件 */
static void analyze_streams (CustomData *data)
{/* 清理小部件的当前内容 */GtkTextBuffer *text = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data->streams_list));gtk_text_buffer_set_text (text, "", -1);/* 阅读一些属性 */gint n_video, n_audio, n_text;g_object_get (data->playbin, "n-video", &n_video, NULL);g_object_get (data->playbin, "n-audio", &n_audio, NULL);g_object_get (data->playbin, "n-text", &n_text, NULL);guint rate;gchar *str, *total_str;GstTagList *tags;for (gint i = 0; i < n_video; i++){tags = NULL;/* 检索流的视频标签 */g_signal_emit_by_name (data->playbin, "get-video-tags", i, &tags);if (tags){total_str = g_strdup_printf ("video stream %d:\n", i);gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);gst_tag_list_get_string (tags, GST_TAG_VIDEO_CODEC, &str);total_str = g_strdup_printf ("  codec: %s\n", str ? str : "unknown");gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);g_free (str);gst_tag_list_free (tags);}}for (gint i = 0; i < n_audio; i++){tags = NULL;/* 检索流的音频标签 */g_signal_emit_by_name (data->playbin, "get-audio-tags", i, &tags);if (tags){total_str = g_strdup_printf ("\naudio stream %d:\n", i);gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);if (gst_tag_list_get_string (tags, GST_TAG_AUDIO_CODEC, &str)){total_str = g_strdup_printf ("  codec: %s\n", str);gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);g_free (str);}if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)){total_str = g_strdup_printf ("  language: %s\n", str);gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);g_free (str);}if (gst_tag_list_get_uint (tags, GST_TAG_BITRATE, &rate)){total_str = g_strdup_printf ("  bitrate: %d\n", rate);gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);}gst_tag_list_free (tags);}}for (gint i = 0; i < n_text; i++){tags = NULL;/* 检索流的字幕标签 */g_signal_emit_by_name (data->playbin, "get-text-tags", i, &tags);if (tags){total_str = g_strdup_printf ("\nsubtitle stream %d:\n", i);gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)){total_str = g_strdup_printf ("  language: %s\n", str);gtk_text_buffer_insert_at_cursor (text, total_str, -1);g_free (total_str);g_free (str);}gst_tag_list_free (tags);}}
}/* 当总线上发布“应用程序”消息时,会调用此函数。在这里,我们检索tags_cb回调发出的消息 */
static void application_cb (GstBus *bus, GstMessage *msg, CustomData *data)
{if (g_strcmp0 (gst_structure_get_name (gst_message_get_structure (msg)), "tags-changed") == 0){/* 如果消息是“标签已更改”(我们目前只发布一个),请更新流信息GUI */analyze_streams (data);}
}int main(int argc, char *argv[])
{CustomData data;memset (&data, 0, sizeof (data));data.duration = GST_CLOCK_TIME_NONE;/* 初始化GTK */gtk_init (&argc, &argv);/* 初始化GStreamer */gst_init (&argc, &argv);/* 创建元素 */data.playbin = gst_element_factory_make ("playbin", "playbin");GstElement *videosink = gst_element_factory_make ("glsinkbin", "glsinkbin");GstElement *gtkglsink = gst_element_factory_make ("gtkglsink", "gtkglsink");/* 创建了GTK Sink元素,它将为我们提供一个GTK小部件,GStreamer将在其中渲染视频,我们可以将其添加到UI中。尝试创建OpenGL版本的视频接收器,如果失败则回退*/if (gtkglsink != NULL && videosink != NULL){g_printerr ("Successfully created GTK GL Sink");g_object_set (videosink, "sink", gtkglsink, NULL);/* gtkglsink为我们创建gtk小部件。这可以通过属性访问。 */g_object_get (gtkglsink, "widget", &data.sink_widget, NULL);}else{g_printerr ("Could not create gtkglsink, falling back to gtksink.\n");videosink = gst_element_factory_make ("gtksink", "gtksink");g_object_get (videosink, "widget", &data.sink_widget, NULL);}if (!data.playbin || !videosink) { g_printerr ("Not all elements could be created.\n"); return -1; }/* 设置播放源 */g_object_set (data.playbin, "uri", "https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm", NULL);/* 设置video-sink  */g_object_set (data.playbin, "video-sink", videosink, NULL);/* 连接到playbin中的信号 */g_signal_connect (G_OBJECT (data.playbin), "video-tags-changed", (GCallback) tags_cb, &data);g_signal_connect (G_OBJECT (data.playbin), "audio-tags-changed", (GCallback) tags_cb, &data);g_signal_connect (G_OBJECT (data.playbin), "text-tags-changed", (GCallback) tags_cb, &data);/* 创建ui */create_ui (&data);/* 指示总线为每条接收到的消息发出信号,并连接到感兴趣的信号 */GstBus *bus = gst_element_get_bus (data.playbin);gst_bus_add_signal_watch (bus);g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, &data);g_signal_connect (G_OBJECT (bus), "message::eos", (GCallback)eos_cb, &data);g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, &data);g_signal_connect (G_OBJECT (bus), "message::application", (GCallback)application_cb, &data);gst_object_unref (bus);/* 开始播放 */GstStateChangeReturn ret = gst_element_set_state (data.playbin, GST_STATE_PLAYING);if (ret == GST_STATE_CHANGE_FAILURE){g_printerr ("Unable to set the pipeline to the playing state.\n");gst_object_unref (data.playbin); gst_object_unref (videosink); return -1;}/* 注册一个每秒都会调用的定时器函数 */g_timeout_add_seconds (1, (GSourceFunc)refresh_ui, &data);/* 启动GTK主循环。在调用gtk_main_quit之前,我们不会重新获得控制权 */gtk_main ();/* 释放资源 */gst_element_set_state (data.playbin, GST_STATE_NULL);gst_object_unref (data.playbin);gst_object_unref (videosink);return 0;
}

关注

笔者 - jxd

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

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

相关文章

NLTK和jieba

NLTK与jieba概述 自然语言处理&#xff08;NLP&#xff09;领域是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;主要研究方向是实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 在自然语言处理领域中&#xff0c;文本类型的数据占据着很大的市场&a…

DeepSeek-R1本地化部署(Mac)

一、下载 Ollama 本地化部署需要用到 Ollama&#xff0c;它能支持很多大模型。官方网站&#xff1a;https://ollama.com/ 点击 Download 即可&#xff0c;支持macOS,Linux 和 Windows&#xff1b;我下载的是 mac 版本&#xff0c;要求macOS 11 Big Sur or later&#xff0c;Ol…

支持向量简要理解

决策方程符合感知机区分理论&#xff0c;我们基于线性代数来看这满足子空间理论&#xff0c;可以获取得到超平面。 支持向量机的目标是寻找最与超平面最近的点的最大距离&#xff0c;而距离计算如上&#xff0c;符合数学上计算点到线&#xff08;面&#xff09;的距离公式。 …

使用OpenCV和MediaPipe库——实现人体姿态检测

目录 准备工作如何在Windows系统中安装OpenCV和MediaPipe库&#xff1f; 安装Python 安装OpenCV 安装MediaPipe 验证安装 代码逻辑 整体代码 效果展示 准备工作如何在Windows系统中安装OpenCV和MediaPipe库&#xff1f; 安装Python 可以通过命令行运行python --versio…

5G学习笔记之BWP

我们只会经历一种人生&#xff0c;我们选择的人生。 参考&#xff1a;《5G NR标准》、《5G无线系统指南:如微见著&#xff0c;赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中&#xff0c;默认所有终端均能处理最大2…

Linux下安装elasticsearch(Elasticsearch 7.17.23)

Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;能够以近乎实时的速度存储、搜索和分析大量数据。它被广泛应用于日志分析、全文搜索、应用程序监控等场景。 本文将带你一步步在 Linux 系统上安装 Elasticsearch 7.17.23 版本&#xff0c;并完成基本的配置&#xff0…

NVIDIA显卡驱动、CUDA、cuDNN 和 TensorRT 版本匹配指南

一、驱动安装 1、下载驱动 前往NVIDIA驱动下载页&#xff0c;输入显卡型号和操作系统类型&#xff0c;选择≥目标CUDA版本要求的驱动版本‌。 2、安装驱动‌ ‌Windows‌&#xff1a;双击安装包按向导操作。‌Linux‌&#xff1a;建议使用apt或官方.run文件安装‌。 3、验证…

基于PyTorch的深度学习5——神经网络工具箱

可以学习如下内容&#xff1a; • 介绍神经网络核心组件。 • 如何构建一个神经网络。 • 详细介绍如何构建一个神经网络。 • 如何使用nn模块中Module及functional。 • 如何选择优化器。 • 动态修改学习率参数。 5.1 核心组件 神经网络核心组件不多&#xff0c;把这些…

模拟调制技术详解

内容摘要 本文系统讲解模拟调制技术原理及Matlab实现&#xff0c;涵盖幅度调制的四种主要类型&#xff1a;双边带抑制载波调幅&#xff08;DSB-SC&#xff09;、含离散大载波调幅&#xff08;AM&#xff09;、单边带调幅&#xff08;SSB&#xff09;和残留边带调幅&#xff08;…

aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)

aws(学习笔记第三十一课) aws cdk深入学习 学习内容&#xff1a; 深入练习aws cdk下部署batch-arm64-instance-type 1. 深入练习aws cdk下部署batch-arm64-instance-type 代码链接 代码链接 代码链接 -> batch-arm64-instance-type之前代码学习 之前学习代码链接 -> aw…

读书报告」网络安全防御实战--蓝军武器库

一眨眼&#xff0c;20天过去了&#xff0c;刷完了这本书「网络安全防御实战--蓝军武器库」&#xff0c;回味无穷&#xff0c;整理概览如下&#xff0c;可共同交流读书心得。在阅读本书的过程中&#xff0c;我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…

DeepLabv3+改进6:在主干网络中添加SegNext_Attention|助力涨点

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者&#xff1a;来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中&#xff0c;现在 Elastic-Agent 和 Beats 已正式支持 Debian 12&#xff01; 本文演示了我们正在开发的功能&#xff0c;以支持使用 Journald 存储系统和身份验…

3.9[A]csd

在传统CPU中心架构中&#xff0c;中央处理器通过内存访问外部存储器&#xff0c;而数据必须经过网络接口卡才能到达外部存储器。这种架构存在集中式计算、DRAM带宽和容量挑战、大量数据移动&#xff08;服务器内和网络&#xff09;以及固定计算导致工作负载容量增长等问题。 而…

ESP32S3读取数字麦克风INMP441的音频数据

ESP32S3 与 INMP441 麦克风模块的集成通常涉及使用 I2S 接口进行数字音频数据的传输。INMP441 是一款高性能的数字麦克风&#xff0c;它通过 I2S 接口输出音频数据。在 Arduino 环境中&#xff0c;ESP32S3 的开发通常使用 ESP-IDF&#xff08;Espressif IoT Development Framew…

DeepSeek大模型 —— 全维度技术解析

DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1…

[Kubernetes] 7控制平面组件

1. 调度 kube- scheduler what 负责分配调度pod到集群节点监听kube-apiserver,查询未分配node的pod根据调度策略分配这些pod&#xff08;更新pod的nodename&#xff09;需要考虑的因素&#xff1a; 公平调度&#xff0c;资源有效利用&#xff0c;QoS&#xff0c;affinity, an…

PyTorch系列教程:编写高效模型训练流程

当使用PyTorch开发机器学习模型时&#xff0c;建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件&#xff0c;并演示如何构建一个精细的训练循环流程&#xff0c;有效地处理数据处理&#xff0c;向前和向后…

LeetCode Hot100刷题——反转链表(迭代+递归)

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#…

Springboot redis bitMap实现用户签到以及统计,保姆级教程

项目架构&#xff0c;这是作为demo展示使用&#xff1a; Redis config&#xff1a; package com.zy.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Ob…