当前位置: 首页 > news >正文

RTSP播放器实现回调RGB|YUV给视觉算法,然后二次编码推送到RTMP服务

引言

在本文中,我们将介绍如何基于大牛直播SDK构建一个功能强大的RTSP|RTMP播放器,该播放器利用自定义SDK解码视频、处理RGB帧,并将其推送到RTMP流中进行直播。这个解决方案非常适合需要在实时视频流中集成视觉算法的场景,在处理后将数据推送到RTMP服务器。我们将详细探讨播放器的架构、回调处理以及图像帧的操作过程。

核心组件概述

先看视频演示,左侧是Windows平台轻量级RTSP服务,采集毫秒计数器,然后编码打包,对外提供RTSP拉流的URL,右上角拉取原始的RTSP流,然后回调解码后的RGB|YUV数据,然后点击推送RTMP,实现RGB|YUV数据的二次编码和RTMP推送。可以看到,从原始数据播放回调,到右下角处理后的RTMP流,二次播放,整体延迟在毫秒级,非常低。

RTMP|RTSP播放器回调RGB数据进行算法分析和二次推流

  1. RTSP/RTMP播放器架构

    • 该播放器接收RTSP流,将其解码为RGB帧,处理后将这些帧推送到RTMP流进行直播广播。

    • 它利用自定义SDK来处理视频解码、帧处理和流推送。

  2. 关键概念

    • RTSP(实时流协议):该协议用于控制流媒体服务器,广泛应用于实时视频流的传输。

    • RTMP(实时消息协议):RTMP用于将视频数据推送到直播服务器,确保低延迟广播。

    • RGB数据处理:播放器将视频帧解码为RGB格式(32位),然后传递给视觉算法进行处理,最后将处理后的数据推送到RTMP服务器。

代码讲解

进入系统后,先播放RTMP、或RTSP流,然后点RTMP推流,那么会模拟把播放器回调的RGB或YUV数据,投递到RTMP推送模块(右上方播放和转推)、右下方播放RTMP服务器二次处理后的RTMP流。

1. 初始化播放器SDK

CSmartPlayerDlg类负责初始化播放器、设置事件回调并准备视频渲染窗口。SDK初始化通过player_api_对象完成。

