基于ffmpeg与SDL的视频播放库
由于工作需要,自己封装的基于ffmpeg的视频编解码库,显示采用了SDL库。可以播放本地文件或网络流,支持多端口播放,支持文字叠加,截图、视频录制等等。
头文件代码:
#pragma once
#ifdef __DLLEXPORT
#define __DLL_EXP _declspec(dllexport)
#else
#define __DLL_EXP _declspec(dllimport)
#endif #include <stdio.h>
#include <string>using namespace std;
//录像状态
enum RecordStatus
{Idle,Recording,Stop
};//视频存储格式
enum VideoFormat
{MP4,AVI,
};//图片存储格式
enum PictureFormat
{JPEG,PNG,BMP,
};//播放器状态
enum PlayStatus
{Close,Playing,Pause
};//滤镜种类
enum FilterType
{Time,Reticle,Text,Other
};//颜色
struct RGBAColor
{BYTE R;BYTE G;BYTE B;BYTE A;
};//OSD字体属性结构体struct OSDParameter
{char* text;int fontSize; //汉字字号int fontFamily; //0=黑体,1=楷体,2=宋体 3:ArialRGBAColor fontColor; //字体颜色 rgb表示RGBAColor backColor; //字体背景色 rgb表示float x; //字体坐标 x:宽度百分比0-1float y; //字体坐标 y:高度百分比0-1bool visible; //是否可见
};//格式enum FrameFormat{AUDIO16,RGB32,YV12,UVVY,YUVJ420P};struct FrameInfo
{int width; //画面宽,单位像素。如果是音频数据则为0;int height; //画面高。如果是音频数据则为0;int stamp; //时标信息,单位毫秒。FrameFormat format; //数据类型,0:AUDIO16,1:RGB32,2:(YUV420P)YV12,3:YUVJ420P int frameRate; //实时帧率。
};/**
* 功能描述:打开视频
* @param nPort:播放通道号[0,31]
* @param url:视频文件或视频流地址
* @param data:图像控件句柄,后台录制时,赋值NULL
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_OpenVideo(int nPort, const char* url, const void* hWnd);/**
* 功能描述: 开始播放
* @param nPort:播放通道号[0,31]
* @param isRealTimePlay:实时播放,在需要实时播放时开启,如播放摄像头流。为false时,将按照帧率播放。
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_StartPlay(int nPort,bool isRealTimePlay);/**
* 功能描述: 暂停播放
* @param nPort:播放通道号[0,31]
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_PausePlay(int nPort);/**
* 功能描述:关闭视频释放资源
* @param nPort:播放通道号[0,31]
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_CloseVideo(int nPort);/**
* 功能描述:设置文件播放指针的相对位置(百分比)
* @param nPort:播放通道号[0,31]
* @param pos:播放时间位置 0-100
* @param fReleatePos:0-100
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetPlayPos(int nPort, float fReleatePos);/**
* 功能描述:播放速度控制
* @param nPort:播放通道号[0,31]
* @param speed:速度 0:正常播放 1:1.25倍速 2:1.5倍速 3:1.75倍速 4:2倍速 5:0.75倍速 6:0.5倍速 7:0.25倍速
*/
extern "C" __declspec(dllexport) void _stdcall VideoPlayer_ChangeSpeed(int nPort, int speed);/**
* 功能描述:获取当前播放时间
* @param nPort:播放通道号[0,31]
* @return 播放时间 单位:秒
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_GetPlayedTime(int nPort);/**
* 功能描述:播放窗口缩放
* @param nPort:播放通道号[0,31]
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_ResizeWindow(int nPort);/**
* 功能描述:设置录制参数
* @param nPort:播放通道号[0,31]
* @param fps:视频帧率
* @param quality:图像质量(0-10) 越高质量越好,占用内存越大,设置为0时,为自动码率
* @param duration:单个文件时长(min),默认60分钟
* @param frameExtractionMode:抽帧模式 0:不抽帧,以fps进行编码;1:1/2 帧率,以fps/2进行抽帧(保证fps/2为整数,否则会出现丢帧情况)
* @param format:存储格式,默认为mp4
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetRecordParameter(int nPort,int fps, float quality = 5, int duration = 60, int frameExtractionMode = 0, VideoFormat format= VideoFormat::MP4);/**
* 功能描述:开始录制
* @param nPort:播放通道号[0,31]
* @param path:录像保存路径包含文件名
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_StartRecord(int nPort, const char* path);/**
* 功能描述:结束录制
* @param nPort:播放通道号[0,31]
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_StopRecord(int nPort);/**
* 功能描述:视频截图
* @param nPort:播放通道号[0,31]
* @param path: 图像保存的路径,不含后缀名
* @param format:图像格式,默认为jpeg
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_ShotImage(int nPort, const char* path, PictureFormat format= PictureFormat::JPEG);/**
* 功能描述:设置某一行的OSD叠加文本
* @param nPort:播放通道号[0,31]
* @param osdID:OSD文本序号
* @param para:osd属性
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetOSDText(int nPort, int osdID, OSDParameter osdParam);/**
* 功能描述:设置所有的OSD文本(总共20行)
* @param nPort:播放通道号[0,31]
* @param para:osd属性
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetAllOSDTexts(int nPort, OSDParameter osdParams[]);/**
* 功能描述:清除所有OSD文本
* @param nPort:播放通道号[0,31]
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_ClearOSDText(int nPort);/**
* 功能描述:设置解码缓存队列大小
* @param nPort:播放通道号[0,31]
* @param size:默认为10,设置过小会丢帧,设置过大可能会导致画面延迟
*
* @return 成功/失败
*/
extern "C" __declspec(dllexport) void _stdcall VideoPlayer_SetDecodedBufferSize(int nPort, int size);/**
* 功能描述:单帧往后播放
* @param nPort:播放通道号[0,31]
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_NextFrame(int nPort);/**
* 功能描述:单帧往前播放
* @param nPort:播放通道号[0,31]
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_PrevFrame(int nPort);/**
* 功能描述:跳转视频到某一时间位置
* @param nPort:播放通道号[0,31]
* @param pos:视频位置百分比
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetPlayPos(int nPort,float pos);/**
* 功能描述:显示/隐藏当前系统时间
* @param nPort:播放通道号[0,31]
* @param visible:是否显示
* @param xPos:坐标位置X,宽度百分比
* @param yPos:坐标位置Y,高度百分比
* @param fontSize:字体大小,默认50
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetDateTime(int nPort,bool visible, float xPos, float yPos,int fontSize=50);/**
* 功能描述:当前解码完成数据回调
* @param nPort:播放通道号[0,31]
* @param pBuf:yuv数据指针
* @param nSize:数据大小
* @param pFrameInfo:帧信息
*/
typedef void(_stdcall* DecodeCallBack)(int nPort, const unsigned char* pBuf, int nSize, FrameInfo& pFrameInfo);/**
* 功能描述:设置解码回调函数
* @param nPort:播放通道号[0,31]
* @param pDecodeProc:回调函数
*/
extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetDecCallBack(int nPort, DecodeCallBack pDecodeProc);/**
* 功能描述:在显示句柄窗口中绘制文本、图形等
* @param nPort:播放通道号[0,31]
* @param hWnd:视频窗口句柄,用于创建GDI
* @param width:视频窗口宽度
* @param height:视频窗口高度
*/
typedef void(_stdcall* DrawCallBack)(int nPort, const void* hWnd,int width,int height);extern "C" __declspec(dllexport) bool _stdcall VideoPlayer_SetDrawCallBack(int nPort, DrawCallBack pDrawProc);
库支持C++,C#调用,以下是C#调用的方法:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using VideoPlayDemo.Onvif;
using static VideoPlayDemo.MYVideoPlay;namespace VideoPlayDemo
{public partial class Form1 : Form{const int PLAY_PORT1 = 0;const int PLAY_PORT2 = 1;public event MYVideoPlay.DecodeCallBack decodeCallBack;public event MYVideoPlay.DrawCallBack drawCallBack;bool[] isRecording = new bool[2];bool[] isOpened = new bool[2];MYVideoPlay.OSDParameter[] OSDParameters1 = new MYVideoPlay.OSDParameter[20];MYVideoPlay.OSDParameter[] OSDParameters2 = new MYVideoPlay.OSDParameter[20];public Form1(){InitializeComponent();Timer timer = new Timer();timer.Interval = 100;timer.Enabled = true;timer.Tick += Timer_Tick;decodeCallBack += new MYVideoPlay.DecodeCallBack(Form1_decodeCallBack);drawCallBack += new MYVideoPlay.DrawCallBack(Form1_drawCallBack);//初始化for (int i = 0; i < 20; i++){OSDParameters1[i] = new MYVideoPlay.OSDParameter();OSDParameters1[i].visible = false;OSDParameters1[i].text = "test中文"+i.ToString();OSDParameters1[i].fontSize = 100;OSDParameters1[i].fontFamily = 0;OSDParameters1[i].fontColor = new MYVideoPlay.RGBAColor(Color.White);OSDParameters1[i].backColor = new MYVideoPlay.RGBAColor(Color.Transparent);OSDParameters2[i] = new MYVideoPlay.OSDParameter();OSDParameters2[i].visible = false;OSDParameters2[i].text = "test中文" + i.ToString();OSDParameters2[i].fontSize = 100;OSDParameters2[i].fontFamily = 0;OSDParameters2[i].fontColor = new MYVideoPlay.RGBAColor(Color.Yellow);OSDParameters2[i].backColor = new MYVideoPlay.RGBAColor(Color.Transparent);}}#region 视频播放控制方法/// <summary>/// 打开视频/// </summary>/// <param name="port"></param>public bool OpenVideo(int port,string url,IntPtr intPtr){bool ret = false;ret = MYVideoPlay.VideoPlayer_SetDecCallBack(port, decodeCallBack);if (!ret){MessageBox.Show("设置解码回调函数失败!");return ret;}ret = MYVideoPlay.VideoPlayer_SetDrawCallBack(port, drawCallBack);if (!ret){MessageBox.Show("设置绘图回调函数失败!");return ret;}ret = MYVideoPlay.VideoPlayer_OpenVideo(port, url, intPtr);if (!ret){MessageBox.Show("打开视频失败!");return ret;}ret = MYVideoPlay.VideoPlayer_StartPlay(port,false);if (!ret){MessageBox.Show("播放失败!");return ret;}//叠加时间 // ret = MYVideoPlay.VideoPlayer_SetDateTime(port, true, 0.01f, 0.01f,70);return ret;}/// <summary>/// 关闭视频/// </summary>/// <param name="port"></param>private bool CloseVideo(int port){return MYVideoPlay.VideoPlayer_CloseVideo(port);}/// <summary>/// 开始录制 帧率60/// </summary>/// <param name="port"></param>/// <param name="halfRate"></param>private bool StartRecord(int port,bool halfRate){bool ret = false;if(halfRate)ret = MYVideoPlay.VideoPlayer_SetRecordParameter(port, 60, 5, 60,1);elseret = MYVideoPlay.VideoPlayer_SetRecordParameter(port, 60, 5, 60, 0);string path = string.Format("d:\\video_{0}", port);ret = MYVideoPlay.VideoPlayer_StartRecord(port, path);if (!ret)MessageBox.Show("开启录制失败!");return ret;}/// <summary>/// 停止录制/// </summary>/// <param name="port"></param>private bool StopRecord(int port){bool ret = MYVideoPlay.VideoPlayer_StopRecord(port);return ret;}/// <summary>/// 截图/// </summary>/// <param name="port"></param>/// <returns></returns>private bool ShotImage(int port){bool ret = MYVideoPlay.VideoPlayer_ShotImage(port, "d:\\" + port.ToString(), MYVideoPlay.PictureFormat.JPEG);return ret;}int[] frameRates = new int[4];private void Form1_decodeCallBack(int nPort, IntPtr pBuf, int nSize, ref MYVideoPlay.FrameInfo pFrameInfo){frameRates[nPort] = pFrameInfo.frameRate;this.Invoke((Action)delegate{this.lbFPS1.Text = frameRates[0].ToString()+"fps";this.lbFPS2.Text = frameRates[1].ToString()+"fps";});}private void Form1_drawCallBack(int nPort, IntPtr hWnd, int width, int height){}#endregion/// <summary>/// 打开视频/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOpenVideo_Click(object sender, EventArgs e){Button btn = sender as Button;int n = int.Parse(btn.Tag.ToString());if (isOpened[n])return;string url="";IntPtr intPtr= IntPtr.Zero;switch (n){case 0: url = textBox1.Text;intPtr = pnlVideo1.Handle; break;case 1: url = textBox2.Text;intPtr = pnlVideo2.Handle; break;}Task task = new Task(() =>{//网络直播流(非相机流)时设置更大的buffer进行缓存,否则出现马赛克MYVideoPlay.VideoPlayer_SetDecodedBufferSize(n, 250);isOpened[n] = OpenVideo(n,url,intPtr);});task.Start();}/// <summary>/// 关闭视频/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnCloseVideo_Click(object sender, EventArgs e){Button btn = sender as Button;int n = int.Parse(btn.Tag.ToString());if (!isOpened[n])return;bool ret = CloseVideo(n);isOpened[n] = !ret;}/// <summary>/// 开始录制/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStartRecord_Click(object sender, EventArgs e){Button btn = sender as Button;int n = int.Parse(btn.Tag.ToString());if (isRecording[n] || !isOpened[n])return;if (n == 0)isRecording[n] = StartRecord(n, true);elseisRecording[n] = StartRecord(n, false);}/// <summary>/// 停止录制/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStopRecord_Click(object sender, EventArgs e){Button btn = sender as Button;int n = int.Parse(btn.Tag.ToString());if (!isRecording[n] || !isOpened[n])return;bool ret = StopRecord(n);isRecording[n] = !ret;}/// <summary>/// 截图/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnShotImage_Click(object sender, EventArgs e){Button btn = sender as Button;int n = int.Parse(btn.Tag.ToString());ShotImage(n);}/// <summary>/// 叠加字符测试/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Timer_Tick(object sender, EventArgs e){Random rd = new Random();bool ret = false;if (isOpened[PLAY_PORT1]){OSDParameters1[0].visible = OSDParameters1[1].visible = true;OSDParameters1[0].x = (float)rd.NextDouble();OSDParameters1[0].y = (float)rd.NextDouble();OSDParameters1[1].x = (float)rd.NextDouble();OSDParameters1[1].y = (float)rd.NextDouble();//ZYVideoPlay.VideoPlayer_SetAllOSDTexts(PLAY_PORT1, OSDParameters1);}if (isOpened[PLAY_PORT2]){OSDParameters2[0].visible = OSDParameters2[1].visible = true;OSDParameters2[0].x = (float)rd.NextDouble();OSDParameters2[0].y = (float)rd.NextDouble();OSDParameters2[1].x = (float)rd.NextDouble();OSDParameters2[1].y = (float)rd.NextDouble();// ret = ZYVideoPlay.VideoPlayer_SetAllOSDTexts(PLAY_PORT2, OSDParameters2);}}private void timer1_Tick(object sender, EventArgs e){if (isRecording[PLAY_PORT1]){if (DateTime.Now.Millisecond < 500)lbRec1.Visible = true;elselbRec1.Visible = false;}elselbRec1.Visible = false;if (isRecording[PLAY_PORT2]){if (DateTime.Now.Millisecond < 500)lbRec2.Visible = true;elselbRec2.Visible = false;}elselbRec2.Visible = false;}private void Form1_FormClosing(object sender, FormClosingEventArgs e){for(int i=0;i<2;i++){if (isOpened[i])CloseVideo(i);}}}
}
相关文章:

基于ffmpeg与SDL的视频播放库
由于工作需要,自己封装的基于ffmpeg的视频编解码库,显示采用了SDL库。可以播放本地文件或网络流,支持多端口播放,支持文字叠加,截图、视频录制等等。 头文件代码: #pragma once #ifdef __DLLEXPORT #defin…...

基于二进制草蝉优化算法选择特征并使用 KNN 进行训练(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 基于二进制草蝉优化算法选择特征并使用KNN(K-Nearest Neighbors,K最近邻算法)进行训练是一种…...

14-4_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP组播
文章目录 1. UDP组播的特性2. UDP 组播实例程序的功能3. 组播功能的程序实现4. 源码4.1 可视化UI设计4.2 mainwindow.h4.3 mainwindow.cpp 1. UDP组播的特性 下图简单表示了组播的原理。UDP 组播是主机之间“一对一组”的通信模式,当多个客户端加入由一个组播地址定…...

ai图片合成软件帮你创造个性绚丽
嘿!悄悄告诉你一个小秘密,现在有一款超酷的软件,它能让你的图片变得活灵活现,就像跳出了屏幕一样!没错,这就是ai图片制作软件!想象一下,你拍摄了一张美丽的风景照片,但总…...
git 版本回退
git 没有push之前,可以用git reset --mixed回退,就是把add 的内容和commit的内容都撤销 在push之后,你只有2种操作 1.git reset 退回到你想要的那个版本 有配置选项 如果是soft就是当前版本删掉,之前改的代码保留,ha…...
使用Jackson自定义序列化操作(Jackson – Custom Serializer)
目录 Standard Serialization of an Object GraphCustom Serializer on the ObjectMapperCustom Serializer on the Class Standard Serialization of an Object Graph Data NoArgsConstructor AllArgsConstructor public class Item {public int id;public String itemName;p…...
Python-元组
元组(Tuples)详解 在Python中,元组(Tuples)是一种有序的数据类型,它可以包含任意类型的元素,包括数字、字符串、列表等。与列表相似,元组也是用来存储一组数据,但与列表…...

快速转换PDF文件: Python和PyMuPDF教程
解决问题 有时候将文档上传Claude2做分析,有大小限制,所以需要切割pdf文档为几个小点的文档,故才有了本文章。 如何用Python和PyMuPDF制作你想要大小的PDF? PDF是一种广泛使用的文件格式,可以在任何设备上查看和打印…...

规划模型Matlab代码
文章目录 数学规划定义一般形式分类 1.线性规划(linear programming)2.非线性规划(nonlinear programming)3. 整数规划(integer programming)4. 0-1规划(0-1 programming)5. 最大最小化模型6. 多目标规划模型7.敏感性分析(对权重)[例题] 数学规划定义 数…...

用html+javascript打造公文一键排版系统11:改进单一附件说明排版
一、用htmljavascript打造公文一键排版系统10中的一个bug 在 用htmljavascript打造公文一键排版系统10:单一附件说明排版 中,我们对附件说明的排版函数是: function setAtttDescFmt(p) {var t p;var a ;if (-1 ! t.indexOf(:))//是半角冒…...

snap xxx has “install-snap“ change in progress
error description * 系重复安装,进程冲突 solution 展示snap的改变 然后sudo snap abort 22即可终止该进程 之后重新运行install command~~ PS: ubuntu有时候加载不出来,执行resolvectl flush-caches,清除dns缓存…...
Elasticsearch 性能调优指南
目录 1、通用优化策略 1.1 通用最小化法则 1.2 职责单一原则 1.3 其他 2、写性能调优 2.1 基本原则 2.2 优化手段 2.2.1 增加 flush 时间间隔, 2.2.2 增加refresh_interval的参数值 2.2.3 增加Buffer大小, 2.2.4 关闭副本 2.2.5 禁用swap 2…...
学习Boost一:学习方法和学习目的
学习目的 Boost 的学习目的: 因为从知乎和CSND上根据了解内容来看,Boost作为一个历史悠久的开源库,已经脱离了一个单纯的库的概念了,他因庞大的涉及面应当被称之为库集。 并且,因为boost库优秀的试用反馈和开发人员的…...

c语言每日一练(1)
前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...
iOS开发-CocoaLumberjack日志库实现Logger日志功能
iOS开发-Logger日志功能实现 在iOS开发中,常用CocoaLumberjack来作为日志功能实现的日志框架 一、CocoaLumberjack是什么? CocoaLumberjack 是 支持 iOS 和 Mac 平台的日志框架,使用简单,功能强大且不失灵活,它的主…...

深度学习(34)—— StarGAN(2)
深度学习(34)—— StarGAN(2) 完整项目在这里:欢迎造访 文章目录 深度学习(34)—— StarGAN(2)1. build model(1)generator(2&#…...
use lua
-- basic.lua print("hello ".."world") local a 1 --only this file can see b 2 -- global see -- not declare vaiable all asign to nil print(fuck) -- 字符串可以"" , ,[[]] -- 一些数值运算支持,进制数,科学数&a…...

网络——初识网络
网络基础 文章目录 网络基础计算机网络产生的背景认识网络协议网络协议初识协议分层OSI七层模型TCP/IP四层模型网络传输基本流程协议报头 认识IP地址认识MAC地址ifconfig查看主机地址ifconfig查看主机地址 计算机网络产生的背景 独立模式:计算机之间相互独立 早期的…...

调试技巧(2)
6. 如何写出好(易于调试)的代码 6.1 优秀的代码: 代码运行正常bug很少效率高可读性高可维护性高注释清晰文档齐全 常见的coding技巧: 使用assert尽量使用const养成良好的编码风格添加必要的注释避免编码的陷阱。 这里讲一下assert…...

骨传导耳机真不伤耳吗?骨传导耳机有什么好处?
骨传导耳机真不伤耳吗?骨传导耳机有什么好处? 我先来说说骨传导耳机的工作原理吧,骨传导是一种传声方式,声波通过颅骨、颌骨等头部骨头的振动,将声音传到内耳。其实骨传导的现象我们很常见,就像我们平时嗑瓜…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...