全網唯一/Qt結合ffmpeg實現手機端采集攝像頭推流到rtsp或rtmp/可切換前置后置攝像頭/指定分辨率幀率

一、前言說明

之前已經實現了Qt結合ffmpeg在安卓上運行,所有在win上的功能,在安卓上都已經實現,比如編碼保存到MP4文件,正常解碼音視頻文件播放等,唯獨還差一個功能,盡管用的不多,但是還是有一定需求的,那就是采集手機上的攝像頭。以前傻嗶嗶的以為和linux類似,去打開/dev/video0設備文件的方式去讀取,發現根本沒用,后面又懷疑過權限的問題,于是想盡了各種辦法把需要的權限全部加上了,還是沒用。后面通過閱讀ffmpeg的源碼,發現有個libavdevice/android_camera.c文件,看名字就知道,這就是采集安卓攝像頭的,意味著底層肯定是支持了,這下子信心大增,終于查到問題所在,原來是之前用的那個ffmpeg安卓庫,并沒有把avdevice模塊編譯進去,于是找到音視頻大佬王斌(QtAV/MDK的作者),讓他幫忙給編譯一個,替換后,果真可以了,前后拖了好幾年的疑難雜癥終于解決了。去樓下沙縣吃大餐必須加兩個蛋。

在查閱代碼過程中,發現ffmpeg模塊化設計的真的非常棒,盡管是C語言設計的框架,沒有C++的封裝集成多態特性,但是也實現了具體的不同的操作系統平臺對應不同的實現,尤其是avdevice模塊采集攝像頭這塊,在win上對應dshow.c,在linux上對應v4l2.c,在安卓上對應android_camera.c,做的非常好,然后在對應的具體代碼實現中可以找到對應的可以設置的鍵值,一般在代碼文件底部有個static const AVOption options[]存儲的,比如win和linux可以設置pixel_format,安卓是通過設置camera_index來實現前置后置攝像頭的選擇,安卓還可以設置input_queue_size來定義緩存幀隊列的大小。其實安卓上未必只有兩個攝像頭,有些開發板可能有四個設置更多,只要底層驅動支持就行,要打開哪個就設置camera_index即可。

能夠打開采集攝像頭后,其他的流程和之前的完全一樣,一行代碼都不用改,唯一就是增加了幾行代碼,用來設置camera_index,通過從url中取出來,比如video=0就是camera_index=0,編碼保存到MP4文件和編碼推流,都是全部通用的,唯一區別就是多了個旋轉角度,畢竟在手機上攝像頭是有旋轉角度的,一個是90度,一個是270度,采集后畫面必須按照這個角度旋轉才行,包括推流也是。

是不是所有安卓版本都支持,根據源碼文檔說明,要從api level 21也就是安卓5.0開始才支持,這個相信目前的設備肯定都能做到,幾乎沒有5以下的設備了,對ffmpeg版本有要求嗎?也有的,從ffmpeg4開始才有android_camera.c,盡管現在ffmpeg飆版本很厲害,目前看下來主流還是ffmpeg4版本用的多,從ffmpeg5.0開始到現在最新的ffmpeg8.0,內容沒有更新很多,版本號確加了很大,其實確切的說應該是ffmpeg4.6 4.7 4.8更合理一些。

二、效果圖

在這里插入圖片描述
在這里插入圖片描述

三、相關代碼

