FFmpeg 头文件完美翻译之 libavdevice 模块

embedded/2025/2/6 17:32:57/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

前言

众所周知࿰c;FFmpeg 的代码开发上手难度较高࿰c;源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发࿰c;需要借助它的头文件࿰c;FFmpeg 把很多代码库教程都写在头文件里面。因此࿰c;熟读头文件的内容很重要࿰c;为此࿰c;我对 FFmpeg 6.x 版本的头文件进行了翻译࿰c;方便大家阅读理解。相信我࿰c;通读一遍头文件的注释后࿰c;你的 FFmpeg 的代码库开发技能将更上一层。

本文适用于有 FFmpeg 代码库开发基础࿰c;但想深入熟练使用的同学。

同时也可以参考我的Github 仓库࿰c;下载到本地慢慢品读~

c="https://i-blog.csdnimg.cn/img_convert/383356b43e56cf7179f7eef333c70222.gif" alt="frantic-studying.gif" />

libavdevice 模块主要用于处理各种输入输出设备࿰c;主要有如下头文件:

  • avdevice.h

ceh_14">avdevice.h

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">AVDEVICE_AVDEVICE_H
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVDEVICE_AVDEVICE_Hclass="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"version_major.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">HAVE_AV_CONFIG_H
class="token comment">/* 当作为class="tags" href="/FFMPEG.html" title=ffmpeg>ffmpeg构建的一部分包含时,仅包含主版本号* 以避免不必要的重建。当外部包含时,保持包含* 完整版本信息。 */
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"version.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">endifclass="token comment">/*** @file* @ingroup lavd* libavdevice API主头文件*/class="token comment">/*** @defgroup lavd libavdevice* 特殊设备复用/解复用库。** Libavdevice是@ref libavf "libavformat"的补充库。它* 提供各种"特殊"的平台特定复用器和解复用器,例如用于* 抓取设备、音频捕获和播放等。因此,libavdevice中的* (解)复用器属于AVFMT_NOFILE类型(它们使用自己的I/O函数)。* 传递给avformat_open_input()的文件名通常不是指向实际存在* 的文件,而是具有一些特殊的设备特定含义 - 例如对于xcbgrab* 它是显示名称。** 要使用libavdevice,只需调用avdevice_register_all()来注册所有* 已编译的复用器和解复用器。它们都使用标准的libavformat API。** @{*/class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/log.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/opt.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/dict.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavformat/avformat.h"class="token comment">/*** 返回LIBAVDEVICE_VERSION_INT常量。*/
class="token keyword">unsigned class="token function">avdevice_versionclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 返回libavdevice的编译时配置。*/
class="token keyword">const class="token keyword">char class="token operator">*class="token function">avdevice_configurationclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 返回libavdevice的许可证。*/
class="token keyword">const class="token keyword">char class="token operator">*class="token function">avdevice_licenseclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 初始化libavdevice并注册所有输入和输出设备。*/
class="token keyword">void class="token function">avdevice_register_allclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 音频输入设备迭代器。** 如果d为NULL,返回第一个注册的输入音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输入音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVInputFormat class="token operator">*class="token function">av_input_audio_device_nextclass="token punctuation">(class="token keyword">const AVInputFormat  class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token comment">/*** 视频输入设备迭代器。** 如果d为NULL,返回第一个注册的输入音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输入音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVInputFormat class="token operator">*class="token function">av_input_video_device_nextclass="token punctuation">(class="token keyword">const AVInputFormat  class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token comment">/*** 音频输出设备迭代器。** 如果d为NULL,返回第一个注册的输出音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输出音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVOutputFormat class="token operator">*class="token function">av_output_audio_device_nextclass="token punctuation">(class="token keyword">const AVOutputFormat class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token comment">/*** 视频输出设备迭代器。** 如果d为NULL,返回第一个注册的输出音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输出音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVOutputFormat class="token operator">*class="token function">av_output_video_device_nextclass="token punctuation">(class="token keyword">const AVOutputFormat class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token keyword">typedef class="token keyword">struct class="token class-name">AVDeviceRect class="token punctuation">{class="token keyword">int xclass="token punctuation">;      class="token comment">/**< 左上角x坐标 */class="token keyword">int yclass="token punctuation">;      class="token comment">/**< 左上角y坐标 */class="token keyword">int widthclass="token punctuation">;  class="token comment">/**< 宽度 */class="token keyword">int heightclass="token punctuation">; class="token comment">/**< 高度 */
class="token punctuation">} AVDeviceRectclass="token punctuation">;class="token comment">/*** avdevice_app_to_dev_control_message()使用的消息类型。*/
class="token keyword">enum class="token class-name">AVAppToDevMessageType class="token punctuation">{class="token comment">/*** 空消息。*/AV_APP_TO_DEV_NONE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'N'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'N'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 窗口大小改变消息。** 每当应用程序改变设备渲染窗口的大小时,* 都会向设备发送消息。* 创建窗口后也应立即发送消息。** data: AVDeviceRect: 新窗口大小。*/AV_APP_TO_DEV_WINDOW_SIZE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'G'class="token punctuation">,class="token char">'E'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'M'class="token punctuation">)class="token punctuation">,class="token comment">/*** 重绘请求消息。** 当窗口需要重绘时向设备发送消息。** data: AVDeviceRect: 需要重绘的区域。*       NULL: 需要重绘整个区域。*/AV_APP_TO_DEV_WINDOW_REPAINT class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'R'class="token punctuation">,class="token char">'E'class="token punctuation">,class="token char">'P'class="token punctuation">,class="token char">'A'class="token punctuation">)class="token punctuation">,class="token comment">/*** 请求暂停/播放。** 应用程序请求暂停/取消暂停播放。* 主要用于具有内部缓冲区的设备。* 默认情况下设备不会暂停。** data: NULL*/AV_APP_TO_DEV_PAUSE        class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'P'class="token punctuation">, class="token char">'A'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">' 'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_PLAY         class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'P'class="token punctuation">, class="token char">'L'class="token punctuation">, class="token char">'A'class="token punctuation">, class="token char">'Y'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_TOGGLE_PAUSE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'P'class="token punctuation">, class="token char">'A'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,class="token comment">/*** 音量控制消息。** 设置音量级别。根据设备的不同,音量可能是按流* 或系统范围更改。如果可能,期望按流更改音量。** data: double: 新音量范围为0.0 - 1.0。*/AV_APP_TO_DEV_SET_VOLUME class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'S'class="token punctuation">, class="token char">'V'class="token punctuation">, class="token char">'O'class="token punctuation">, class="token char">'L'class="token punctuation">)class="token punctuation">,class="token comment">/*** 静音控制消息。** 更改静音状态。根据设备的不同,静音状态可能是按流* 或系统范围更改。如果可能,期望按流更改静音状态。** data: NULL。*/AV_APP_TO_DEV_MUTE        class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">' 'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_UNMUTE      class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'U'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_TOGGLE_MUTE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'T'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,class="token comment">/*** 获取音量/静音消息。** 强制设备分别发送AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED或* AV_DEV_TO_APP_MUTE_STATE_CHANGED命令。** data: NULL。*/AV_APP_TO_DEV_GET_VOLUME class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'G'class="token punctuation">, class="token char">'V'class="token punctuation">, class="token char">'O'class="token punctuation">, class="token char">'L'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_GET_MUTE   class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'G'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,
class="token punctuation">}class="token punctuation">;class="token comment">/*** avdevice_dev_to_app_control_message()使用的消息类型。*/
class="token keyword">enum class="token class-name">AVDevToAppMessageType class="token punctuation">{class="token comment">/*** 空消息。*/AV_DEV_TO_APP_NONE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'N'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'N'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 创建窗口缓冲区消息。** 设备请求创建窗口缓冲区。具体含义取决于设备* 和应用程序。在渲染第一帧之前发送消息,所有一次性* 初始化都应在此处完成。* 应用程序可以忽略首选的窗口缓冲区大小。** @note: 应用程序必须通过AV_APP_TO_DEV_WINDOW_SIZE消息*        通知窗口缓冲区大小。** data: AVDeviceRect: 窗口缓冲区的首选大小。*       NULL: 窗口缓冲区没有首选大小。*/AV_DEV_TO_APP_CREATE_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'C'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 准备窗口缓冲区消息。** 设备请求准备用于渲染的窗口缓冲区。* 具体含义取决于设备和应用程序。* 在渲染每一帧之前发送消息。** data: NULL。*/AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'P'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 显示窗口缓冲区消息。** 设备请求显示窗口缓冲区。* 当新帧准备好显示时发送消息。* 通常需要在此消息的处理程序中交换缓冲区。** data: NULL。*/AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'D'class="token punctuation">,class="token char">'I'class="token punctuation">,class="token char">'S'class="token punctuation">)class="token punctuation">,class="token comment">/*** 销毁窗口缓冲区消息。** 设备请求销毁窗口缓冲区。* 当设备即将被销毁且不再需要窗口缓冲区时* 发送消息。** data: NULL。*/AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'D'class="token punctuation">,class="token char">'E'class="token punctuation">,class="token char">'S'class="token punctuation">)class="token punctuation">,class="token comment">/*** 缓冲区满状态消息。** 设备发出缓冲区溢出/下溢信号。** data: NULL。*/AV_DEV_TO_APP_BUFFER_OVERFLOW class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'F'class="token punctuation">,class="token char">'L'class="token punctuation">)class="token punctuation">,AV_DEV_TO_APP_BUFFER_UNDERFLOW class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'U'class="token punctuation">,class="token char">'F'class="token punctuation">,class="token char">'L'class="token punctuation">)class="token punctuation">,class="token comment">/*** 缓冲区可读/可写。** 设备通知缓冲区可读/可写。* 如果可能,设备会通知可以读/写多少字节。** @warning 当可读/写字节数发生变化时,设备可能不会通知。** data: int64_t: 可读/写的字节数。*       NULL: 可读/写的字节数未知。*/AV_DEV_TO_APP_BUFFER_READABLE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">'D'class="token punctuation">,class="token char">' 'class="token punctuation">)class="token punctuation">,AV_DEV_TO_APP_BUFFER_WRITABLE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'W'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">' 'class="token punctuation">)class="token punctuation">,class="token comment">/*** 静音状态改变消息。** 设备通知静音状态已改变。** data: int: 0表示非静音状态,非零表示静音状态。*/AV_DEV_TO_APP_MUTE_STATE_CHANGED class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'C'class="token punctuation">,class="token char">'M'class="token punctuation">,class="token char">'U'class="token punctuation">,class="token char">'T'class="token punctuation">)class="token punctuation">,class="token comment">/*** 音量级别改变消息。** 设备通知音量级别已改变。** data: double: 新音量范围为0.0 - 1.0。*/AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'C'class="token punctuation">,class="token char">'V'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'L'class="token punctuation">)class="token punctuation">,
class="token punctuation">}class="token punctuation">;class="token comment">/*** 从应用程序向设备发送控制消息。** @param s         设备上下文。* @param type      消息类型。* @param data      消息数据。具体类型取决于消息类型。* @param data_size 消息数据大小。* @return >= 0表示成功,负值表示错误。*         AVERROR(ENOSYS)表示设备未实现消息处理程序。*/
class="token keyword">int class="token function">avdevice_app_to_dev_control_messageclass="token punctuation">(class="token keyword">struct class="token class-name">AVFormatContext class="token operator">*sclass="token punctuation">,class="token keyword">enum class="token class-name">AVAppToDevMessageType typeclass="token punctuation">,class="token keyword">void class="token operator">*dataclass="token punctuation">, class="token class-name">size_t data_sizeclass="token punctuation">)class="token punctuation">;class="token comment">/*** 从设备向应用程序发送控制消息。** @param s         设备上下文。* @param type      消息类型。* @param data      消息数据。可以为NULL。* @param data_size 消息数据大小。* @return >= 0表示成功,负值表示错误。*         AVERROR(ENOSYS)表示应用程序未实现消息处理程序。*/
class="token keyword">int class="token function">avdevice_dev_to_app_control_messageclass="token punctuation">(class="token keyword">struct class="token class-name">AVFormatContext class="token operator">*sclass="token punctuation">,class="token keyword">enum class="token class-name">AVDevToAppMessageType typeclass="token punctuation">,class="token keyword">void class="token operator">*dataclass="token punctuation">, class="token class-name">size_t data_sizeclass="token punctuation">)class="token punctuation">;class="token comment">/*** 描述设备基本参数的结构。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVDeviceInfo class="token punctuation">{class="token keyword">char class="token operator">*device_nameclass="token punctuation">;                   class="token comment">/**< 设备名称,格式取决于设备 */class="token keyword">char class="token operator">*device_descriptionclass="token punctuation">;            class="token comment">/**< 人类友好的名称 */class="token keyword">enum class="token class-name">AVMediaType class="token operator">*media_typesclass="token punctuation">;       class="token comment">/**< 数组指示设备可以提供哪些媒体类型(如果有)。如果为null,则不能提供任何类型 */class="token keyword">int nb_media_typesclass="token punctuation">;                  class="token comment">/**< media_types数组的长度,如果设备不能提供任何媒体类型则为0 */
class="token punctuation">} AVDeviceInfoclass="token punctuation">;class="token comment">/*** 设备列表。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVDeviceInfoList class="token punctuation">{AVDeviceInfo class="token operator">*class="token operator">*devicesclass="token punctuation">;              class="token comment">/**< 自动检测设备列表 */class="token keyword">int nb_devicesclass="token punctuation">;                      class="token comment">/**< 自动检测设备数量 */class="token keyword">int default_deviceclass="token punctuation">;                  class="token comment">/**< 默认设备的索引,如果没有默认设备则为-1 */
class="token punctuation">} AVDeviceInfoListclass="token punctuation">;class="token comment">/*** 列出设备。** 返回可用设备名称及其参数。** @note: 某些设备可能接受无法自动检测的系统相关设备名称。*        不能假定此函数返回的列表始终是完整的。** @param s                设备上下文。* @param[out] device_list 自动检测设备列表。* @return 自动检测设备数量,负值表示错误。*/
class="token keyword">int class="token function">avdevice_list_devicesclass="token punctuation">(class="token keyword">struct class="token class-name">AVFormatContext class="token operator">*sclass="token punctuation">, AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;class="token comment">/*** 释放avdevice_list_devices()结果的便捷函数。** @param device_list 要释放的设备列表。*/
class="token keyword">void class="token function">avdevice_free_list_devicesclass="token punctuation">(AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;class="token comment">/*** 列出设备。** 返回可用设备名称及其参数。* 这些是avdevice_list_devices()的便捷包装器。* 设备上下文在内部分配和释放。** @param device           设备格式。如果设置了设备名称,可以为NULL。* @param device_name      设备名称。如果设置了设备格式,可以为NULL。* @param device_options   填充了设备私有选项的AVDictionary。可以为NULL。*                         对于输出设备,相同的选项必须稍后传递给avformat_write_header(),*                         对于输入设备,必须传递给avformat_open_input(),或在任何其他*                         影响设备私有选项的地方传递。* @param[out] device_list 自动检测设备列表* @return 自动检测设备数量,负值表示错误。* @note 当两者都设置时,device参数优先于device_name。*/
class="token keyword">int class="token function">avdevice_list_input_sourcesclass="token punctuation">(class="token keyword">const AVInputFormat class="token operator">*deviceclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*device_nameclass="token punctuation">,AVDictionary class="token operator">*device_optionsclass="token punctuation">, AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;
class="token keyword">int class="token function">avdevice_list_output_sinksclass="token punctuation">(class="token keyword">const AVOutputFormat class="token operator">*deviceclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*device_nameclass="token punctuation">,AVDictionary class="token operator">*device_optionsclass="token punctuation">, AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;class="token comment">/*** @}*/class="token macro property">class="token directive-hash">#class="token directive keyword">endif class="token comment">/* AVDEVICE_AVDEVICE_H */code>

http://www.ppmy.cn/embedded/160092.html

相关文章

6S模型的编译问题解决

使用python处理遥感光谱数据&#xff0c;免不了进行大气校正&#xff0c;基本上免费的就是使用Py6s&#xff0c;而py6s库只是一个接口&#xff0c;还需要自己配置6S模型&#xff0c;可以查到很多资料&#xff0c;6S模型是古老的fortran语言写的&#xff0c;基本配置流程就是安装…

基于python热门歌曲采集分析系统

基于Python的热门歌曲采集分析系统是一个综合性的音乐数据处理平台&#xff0c;它利用Python的强大功能&#xff0c;结合数据库和前端技术&#xff0c;实现了对热门歌曲的采集、分析、展示和管理。以下是对该系统的详细介绍&#xff1a; 一、系统架构与技术栈 1.后端&#xf…

Python爬虫:1药城店铺爬虫(完整代码)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

【Vue3 完整学习笔记 - 第一部分】

Vue3 完整学习笔记 - 第一部分 Vue3 完整学习笔记 - 第一部分1. Vue3 基础入门1.1 Vue3 简介1.2 创建 Vue3 工程1.3 编写首个 Vue3 组件1.4 Composition API vs Options API1.5 setup 函数详解1.6 响应式数据处理 Vue3 完整学习笔记 - 第一部分 1. Vue3 基础入门 1.1 Vue3 简…

RGB565转BITMAP[C#---2]

这是楼主在开发C#上位机的时候遇到的另一个问题&#xff0c;怎么把RGB565转为BITMAP&#xff0c;在CSDN上搜索&#xff0c;要么是安卓平台的&#xff0c;要么是2011年的古早代码&#xff08;还没排版&#xff09;&#xff0c;还是靠自己和DEEPSEEK的智慧解决了(●’◡’●) 当然…

【PyQt】keyPressEvent键盘按压事件无响应

问题描述 通过load ui 文件加载程序时&#xff0c;keyPressEvent键盘按压事件无响应 原因 主要是由于事件处理的方式和窗口的显示方式不正确所导致的。 解决代码 self&#xff1a;这里的self作为loadUi函数的第二个参数&#xff0c;意味着加载的界面将被设置为当前类实例&…

基于YOLO11的肺结节检测系统

基于YOLO11的肺结节检测系统 (价格90) LUNA16数据集 数据一共 1186张 按照8&#xff1a;1&#xff1a;1随机划分训练集&#xff08;948张&#xff09;、验证集&#xff08;118张&#xff09;与测试集&#xff08;120张&#xff09; 包含 nodule 肺结节 1种…

『 C++ 』中理解回调类型在 C++ 中的使用方式。

文章目录 案例 1&#xff1a;图形绘制库中的回调使用场景说明代码实现代码解释 案例 2&#xff1a;网络服务器中的连接和消息处理回调场景说明代码实现代码解释 案例 3&#xff1a;定时器中的回调使用场景说明代码实现代码解释 以下将通过不同场景给出几个使用回调类型的具体案…