/* * SmartPlayDlg.cpp* Created by daniusdk.com* WeChat: xinsheng120*/
void CSmartPlayerDlg::OnBnClickedButtonPlay()
{if ( player_handle_ == NULL )return;CString btn_play_str;btn_play_.GetWindowTextW(btn_play_str);if ( btn_play_str == _T("播放") ){if ( !is_recording_ ){if ( !InitCommonSDKParam() ){AfxMessageBox(_T("设置参数错误!"));return;}}player_api_.SetVideoSizeCallBack(player_handle_, GetSafeHwnd(), SP_SDKVideoSizeHandle);bool is_support_d3d_render = false;NT_INT32 in_support_d3d_render = 0;if ( NT_ERC_OK == player_api_.IsSupportD3DRender(player_handle_,wrapper_render_wnd_.RenderWnd(), &in_support_d3d_render)){if ( 1 == in_support_d3d_render ){is_support_d3d_render = true;}}player_api_.SetVideoFrameCallBack(player_handle_, NT_SP_E_VIDEO_FRAME_FORMAT_RGB32,this, SM_SDKVideoFrameHandleV2);if ( is_support_d3d_render ){is_gdi_render_ = false;// 支持d3d绘制的话,就用D3D绘制player_api_.SetRenderWindow(player_handle_, wrapper_render_wnd_.RenderWnd());player_api_.SetRenderScaleMode(player_handle_, btn_check_render_scale_mode_.GetCheck() == BST_CHECKED ? 1 : 0);}else{is_gdi_render_ = true;// 不支持D3D就让播放器吐出数据来,用GDI绘制wrapper_render_wnd_.SetRenderScaleMode(btn_check_render_scale_mode_.GetCheck() == BST_CHECKED ? 1 : 0);player_api_.SetVideoFrameCallBack(player_handle_, NT_SP_E_VIDEO_FRAME_FORMAT_RGB32,GetSafeHwnd(), SM_SDKVideoFrameHandle);}if ( BST_CHECKED == btn_check_hardware_decoder_.GetCheck() ){player_api_.SetH264HardwareDecoder(player_handle_, is_support_h264_hardware_decoder_?1:0, 0);player_api_.SetH265HardwareDecoder(player_handle_, is_support_h265_hardware_decoder_?1:0, 0);}else{player_api_.SetH264HardwareDecoder(player_handle_, 0, 0);player_api_.SetH265HardwareDecoder(player_handle_, 0, 0);}player_api_.SetOnlyDecodeVideoKeyFrame(player_handle_, BST_CHECKED == btn_check_only_decode_video_key_frame_.GetCheck() ? 1 : 0);player_api_.SetLowLatencyMode(player_handle_, BST_CHECKED == btn_check_low_latency_.GetCheck() ? 1 : 0);player_api_.SetFlipVertical(player_handle_, BST_CHECKED == btn_check_flip_vertical_.GetCheck() ? 1 :0 );player_api_.SetFlipHorizontal(player_handle_, BST_CHECKED == btn_check_flip_horizontal_.GetCheck() ? 1 : 0);player_api_.SetRotation(player_handle_, rotate_degrees_);player_api_.SetAudioVolume(player_handle_, slider_audio_volume_.GetPos());player_api_.SetUserDataCallBack(player_handle_, GetSafeHwnd(), NT_SP_SDKUserDataHandle);if (NT_ERC_OK != player_api_.StartPlay(player_handle_)){AfxMessageBox(_T("播放器失败!"));return;}btn_play_.SetWindowTextW(_T("停止"));is_playing_ = true;}else{StopPlayback();}
}void CSmartPlayerDlg::StopPlayback()
{if ( player_handle_ == NULL )return;is_gdi_render_ = false;btn_full_screen_.EnableWindow(FALSE);wrapper_render_wnd_.ClearVideoSize();wrapper_render_wnd_.SetPlayerHandle(NULL);width_ = 0; height_ = 0;player_api_.StopPlay(player_handle_);wrapper_render_wnd_.CleanRender();btn_play_.SetWindowTextW(_T("播放"));is_playing_ = false;if (!is_recording_){SetWindowText(base_title_);edit_duration_.SetWindowText(_T(""));edit_playback_pos_.SetWindowText(_T(""));btn_pause_.SetWindowText(_T("暂停"));edit_player_msg_.SetWindowText(_T(""));}
}

上述代码片段初始化了SmartPlayer SDK,这是解码RTSP流、处理视频和音频播放所必需的。

2. 设置事件回调

播放器SDK提供了多个事件回调函数,这些回调函数会在特定事件发生时触发,比如接收到新的视频帧或遇到缓冲事件。这些回调函数在初始化时进行设置。

例如,SetVideoFrameCallBack函数用于定义在接收到新的视频帧时应该执行什么操作:

player_api_.SetVideoFrameCallBack(handle, NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, this, &CSmartPlayerDlg::OnVideoFrameHandle);

OnVideoFrameHandle函数会处理每个RGB帧,然后将其推送到RTMP流。

3. 处理视频帧回调

OnVideoFrameHandle函数中,我们通过首先检查帧的格式,然后将其数据复制到nt_rgb32_image结构体中来处理RGB帧:

void CSmartPlayerDlg::OnVideoFrameHandle(NT_HANDLE handle, NT_UINT32 status,const NT_SP_VideoFrame* frame)
{if (nullptr == frame)return;std::unique_lock<std::recursive_mutex> lock(push_handle_mutex_);if (!is_pushing_)return;if (GetPushHandle() == nullptr)return;//NT_UINT64 ts = frame->timestamp_;//std::ostringstream ss;//ss << "OnVideoFrameHandle, ts: " << ts << "\r\n";//OutputDebugStringA(ss.str().c_str());NT_PB_Image image;memset(&image, 0, sizeof(image));image.width_ = frame->width_;image.height_ = frame->height_;// timestamp_ 目前不使用//image.timestamp_ = frame->timestamp_;if (NT_SP_E_VIDEO_FRAME_FORMAT_RGB32 == frame->format_){image.format_ = NT_PB_E_IMAGE_FORMAT_RGB32;image.plane_[0] = frame->plane0_;image.stride_[0] = frame->stride0_;image.plane_size_[0] = frame->stride0_ * frame->height_;}else if (NT_SP_E_VIDEO_FRAME_FROMAT_I420 == frame->format_){image.format_ = NT_PB_E_IMAGE_FORMAT_I420;image.plane_[0] = frame->plane0_;image.stride_[0] = frame->stride0_;image.plane_size_[0] = frame->stride0_ * frame->height_;image.plane_[1] = frame->plane1_;image.stride_[1] = frame->stride1_;image.plane_size_[1] = frame->stride1_ * ((frame->height_ + 1) / 2);image.plane_[2] = frame->plane2_;image.stride_[2] = frame->stride2_;image.plane_size_[2] = frame->stride2_ * ((frame->height_ + 1) / 2);}else{return;}int index_ = 0;push_api_.PostLayerImage(push_handle_, 0, index_, &image, 0, NULL);
}

该函数将帧数据转换为图像对象,可以进行后续处理或传递给可视算法,通过PostLayerImage()接口投递到RTMP推送模块。

4. 推送到RTMP

一旦RGB帧处理完成,我们需要将视频数据推送到RTMP服务器。通过使用Smart Publisher SDK的推送功能,我们实现了这一点:

/* SmartPlayerDlg.cpp* Created by daniusdk.com* WeChat: xinsheng120*/
void CSmartPlayerDlg::OnBnClickedButtonPush()
{// TODO: Add your control notification handler code hereCString btn_push_str;btn_push_.GetWindowTextW(btn_push_str);if (btn_push_str == _T("推送RTMP")){StartPush("rtmp://192.168.1.7:1935/hls/stream666");}else{StopPush();}
}bool CSmartPlayerDlg::StartPush(const std::string& url)
{if (is_pushing_)return false;if (url.empty())return false;if (!OpenPushHandle())return false;auto push_handle = GetPushHandle();ASSERT(push_handle != nullptr);if (publisher_handle_count_ < 1){SetCommonOptionToPublisherSDK();}if (NT_ERC_OK != push_api_.SetURL(push_handle, url.c_str(), NULL)){if (0 == publisher_handle_count_){push_api_.Close(push_handle);SetPushHandle(nullptr);}return false;}if (NT_ERC_OK != push_api_.StartPublisher(push_handle, NULL)){if (0 == publisher_handle_count_){push_api_.Close(push_handle);SetPushHandle(nullptr);}return false;}publisher_handle_count_++;btn_push_.SetWindowTextW(_T("停止推送"));is_pushing_ = true;return true;
}void CSmartPlayerDlg::StopPush()
{if (!is_pushing_)return;is_pushing_ = false;std::unique_lock<std::recursive_mutex> lock(push_handle_mutex_);if (nullptr == push_handle_)return;publisher_handle_count_--;push_api_.StopPublisher(push_handle_);if (0 == publisher_handle_count_){push_api_.Close(push_handle_);push_handle_ = nullptr;}btn_push_.SetWindowTextW(_T("推送RTMP"));
}

PushVideoFrame方法将处理后的视频数据实时推送到RTMP服务器。

5. 处理错误与缓冲

SDK还提供了事件回调来处理错误和缓冲事件。例如,当播放器开始缓冲时,将触发以下回调:

extern "C" NT_VOID NT_CALLBACK NT_Push_SDKEventHandle(NT_HANDLE handle, NT_PVOID user_data,NT_UINT32 event_id,NT_INT64  param1,NT_INT64  param2,NT_UINT64 param3,NT_UINT64 param4,NT_PCSTR  param5,NT_PCSTR  param6,NT_PVOID  param7)
{if (user_data == NULL)return;HWND hwnd = (HWND)user_data;if (NT_PB_E_EVENT_ID_CONNECTING == event_id|| NT_PB_E_EVENT_ID_CONNECTION_FAILED == event_id|| NT_PB_E_EVENT_ID_CONNECTED == event_id|| NT_PB_E_EVENT_ID_DISCONNECTED == event_id){if (hwnd != nullptr && ::IsWindow(hwnd)){auto event_info = new ConnectionEventInfo(handle, event_id, param5);::PostMessage(hwnd, WM_USER_PB_SDK_CONNECTION_INFO, (WPARAM)event_info, 0);}}if (NT_PB_E_EVENT_ID_RTSP_URL == event_id){if (hwnd != nullptr && ::IsWindow(hwnd)){if (param5 != nullptr){auto url_event_data = new NT_PushRtspURLEventData(handle, param5);::PostMessage(hwnd, WM_USER_SDK_PUSH_RTSP_URL_EVENT, (WPARAM)url_event_data, 0);}}}
}

该事件确保应用程序能在网络或流中断时做出相应处理。

结论

构建一个RTSP|RTMP播放器并进行RGB帧处理是实时媒体应用中的一项基本技能。通过使用SmartPlayer SDK,我们能够轻松地集成视频解码、帧处理和流推送在一个平台中。这种解决方案允许我们在视频流中进行自定义的视觉处理,并在处理后将其推送到RTMP服务器。大牛直播SDK提供了必要的构建块,包括帧处理、事件驱动的回调和视频渲染,使得它成为开发专业直播应用程序的强大工具。

相关文章:

RTSP播放器实现回调RGB|YUV给视觉算法,然后二次编码推送到RTMP服务

引言 在本文中&#xff0c;我们将介绍如何基于大牛直播SDK构建一个功能强大的RTSP|RTMP播放器&#xff0c;该播放器利用自定义SDK解码视频、处理RGB帧&#xff0c;并将其推送到RTMP流中进行直播。这个解决方案非常适合需要在实时视频流中集成视觉算法的场景&#xff0c;在处理…...

补题【Darkness+Different Billing+Dice Game】

文章目录 1.Darkness2.Different Billing3.Dice Game 1.Darkness 题目来源&#xff1a;Darkness I 这题不难想&#xff0c;通过作图我们发现 当nm时直接取对角线就好 当n!m时&#xff0c;取m,n的最小值&#xff0c;那么最小值的这个正方形都可以被填为黑色&#xff0c;剩下的…...

卷积神经网络:视觉炼金术士的数学魔法

&#x1f3ae; “你以为《赛博朋克2077》的夜之城是画出来的&#xff1f;不&#xff0c;是卷积神经网络’卷’出来的&#xff01;” &#x1f3ae; 一、卷积&#xff1a;像素世界的连连看大师 想象你拿着一张《蒙娜丽莎》的拼图——卷积核就像你手中的拼图碎片&#xff0c;在画…...

Python:简介,Python解释器安装,第一个Python程序,开发环境(PyCharm安装和配置、Sublime安装和配置)

目录 Python简介 Python解释器的安装&#xff08;Windows&#xff09; 下载和安装Python安装包&#xff08;解释器&#xff09; 验证Python安装情况 第一个Python程序 单行运行 多行运行 Python开发环境&#xff08;安装和配置PyCharm工具&#xff09; 安装PyCharm Py…...

CE第二次作业

实验要求&#xff1a; 1.配置ssh实现A&#xff0c;B主机互相免密登录 2.配置nginx服务&#xff0c;通过多ip区分多网站 一&#xff0c;配置ssh实现A&#xff0c;B主机互相免密登录 步骤 在主机 A 上生成 SSH 密钥对。把主机 A 的公钥复制到主机 B。在主机 B 上重复上述步骤…...

【阿里云大模型高级工程师ACP习题集】2.4 自动化评测答疑机器人的表现(⭐️⭐️⭐️ 重点章节!!!)

习题集: 【单选题】在使用Ragas评估RAG应用时,Answer Correctness指标计算中,语义相似度是通过以下哪种方式得到的?( ) A. 大模型直接判断 B. 计算文本向量的余弦相似度 C. 对比文本词汇重合度 D. 统计文本字数差异 【多选题】当Context recall指标得分较低时,可采取的优…...

多头注意力

Multi-Head Attention 论文地址 https://arxiv.org/pdf/1706.03762 多头注意力介绍 多头注意力是Transformer模型的关键创新&#xff0c;通过并行执行多个独立的注意力计算单元&#xff0c;使模型能够同时关注来自不同表示子空间的信息。每个注意力头学习不同的语义特征&#x…...

【leetcode100】目标和

1、题目描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添加 - …...

动态哈希映射深度指南:从基础到高阶实现与优化

哈希表是计算机科学中最高效的数据结构之一&#xff0c;而动态哈希映射通过智能扩容机制&#xff0c;在实时系统中展现出极强的适应性。本文将深入探讨其实现细节&#xff0c;结合主流框架源码解析&#xff0c;并给出可落地的性能优化方案。 一、动态哈希的数学本质 1. 哈希函…...

leetcode 2799. 统计完全子数组的数目 中等

给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序列。 示例 1&#xff…...

使用RabbitMQ实现判题功能

这次主要选用RabbitMQ消息队列来对判题服务和题目服务解耦&#xff0c;题目服务只需要向消息队列发送消息&#xff0c;判题服务从消息队列中取信息去执行判题&#xff0c;然后异步更新数据库即可。 五一宝宝请快点跑~~~~~ 先回顾一下RabbitMQ &#xff08;1&#xff09;引入依…...

无过拟合的记忆:分析大语言模型的训练动态

Kushal Tirumala⇤ Aram H. Markosyan⇤ Luke Zettlemoyer Armen Aghajanyan Meta AI 研究 {ktirumala,amarkos,lsz,armenag}fb.com 原文链接&#xff1a;[2210.09262] Physics-Driven Convolutional Autoencoder Approach for CFD Data Compressions 摘要 尽管超大语言模型…...

【Java面试笔记:进阶】16.synchronized底层如何实现?什么是锁的升级、降级?

在 Java 中,synchronized 关键字的底层实现依赖于 对象头(Object Header) 和 监视器锁(Monitor) 机制,并通过 锁的状态升级(Lock Escalation) 来优化同步性能。 1. synchronized 的底层实现 synchronized 的同步机制基于 Monitor 对象,它是同步的基本实现单元。 通过…...

python可视化:北方城市人口流动趋势分析1

python可视化&#xff1a;北方城市人口流动趋势分析1 斑点鱼在做销售数据分析时发现北京天津的同比下滑明显&#xff0c;客流下滑明显。而山东保定的客流同比上升。引起了斑点鱼对于北方人口流动的好奇。 所以本文将分析2025年北方地区(北京、天津、河北、山东、山西、辽宁等)…...

wps excel 常用操作

数据分列 对于有分隔规律的内容&#xff0c;可以通过分隔符将该内容进行分列 例如&#xff0c;以下字符串&#xff0c;可使用Excel对包含IP地址、数据库类型、环境、负责人和日期的字符串进行分列&#xff1a; 192.168.175.211-MySQL 数据库-DEV-李华-2025.06.30 将以上字符串…...

云智融合普惠大模型AI,政务服务重构数智化路径

2025年是“十四五”收官之年&#xff0c;数字政府和政务数智化作为“数字中国”建设的重点&#xff0c;已经取得了显著成效。根据《联合国电子政务调查报告2024》&#xff0c;我国电子政务发展指数全球排名第35位&#xff0c;与2022年相比提升8个名次&#xff1b;其中&#xff…...

全行业软件定制:APP/小程序/系统开发与物联网解决方案

在数字化浪潮席卷全球的今天&#xff0c;软件已经渗透到我们生活的方方面面&#xff0c;成为推动社会进步的重要力量。作为一家专注于专业软件定制开发的公司&#xff0c;哲科软件深知每一个行业、每一个企业都有其独特的需求和痛点。因此&#xff0c;我们致力于提供个性化软件…...

Java虚拟机(JVM)家族发展史及版本对比

Java虚拟机&#xff08;JVM&#xff09;家族发展史及版本对比 一、JVM家族发展史 1. 早期阶段&#xff08;1996-2000&#xff09; Classic VM&#xff08;Java 1.0-1.1&#xff09;&#xff1a; 厂商&#xff1a;Sun Microsystems&#xff08;Oracle前身&#xff09;。特点&…...

电脑怎么强制退出程序回到桌面 详细操作步骤

电脑日常使用过程中&#xff0c;我们有时会遇到程序无响应或卡死的情况&#xff0c;这时需要采取措施强制关闭这些程序才能保持电脑的正常工作和运行。那么&#xff0c;电脑如何强制退出程序呢&#xff1f;其实方法有很多种&#xff0c;下面便为大家介绍几种电脑强制关闭程序的…...

蓝牙 LE:安全模式和程序说明(蓝牙中的网络安全)

在蓝牙低功耗 (BLE) 中,安全性是一个多方面的难题。了解 BLE 的三种主要安全模式以及五个关键的 BLE 安全程序。 毫无疑问,低功耗蓝牙 (BLE) 技术的迅猛发展为我们的生活带来了更多便利。然而,随着低功耗蓝牙设备的普及,人们对其安全性的担忧也日益加剧。 与普遍看法相反…...

低代码平台开发胎压监测APP

项目介绍 该项目是一个利用Flutter框架和蓝牙技术实现轮胎压力实时监测的应用。 主要功能如下&#xff1a; 用于接收蓝牙模块传输的胎压数据&#xff0c;并实时显示胎压值。APP对接收到的胎压数据进行处理&#xff0c;如单位转换、数据滤波等&#xff0c;然后将处理后的胎压值…...

GNOME扩展入门:日期时间

Getting Started | GNOME JavaScript 1.扩展路径 ~/.local/share/gnome-shell/extensions/ 2.新建文件夹 datetimesonichy 3.metadata.json {"uuid": "datetimesonichy","name": "datetime","description": "Dis…...

NLP高频面试题(五十二)——深度学习优化器详解

在深度学习的训练过程中,各种基于梯度的优化器肩负着寻找损失函数最优解的重任。最基础的梯度下降法通过沿着损失函数负梯度方向迭代更新参数,实现对模型参数的优化;而随机梯度下降(SGD)则以更高的计算效率和内存利用率在大规模数据集上大放异彩,但也因更新噪声大、易陷入…...

SLAM常用地图对比示例

序号地图类型概述1格栅地图将现实环境栅格化&#xff0c;每一个栅格用 0 和 1 分别表示空闲和占据状态&#xff0c;初始化为未知状态 0.52特征地图以点、线、面等几何特征来描绘周围环境&#xff0c;将采集的信息进行筛选和提取得到关键几何特征3拓扑地图将重要部分抽象为地图&…...

Web常见攻击方式及防御措施

一、常见Web攻击方式 1. 跨站脚本攻击(XSS) 攻击原理&#xff1a;攻击者向网页注入恶意脚本&#xff0c;在用户浏览器执行 存储型XSS&#xff1a;恶意脚本存储在服务器&#xff08;如评论区&#xff09; 反射型XSS&#xff1a;恶意脚本通过URL参数反射给用户 DOM型XSS&…...

java.lang.IllegalArgumentException: URI is not hierarchical报错

java.lang.IllegalArgumentException: URI is not hierarchical Thread.currentThread().getContextClassLoader("类的全路径").getClass().newInstance()一个类的静态块初始化异常了&#xff0c;后面调用这个类创建对象会报错吗&#xff1f; 是的&#xff0c;如果一…...

118. 杨辉三角

目录 一、问题描述 二、解题思路 三、代码 四、复杂度分析 一、问题描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 二、解题思路 每一行的第一个和最后一个元素是 1&…...

Anything V4/V5 模型汇总

​​​​​​二次元风格生成扩散模型-anything-v4.0Stable Diffusion anything-v5-PrtRE模型介绍及使用深度探索 Anything V5&#xff1a;安装与使用全攻略anything-v5x0.25少儿插画_v1xyn-ai/anything-v4.0...

网络原理 - 7(TCP - 4)

目录 6. 拥塞控制 7. 延时应答 8. 捎带应答 9. 面向字节流 10. 异常情况 总结&#xff1a; 6. 拥塞控制 虽然 TCP 有了滑动窗口这个大杀器&#xff0c;就能够高效可靠的发送大量的数据&#xff0c;但是如果在刚开始阶段就发送大量的数据&#xff0c;仍然可能引起大量的…...

探秘 FFmpeg 版本发展时间简史

前言 FFmpeg 是一套开源的计算机程序,主要用于记录、转换数字音频、视频,并能将其转化为流。它提供了录制、转换以及流化音视频的完整解决方案,在多媒体处理领域应用广泛。很多小伙伴们想系统的学习FFmpeg,还是有必要了解下FFmpeg的版本发展历史,感受它每次的版本迭代是如…...

5.3.1 MvvmLight以及CommunityToolkit.Mvvm介绍

MvvmLight、CommunityToolkit.Mvvm是开源包,他们为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。 本文介绍如下: 一、使用(旧)的MvvmLight库 其特点如下,要继承的基类是ViewModelBase;且使用…...

PCB常见封装类型

1. 电阻、电容、电感封装 2. 二极管、三极管封 3. 排阻类器件&#xff08;8脚、16脚&#xff09;封装 4. SO类器件&#xff08;间距有1.27、2.54mm等&#xff09;封装 5. QFP类器件封装&#xff08;四方扁平封装&#xff09; 结构&#xff1a;引脚分布在封装的四个侧面&#…...

一键多环境构建——用 Hvigor 玩转 HarmonyOS Next

引言 在 HarmonyOS Next 的应用开发中&#xff0c;常常需要针对不同环境&#xff08;测试、预发、线上&#xff09;或不同签名&#xff08;调试、正式&#xff09;输出多个 APP/HAP 包。虽然 HarmonyOS 提供了多目标构建&#xff08;Multi-Target Build&#xff09;能力&#…...

SQLPandas刷题(LeetCode3451.查找无效的IP地址)

描述&#xff1a;LeetCode3451.查找无效的IP地址 表&#xff1a;logs ---------------------- | Column Name | Type | ---------------------- | log_id | int | | ip | varchar | | status_code | int | ---------------------- log_id 是这张表的唯…...

【leetcode100】组合总和Ⅳ

1、题目描述 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#xff1…...

2020-06-23 暑期学习日更计划(机器学习入门之路(资源汇总)+概率论)

机器学习入门 前言 说实话&#xff0c;机器学习想学好真心不易&#xff0c;很多时候都感觉自己学得云里雾里。以前一段时间自己为了完成毕业设计&#xff0c;在机器学习的理论部分并没有深究&#xff0c;仅仅通过TensorFlow框架力求快速实现模型。现在来看&#xff0c;很多时候…...

Linux操作系统--基础I/O(上)

目录 1.回顾C文件接口 stdin、stdout、stderr 2.系统文件I/O 3.接口介绍 4.open函数返回值 5.文件描述符fd 5.1 0&1&2 1.回顾C文件接口 hello.c写文件 #include<stdio.h> #include<string.h>int main() {FILE *fp fopen("myfile","…...

Spring boot 中的IOC容器对Bean的管理

Spring Boot 中 IOC 容器对 Bean 的管理&#xff0c;涵盖从容器启动到 Bean 的生命周期管理的全流程。 步骤 1&#xff1a;理解 Spring Boot 的容器启动 Spring Boot 的 IOC 容器基于 ApplicationContext&#xff0c;在应用启动时自动初始化。 入口类&#xff1a;通过 SpringB…...

ARINC818协议一些说明综述

关键术语 航空总线技术 光纤通道层次架构 光纤通道拓扑结构 FC-AV协议&#xff0c;架构&#xff0c;容器系统 ARINC818协议&#xff0c;容器 ADVB帧映射&#xff0c;帧格式 机载视频处理系统对视频数据进行实时处理和记录。 分辨率&#xff1a;1080p,4k,8k视频技术 FC-AV技术是…...

Turso:一个基于 libSQL的分布式数据库

Turso 是一个完全托管的数据库平台&#xff0c;支持在一个组织中创建高达数十万个数据库&#xff0c;并且可以复制到任何地点&#xff0c;包括你自己的服务器&#xff0c;以实现微秒级的访问延迟。你可以通过Turso CLI&#xff08;命令行界面&#xff09;管理群组、数据库和API…...

2025.5.4机器学习笔记:PINN文献阅读

2025.5.4周报 文献阅读题目信息摘要创新点网络架构实验结论不足以及展望 文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Network Approach for Solving the One-Dimensional Unsteady Shallow-Water Equations in Riverine Systems期刊&#xff1a; Journal o…...

一行命令打开iOS模拟器

要在 Mac 命令行打开 iPhone 15 Pro 模拟器&#xff0c;需满足已安装 Xcode 这一前提条件&#xff0c;以下是具体操作步骤&#xff1a; 步骤一&#xff1a;列出所有可用模拟器设备 打开终端&#xff08;Terminal&#xff09;&#xff0c;输入并执行以下命令&#xff0c;用于列…...

java面向对象编程【基础篇】之基础语法

目录 &#x1f680;前言&#x1f31f;构造器&#x1f4af;案例 &#x1f914;this关键字&#x1f4af;使用this调用本类中的属性&#x1f4af;使用this调用构造器&#x1f4af;this表示当前对象 &#x1f99c;封装&#x1f4af;合理隐藏&#x1f4af;合理暴露 &#x1f427;实体…...

跑MPS产生委外采购申请(成品)

问题&#xff1a;跑MPS产生委外采购申请&#xff08;成品&#xff09;&#xff0c;更改BOM和跑MRP&#xff0c;但物料需求清单中无新增物料复合膜的需求。截图如下&#xff1a; 解决方法&#xff1a;更改委外采购申请的批准日期为BOM的生效日和重新展开bom。 重新展开后&#x…...

[flutter]切换国内源(window)

如题&#xff0c;切换到国内源避免总是连不上google导致卡住的问题。 临时切换到国内&#xff1a; cmd set PUB_HOSTED_URLhttps://pub.flutter-io.cn set FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cnpower shell $env:PUB_HOSTED_URL "https://pub.flut…...

学习海康VisionMaster之顶点检测

一&#xff1a;进一步学习了 今天学习下VisionMaster中的顶点检测&#xff1a;可检测图像指定区域内的顶点&#xff0c;并输出顶点坐标等信息。该模块常用于检测目标物体的顶点 二&#xff1a;开始学习 1&#xff1a;什么是顶点检测&#xff1f; 一个不是很规则的物体需要检测…...

Vue2中常用的核心函数(选项和生命周期钩子)的完整示例及总结

以下是Vue2中常用的核心函数&#xff08;选项和生命周期钩子&#xff09;的完整示例及总结&#xff1a; 1. 实例选项函数 data 初始化组件数据 new Vue({el: #app,data() {return {message: Hello Vue!};} });methods 定义组件方法 new Vue({el: #app,data() {return { c…...

数据集-目标检测系列- F35 战斗机 检测数据集 F35 plane >> DataBall

数据集-目标检测系列- F35 战斗机 检测数据集 F35 plane >> DataBall DataBall 助力快速掌握数据集的信息和使用方式。 贵在坚持&#xff01; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s…...

2025年3月AGI技术月评|技术突破重构数字世界底层逻辑

〔更多精彩AI内容&#xff0c;尽在 「魔方AI空间」 &#xff0c;引领AIGC科技时代〕 本文作者&#xff1a;猫先生 ——当「无限照片」遇上「可控试穿」&#xff0c;我们正在见证怎样的智能革命&#xff1f; 被低估的进化&#xff1a;开源力量改写游戏规则 当巨头们在AGI赛道…...

【k8s】k8s是怎么实现自动扩缩的

Kubernetes 提供了多种自动扩缩容机制&#xff0c;主要包括 Pod 水平自动扩缩&#xff08;HPA&#xff09;、垂直 Pod 自动扩缩&#xff08;VPA&#xff09; 和 集群自动扩缩&#xff08;Cluster Autoscaler&#xff09;。以下是它们的实现原理和配置方法&#xff1a; 1. Pod …...