#include "ffmpegdevice.h"
#include "widgethead.h"QString FFmpegDevice::logType = QString();
QString FFmpegDevice::logFlag = QString();
QStringList FFmpegDevice::logResult = QStringList();void FFmpegDevice::logCallback(void *ptr, int level, const char *fmt, va_list vl)
{static QMutex mutex;QMutexLocker locker(&mutex);char buf[1024];vsprintf(buf, fmt, vl);QString line = buf;line = line.trimmed();line.replace("\r", "");line.replace("\n", "");line.replace("\"", "");//qDebug() << TIMEMS << line;//根據不同的類型解析不同的結果if (FFmpegDevice::logType == "list_devices") {FFmpegDevice::log_list_devices(line);} else if (FFmpegDevice::logType == "list_options") {FFmpegDevice::log_list_options(line);}
}void FFmpegDevice::log_list_devices(const QString &line)
{
#if (FFMPEG_VERSION_MAJOR < 5)//搞個標記記錄接下來是什么結果if (line.startsWith("DirectShow video devices")) {FFmpegDevice::logFlag = "video";} else if (line.startsWith("DirectShow audio devices")) {FFmpegDevice::logFlag = "audio";}//過濾一些不需要的結果if (line.startsWith("DirectShow") || line.startsWith("Alternative")) {return;}QString result = QString("%1|%2").arg(FFmpegDevice::logFlag).arg(line);if (!FFmpegDevice::logResult.contains(result)) {FFmpegDevice::logResult << result;}
#elseif (line.startsWith("(video") || line.startsWith("(audio")) {QString type = line.mid(1, line.length());QString result = QString("%1|%2").arg(type).arg(FFmpegDevice::logFlag);if (!FFmpegDevice::logResult.contains(result)) {FFmpegDevice::logResult << result;}} else {FFmpegDevice::logFlag = line;}
#endif
}void FFmpegDevice::log_list_options(const QString &line)
{//搞個標記記錄接下來是什么結果if (line.startsWith("vcodec=") || line.startsWith("pixel_format=")) {FFmpegDevice::logFlag = line;}if (line.startsWith("min s=") && !FFmpegDevice::logFlag.isEmpty()) {QString result = QString("%1 %2").arg(FFmpegDevice::logFlag).arg(line);if (!FFmpegDevice::logResult.contains(result)) {FFmpegDevice::logResult << result;}}//音頻設備參數if (line.contains("ch=")) {FFmpegDevice::logResult << line;}
}void FFmpegDevice::getInputDevices(bool video, QStringList &devices)
{QStringList names;//先用命令行獲取/ffmpeg5以上版本可以直接通過函數獲取
#if (FFMPEG_VERSION_MAJOR < 5)QStringList infos = FFmpegDevice::getInputDevices(video ? Device_Video : Device_Audio);foreach (QString info, infos) {QString name = info.split("|").last();if (video && info.startsWith("video")) {names << name;} else if (!video && info.startsWith("audio")) {names << name;}}
#endif//沒有獲取到再用函數獲取if (names.isEmpty()) {
#ifdef ffmpegdevicenames << FFmpegDevice::getInputDevices(video);
#endif}//去重復加入到集合//qDebug() << video << names;foreach (QString name, names) {if (!devices.contains(name)) {devices << name;}}
}//ffmpeg -f dshow -list_devices true -i dummy
QStringList FFmpegDevice::getInputDevices(const char *flag)
{FFmpegHelper::initLib();//啟用日志回調接收輸出信息av_log_set_callback(FFmpegDevice::logCallback);//設置相關參數以便記錄對應結果FFmpegDevice::logType = "list_devices";FFmpegDevice::logFlag.clear();FFmpegDevice::logResult.clear();AVFormatContext *ctx = avformat_alloc_context();AVInputFormatx *fmt = av_find_input_format(flag);AVDictionary *opts = NULL;av_dict_set(&opts, "list_devices", "true", 0);if (strcmp(flag, "vfwcap") == 0) {avformat_open_input(&ctx, "list", fmt, NULL);} else if (strcmp(flag, "dshow") == 0) {avformat_open_input(&ctx, "dummy", fmt, &opts);} else {avformat_open_input(&ctx, "", fmt, &opts);}//釋放資源av_dict_free(&opts);avformat_close_input(&ctx);//重新設置日志回調以便恢復原樣av_log_set_callback(av_log_default_callback);//取出日志結果return FFmpegDevice::logResult;
}QStringList FFmpegDevice::getDeviceOption(const QString &url)
{const char *flag = (url.startsWith("video=") ? Device_Video : Device_Audio);QString device = url;
#ifndef Q_OS_WINdevice.replace("video=", "");device.replace("audio=", "");
#endifreturn FFmpegDevice::getDeviceOption(flag, device);
}//ffmpeg -f dshow -list_options true -i video="Webcam"
QStringList FFmpegDevice::getDeviceOption(const char *flag, const QString &device)
{FFmpegHelper::initLib();//啟用日志回調接收輸出信息av_log_set_callback(FFmpegDevice::logCallback);//設置相關參數以便記錄對應結果FFmpegDevice::logType = "list_options";FFmpegDevice::logFlag.clear();FFmpegDevice::logResult.clear();AVFormatContext *ctx = avformat_alloc_context();AVInputFormatx *fmt = av_find_input_format(flag);AVDictionary *opts = NULL;av_dict_set(&opts, "list_options", "true", 0);avformat_open_input(&ctx, device.toUtf8().constData(), fmt, &opts);//釋放資源av_dict_free(&opts);avformat_close_input(&ctx);//重新設置日志回調以便恢復原樣av_log_set_callback(av_log_default_callback);//取出日志結果return FFmpegDevice::logResult;
}#ifdef ffmpegdevice
QStringList FFmpegDevice::getInputDevices(bool video)
{FFmpegHelper::initLib();//測試發現在windows上要ffmpeg5開始才能獲取到值/以前的版本內部沒有實現/linux上ffmpeg4也支持QStringList names;AVDeviceInfoList *devices = NULL;AVInputFormatx *fmt = NULL;fmt = av_find_input_format(video ? Device_Video : Device_Audio);if (fmt) {//下面這行代碼在部分環境中執行會崩潰/ffmpeg內部錯誤導致
#ifndef __arm__if (avdevice_list_input_sources(fmt, NULL, NULL, &devices) >= 0) {names = getDeviceNames(devices, video);}
#endif}return names;
}QStringList FFmpegDevice::getDeviceNames(bool input, bool video)
{FFmpegHelper::initLib();QStringList names;AVDeviceInfoList *devices = NULL;if (input) {AVInputFormatx *fmt = NULL;do {names.clear();fmt = (video ? av_input_video_device_next(fmt) : av_input_audio_device_next(fmt));if (fmt) {if (avdevice_list_input_sources(fmt, NULL, NULL, &devices) >= 0) {names = getDeviceNames(devices, video);}//qDebug() << "input" << fmt->name << names;}} while (fmt);} else {AVOutputFormatx *fmt = NULL;do {names.clear();fmt = (video ? av_output_video_device_next(fmt) : av_output_audio_device_next(fmt));if (fmt) {if (avdevice_list_output_sinks(fmt, NULL, NULL, &devices) >= 0) {names = getDeviceNames(devices, video);}//qDebug() << "output" << fmt->name << names;}} while (fmt);}return names;
}QStringList FFmpegDevice::getDeviceNames(AVDeviceInfoList *devices, bool video)
{QStringList names;int count = devices->nb_devices;for (int i = 0; i < count; ++i) {AVDeviceInfo *device = devices->devices[i];
#if (FFMPEG_VERSION_MAJOR > 4)if (device->nb_media_types > 0) {AVMediaType type = *device->media_types;if ((video && type != AVMEDIA_TYPE_VIDEO) || (!video && type != AVMEDIA_TYPE_AUDIO)) {continue;}}
#endif//在win上設備名傳描述符/linux是設備名
#ifdef Q_OS_WINnames << device->device_description;
#elsenames << device->device_name;
#endif}//釋放設備列表avdevice_free_list_devices(&devices);return names;
}
#endif

四、相關地址

  1. 國內站點:https://gitee.com/feiyangqingyun
  2. 國際站點:https://github.com/feiyangqingyun
  3. 個人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_demo。

五、功能特點

5.1 基礎功能

  1. 支持各種音頻視頻文件格式,比如mp3、wav、mp4、asf、rm、rmvb、mkv等。
  2. 支持本地攝像頭設備和本地桌面采集,支持多設備和多屏幕。
  3. 支持各種視頻流格式,比如rtp、rtsp、rtmp、http、udp等。
  4. 本地音視頻文件和網絡音視頻文件,自動識別文件長度、播放進度、音量大小、靜音狀態等。
  5. 文件可以指定播放位置、調節音量大小、設置靜音狀態等。
  6. 支持倍速播放文件,可選0.5倍、1.0倍、2.5倍、5.0倍等速度,相當于慢放和快放。
  7. 支持開始播放、停止播放、暫停播放、繼續播放。
  8. 支持抓拍截圖,可指定文件路徑,可選抓拍完成是否自動顯示預覽。
  9. 支持錄像存儲,手動開始錄像、停止錄像,部分內核支持暫停錄像后繼續錄像,跳過不需要錄像的部分。
  10. 支持無感知切換循環播放、自動重連等機制。
  11. 提供播放成功、播放完成、收到解碼圖片、收到抓拍圖片、視頻尺寸變化、錄像狀態變化等信號。
  12. 多線程處理,一個解碼一個線程,不卡主界面。

5.2 特色功能

  1. 同時支持多種解碼內核,包括qmedia內核(Qt4/Qt5/Qt6)、ffmpeg內核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc內核(vlc2/vlc3)、mpv內核(mpv1/mp2)、mdk內核、海康sdk、easyplayer內核等。
  2. 非常完善的多重基類設計,新增一種解碼內核只需要實現極少的代碼量,就可以應用整套機制,極易拓展。
  3. 同時支持多種畫面顯示策略,自動調整(原始分辨率小于顯示控件尺寸則按照原始分辨率大小顯示,否則等比縮放)、等比縮放(永遠等比縮放)、拉伸填充(永遠拉伸填充)。所有內核和所有視頻顯示模式下都支持三種畫面顯示策略。
  4. 同時支持多種視頻顯示模式,句柄模式(傳入控件句柄交給對方繪制控制)、繪制模式(回調拿到數據后轉成QImage用QPainter繪制)、GPU模式(回調拿到數據后轉成yuv用QOpenglWidget繪制)。
  5. 支持多種硬件加速類型,ffmpeg可選dxva2、d3d11va等,vlc可選any、dxva2、d3d11va,mpv可選auto、dxva2、d3d11va,mdk可選dxva2、d3d11va、cuda、mft等。不同的系統環境有不同的類型選擇,比如linux系統有vaapi、vdpau,macos系統有videotoolbox。
  6. 解碼線程和顯示窗體分離,可指定任意解碼內核掛載到任意顯示窗體,動態切換。
  7. 支持共享解碼線程,默認開啟并且自動處理,當識別到相同的視頻地址,共享一個解碼線程,在網絡視頻環境中可以大大節約網絡流量以及對方設備的推流壓力。國內頂尖視頻廠商均采用此策略。這樣只要拉一路視頻流就可以共享到幾十個幾百個通道展示。
  8. 自動識別視頻旋轉角度并繪制,比如手機上拍攝的視頻一般是旋轉了90度的,播放的時候要自動旋轉處理,不然默認是倒著的。
  9. 自動識別視頻流播放過程中分辨率的變化,在視頻控件上自動調整尺寸。比如攝像機可以在使用過程中動態配置分辨率,當分辨率改動后對應視頻控件也要做出同步反應。
  10. 音視頻文件無感知自動切換循環播放,不會出現切換期間黑屏等肉眼可見的切換痕跡。
  11. 視頻控件同時支持任意解碼內核、任意畫面顯示策略、任意視頻顯示模式。
  12. 視頻控件懸浮條同時支持句柄、繪制、GPU三種模式,非絕對坐標移來移去。
  13. 本地攝像頭設備支持指定設備名稱、分辨率、幀率進行播放。
  14. 本地桌面采集支持設定采集區域、偏移值、指定桌面索引、幀率、多個桌面同時采集等。還支持指定窗口標題采集固定窗口。
  15. 錄像文件同時支持打開的視頻文件、本地攝像頭、本地桌面、網絡視頻流等。
  16. 瞬間響應打開和關閉,無論是打開不存在的視頻或者網絡流,探測設備是否存在,讀取中的超時等待,收到關閉指令立即中斷之前的操作并響應。
  17. 支持打開各種圖片文件,支持本地音視頻文件拖曳播放。
  18. 視頻流通信方式可選tcp/udp,有些設備可能只提供了某一種協議通信比如tcp,需要指定該種協議方式打開。
  19. 可設置連接超時時間(視頻流探測用的超時時間)、讀取超時時間(采集過程中的超時時間)。
  20. 支持逐幀播放,提供上一幀/下一幀函數接口,可以逐幀查閱采集到的圖像。
  21. 音頻文件自動提取專輯信息比如標題、藝術家、專輯、專輯封面,自動顯示專輯封面。
  22. 視頻響應極低延遲0.2s左右,極速響應打開視頻流0.5s左右,專門做了優化處理。
  23. 支持H264/H265編碼(現在越來越多的監控攝像頭是H265視頻流格式)生成視頻文件,內部自動識別切換編碼格式。
  24. 支持用戶信息中包含特殊字符(比如用戶信息中包含+#@等字符)的視頻流播放,內置解析轉義處理。
  25. 支持濾鏡,各種水印及圖形效果,支持多個水印和圖像,可以將OSD標簽信息和各種圖形信息寫入到MP4文件。
  26. 支持視頻流中的各種音頻格式,AAC、PCM、G.726、G.711A、G.711Mu、G.711ulaw、G.711alaw、MP2L2等都支持,推薦選擇AAC兼容性跨平臺性最好。
  27. 內核ffmpeg采用純qt+ffmpeg解碼,非sdl等第三方繪制播放依賴,gpu繪制采用qopenglwidget,音頻播放采用qaudiooutput。
  28. 內核ffmpeg和內核mdk支持安卓,其中mdk支持安卓硬解碼,性能非常兇殘。
  29. 可以切換音視頻軌道,也就是節目通道,可能ts文件帶了多個音視頻節目流,可以分別設置要播放哪一個,可以播放前設置好和播放過程中動態設置。
  30. 可以設置視頻旋轉角度,可以播放前設置好和播放過程中動態改變。
  31. 視頻控件懸浮條自帶開始和停止錄像切換、聲音靜音切換、抓拍截圖、關閉視頻等功能。
  32. 音頻組件支持聲音波形值數據解析,可以根據該值繪制波形曲線和柱狀聲音條,默認提供了聲音振幅信號。
  33. 標簽和圖形信息支持三種繪制方式,繪制到遮罩層、繪制到圖片、源頭繪制(對應信息可以存儲到文件)。
  34. 通過傳入一個url地址,該地址可以帶上通信協議、分辨率、幀率等信息,無需其他設置。
  35. 保存視頻到文件支持三種策略,自動處理、僅限文件、全部轉碼,轉碼策略支持自動識別、轉264、轉265,編碼保存支持指定分辨率縮放或者等比例縮放。比如對保存文件體積有要求可以指定縮放后再存儲。
  36. 支持加密保存文件和解密播放文件,可以指定秘鑰文本。
  37. 提供的監控布局類支持64通道同時顯示,還支持各種異型布局,比如13通道,手機上6行2列布局。各種布局可以自由定義。
  38. 支持電子放大,在懸浮條切換到電子放大模式,在畫面上選擇需要放大的區域,選取完畢后自動放大,再次切換放大模式可以復位。
  39. 各組件中極其詳細的打印信息提示,尤其是報錯信息提示,封裝的統一打印格式。針對現場復雜的設備環境測試極其方便有用,相當于精確定位到具體哪個通道哪個步驟出錯。
  40. 同時提供了簡單示例、視頻播放器、多畫面視頻監控、監控回放、逐幀播放、多屏渲染等單獨窗體示例,專門演示對應功能如何使用。
  41. 監控回放可選不同廠家類型、回放時間段、用戶信息、指定通道。支持切換回放進度。
  42. 可以從聲卡設備下拉框選擇聲卡播放聲音,提供對應的切換聲卡函數接口。
  43. 支持編譯到手機app使用,提供了專門的手機app布局界面,可以作為手機上的視頻監控使用。
  44. 代碼框架和結構優化到最優,性能強悍,注釋詳細,持續迭代更新升級。
  45. 源碼支持windows、linux、mac、android等,支持各種國產linux系統,包括但不限于統信UOS/中標麒麟/銀河麒麟等。還支持嵌入式linux。
  46. 源碼支持Qt4、Qt5、Qt6,兼容所有版本。

5.3 視頻控件

  1. 可動態添加任意多個osd標簽信息,標簽信息包括名字、是否可見、字號大小、文本文字、文本顏色、背景顏色、標簽圖片、標簽坐標、標簽格式(文本、日期、時間、日期時間、圖片)、標簽位置(左上角、左下角、右上角、右下角、居中、自定義坐標)。
  2. 可動態添加任意多個圖形信息,比如人工智能算法解析后的圖形區域信息直接發給視頻控件即可。圖形信息支持任意形狀,直接繪制在原始圖片上,采用絕對坐標。
  3. 圖形信息包括名字、邊框大小、邊框顏色、背景顏色、矩形區域、路徑集合、點坐標集合等。
  4. 每個圖形信息都可指定三種區域中的一種或者多種,指定了的都會繪制。
  5. 內置懸浮條控件,懸浮條位置支持頂部、底部、左側、右側。
  6. 懸浮條控件參數包括邊距、間距、背景透明度、背景顏色、文本顏色、按下顏色、位置、按鈕圖標代碼集合、按鈕名稱標識集合、按鈕提示信息集合。
  7. 懸浮條控件一排工具按鈕可自定義,通過結構體參數設置,圖標可選圖形字體還是自定義圖片。
  8. 懸浮條按鈕內部實現了錄像切換、抓拍截圖、靜音切換、關閉視頻等功能,也可以自行在源碼中增加自己對應的功能。
  9. 懸浮條按鈕對應實現了功能的按鈕,有對應圖標切換處理,比如錄像按鈕按下后會切換到正在錄像中的圖標,聲音按鈕切換后變成靜音圖標,再次切換還原。
  10. 懸浮條按鈕單擊后都用名稱唯一標識作為信號發出,可以自行關聯響應處理。
  11. 懸浮條空白區域可以顯示提示信息,默認顯示當前視頻分辨率大小,可以增加幀率、碼流大小等信息。
  12. 視頻控件參數包括邊框大小、邊框顏色、焦點顏色、背景顏色(默認透明)、文字顏色(默認全局文字顏色)、填充顏色(視頻外的空白處填充黑色)、背景文字、背景圖片(如果設置了圖片優先取圖片)、是否拷貝圖片、縮放顯示模式(自動調整、等比縮放、拉伸填充)、視頻顯示模式(句柄、繪制、GPU)、啟用懸浮條、懸浮條尺寸(橫向為高度、縱向為寬度)、懸浮條位置(頂部、底部、左側、右側)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913103.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Install Ubuntu 24.04 System

1.制作安裝鏡像盤&#xff08;U盤&#xff09; 下載rufus制作工具(網址&#xff1a;https://www.xiaomoxz.com/nexus/bi1/rufus4.shtml?bd_vid8643969197265870719&#xff09; 2. 設置U盤啟動&#xff1a; F2進入BIOS 3. Install Ubuntu 24.04 Ubuntu下載地址&#xff1a;…

solidjs 處理復雜類型的響應式

solidjs 處理復雜類型的響應式 在 solidjs 里響應式一般直接用 createSignal 就可以&#xff0c;但 createSignal 一般用于基礎數據類型。 雖然復雜類型也是可以使用&#xff0c;但基于起細粒度響應性的特性。 一般復雜的數據使用 createSignal 就不是那么友好了。 所以 cre…

爬蟲技術-獲取瀏覽器身份認證信息(如 Cookie、Token、Session 等)

方法一&#xff1a;通過瀏覽器開發者工具查看和提取 Cookie / Token &#x1f4cc; 示例場景&#xff1a; 你在使用一個網站時已經登錄了&#xff0c;想看看這個網站是如何保存你的身份憑證的。 &#x1f527; 操作過程&#xff1a; 打開瀏覽器&#xff08;例如 Chrome&#xf…

[密碼學實戰]GMT 0136-2024《密碼應用HTTP接口規范》解析

[密碼學實戰]GM/T 0136-2024《密碼應用HTTP接口規范》解析國家密碼管理局于2025年7月1日正式實施GM/T 0136-2024標準&#xff0c;該規范首次統一了密碼服務的HTTP接口設計&#xff0c;為國產密碼技術的規模化應用鋪平道路。本文結合標準原文&#xff0c;深入剖析其技術細節并給…

Docker 國內鏡像列表(免費長期)

Docker 可用鏡像源列表&#xff08;7月1日更新-長期維護&#xff09;_dockerhub國內鏡像源列表-CSDN博客

BlenderFBXExporter 導出fbx被修改問題

1&#xff09; 解決增加A節點的問題 https://github.com/A-Ribeiro/CustomBlenderFBXExporter 2&#xff09;找出blendshape 不一致&#xff0c;生成blendshape key name映射map 文件compare.txt C:\Users\49938\Documents\DazToUnreal\zhang01\UpdatedFBX\zhang01_fix7.fbx…

AI時代下的IT服務管理轉型:趨勢、挑戰與破局之道

近年來&#xff0c;人工智能&#xff08;AI&#xff09;與自動化技術的迅猛發展&#xff0c;正以前所未有的速度重塑企業運營的各個層面。特別是在IT服務管理&#xff08;ITSM&#xff09;領域&#xff0c;AI的介入不僅提高了問題響應效率&#xff0c;也推動了組織從“被動響應…

三體融合實戰:Django+訊飛星火+Colossal-AI的企業級AI系統架構

目錄 技術棧關鍵詞&#xff1a;Django 5.0 訊飛星火4.0Ultra Colossal-AI 1.2 WebSocket 聯邦學習 ? 核心架構設計 &#x1f6e0;? 一、Django深度集成訊飛星火API&#xff08;免費版&#xff09; 1. 獲取API憑證 2. 流式通信改造&#xff08;解決高并發阻塞&#xff09…

多模態數據融合預警:從IoT傳感器到衛星監測的可視化方案升級

你有沒有想過&#xff0c;為什么有些城市在暴雨來臨時能提前數小時發布內澇預警&#xff0c;而有些地方卻只能“等水來了才反應”&#xff1f; 背后的關鍵&#xff0c;就是多模態數據融合預警系統——它把來自IoT傳感器、無人機、地面雷達、氣象站、甚至衛星的數據整合在一起&a…

面試八股---css

2、css 2.1 說說你對盒子模型的理解 是什么 當對一個文檔進行布局&#xff08;layout&#xff09;的時候&#xff0c;瀏覽器的渲染引擎會根據標準之一的 CSS 基礎框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;將所有元素表示為一個個矩形的盒子&#xf…

day52-硬件學習之RTC及ADC

一、RTCRTC&#xff08;實時時鐘&#xff09;&#xff1a;非易失性在IMX6ULL內部SNVS&#xff08;安全的非易失性存儲器&#xff09;提供RTC功能&#xff1b;原理圖&#xff1a;二、ADC 2.1 基本概念ADC(模擬數字轉換器)&#xff1a;用于將連續變化的模擬信號轉換為離散的數字信…

Web 項目如何自動化測試?

Web 項目的自動化測試可以通過 UI自動化 和 接口自動化 結合實現&#xff0c;提高測試效率和覆蓋率。以下是關鍵方法和工具&#xff1a; 【自動化測試】從基礎到實戰基于Pytest自動化/python自動化的詳細教程&#xff01;1. UI自動化測試&#xff08;前端交互&#xff09; 適用…

Java連接阿里云MaxCompute例

要使用Java連接阿里云MaxCompute&#xff08;原名ODPS&#xff09;數據庫&#xff0c;您可以遵循以下步驟進行配置和編程&#xff1a; 1. 添加依賴 確保您的項目中包含了MaxCompute JDBC驅動的依賴。如果您使用Maven&#xff0c;可以在pom.xml中添加如下依賴&#xff1a; &l…

【網絡與系統安全】強制訪問控制——BLP模型

一、模型背景與定義 BLP&#xff08;Bell-LaPadula&#xff09;模型是由David Bell和Len Adula在1973年提出的強制訪問控制&#xff08;MAC&#xff09;模型&#xff0c;是最早的計算機安全模型之一&#xff0c;主要用于解決多用戶系統中的信息機密性保護問題&#xff0c;尤其…

HTTPS詳解:原理 + 加解密過程 + 面試問答

一、HTTP 與 HTTPS 的區別 項目HTTPHTTPS全稱HyperText Transfer ProtocolHyperText Transfer Protocol Secure端口80443協議層應用層應用層 TLS&#xff08;安全層&#xff09;加密方式明文傳輸加密傳輸&#xff08;TLS&#xff09;安全性易被劫持、中間人攻擊可加密、防篡改…

Python-GUI-wxPython-控件

1 需求 2 接口 3.* 控件&#xff1a;wx.StaticText import wxclass MainFrame(wx.Frame):def __init__(self, *args, **kwargs):super(MainFrame, self).__init__(*args, **kwargs)self.init_ui()self.Center()self.Maximize()def init_ui(self):static_text wx.StaticText(pa…

3-1 PID算法改進(積分部分)

目錄 1、積分限幅 2、積分分離 3、變速積分 在位置式PID的基礎上進行改進 定速用PI控制&#xff0c;定位置用PD控制 1、積分限幅 在定速控制上體現 第一種方法確定上下限方法&#xff1a;Out最大時&#xff0c;除以Ki&#xff0c;得到一個值&#xff0c;上限不能超過這個…

Linux探秘坊-------13.進程間通信

1.進程間通信?的 2.管道 2.1 匿名管道 -----通常用來實現 父子通信 創建子進程時&#xff0c;需要把父進程的進程內容全部拷貝一份&#xff0c;但文件管理是不需要拷貝的 但是我們把父進程的文件描述符表給拷貝下來了&#xff0c;文件描述符表里是一堆指針&#xff0c;他們仍…

深入理解Vapnik-Chervonenkis(VC)維度:機器學習泛化能力的理論基礎

引言 通過本篇閱讀,從理論上去理解為什么: 要選擇復雜度低的模型 過擬合的時候,增加樣本量有用 以及如何根據樣本量選擇特征個數 PAC機器學習框架, VC 維是機器學習最重要的基礎理論之一 在機器學習領域&#xff0c;模型泛化能力是衡量算法性能的核心指標…

redis持久化-純緩存模式

redis持久化-純緩存模式 文檔 redis單機安裝redis常用的五種數據類型redis數據類型-位圖bitmapredis數據類型-基數統計HyperLogLogredis數據類型-地理空間GEOredis數據類型-流Streamredis數據類型-位域bitfieldredis持久化-RDBredis持久化-AOFredis持久化-RDBAOF混合模式 官…