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

android c++ 硬编码硬解码官方demo

参考:

https://fossies.org/linux/opencv/modules/videoio/src/cap_android_mediandk.cpp

代码: 

 // This file is part of OpenCV project.// It is subject to the license terms in the LICENSE file found in the top-level directory// of this distribution and at http://opencv.org/license.html#include "precomp.hpp"#include <stdio.h>#include <string.h>#include <fstream>#include <iostream>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <android/log.h>#include <android/native_window.h>#include "media/NdkMediaCodec.h"#include "media/NdkMediaMuxer.h"#include "media/NdkMediaExtractor.h"#include "media/NdkMediaFormat.h"#define INPUT_TIMEOUT_MS 2000#define COLOR_FormatYUV420Planar 19#define COLOR_FormatYUV420SemiPlanar 21#define COLOR_FormatSurface 0x7f000789 //See https://developer.android.com/reference/android/media/MediaCodecInfo.CodecCapabilities for codesusing namespace cv;#define TAG "NativeCodec"#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)static inline void deleter_AMediaExtractor(AMediaExtractor *extractor) {AMediaExtractor_delete(extractor);}static inline void deleter_AMediaCodec(AMediaCodec *codec) {AMediaCodec_stop(codec);AMediaCodec_delete(codec);}static inline void deleter_AMediaFormat(AMediaFormat *format) {AMediaFormat_delete(format);}class AndroidMediaNdkCapture : public IVideoCapture{public:AndroidMediaNdkCapture():sawInputEOS(false), sawOutputEOS(false),frameStride(0), frameWidth(0), frameHeight(0), colorFormat(0),videoWidth(0), videoHeight(0),videoFrameCount(0),videoRotation(0), videoRotationCode(-1),videoOrientationAuto(false) {}std::shared_ptr<AMediaExtractor> mediaExtractor;std::shared_ptr<AMediaCodec> mediaCodec;bool sawInputEOS;bool sawOutputEOS;int32_t frameStride;int32_t frameWidth;int32_t frameHeight;int32_t colorFormat;int32_t videoWidth;int32_t videoHeight;float videoFrameRate;int32_t videoFrameCount;int32_t videoRotation;int32_t videoRotationCode;bool videoOrientationAuto;std::vector<uint8_t> buffer;Mat frame;~AndroidMediaNdkCapture() { cleanUp(); }bool decodeFrame() {while (!sawInputEOS || !sawOutputEOS) {if (!sawInputEOS) {auto bufferIndex = AMediaCodec_dequeueInputBuffer(mediaCodec.get(), INPUT_TIMEOUT_MS);LOGV("input buffer %zd", bufferIndex);if (bufferIndex >= 0) {size_t bufferSize;auto inputBuffer = AMediaCodec_getInputBuffer(mediaCodec.get(), bufferIndex, &bufferSize);auto sampleSize = AMediaExtractor_readSampleData(mediaExtractor.get(), inputBuffer, bufferSize);if (sampleSize < 0) {sampleSize = 0;sawInputEOS = true;LOGV("EOS");}auto presentationTimeUs = AMediaExtractor_getSampleTime(mediaExtractor.get());AMediaCodec_queueInputBuffer(mediaCodec.get(), bufferIndex, 0, sampleSize,presentationTimeUs, sawInputEOS ? AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM : 0);AMediaExtractor_advance(mediaExtractor.get());}}if (!sawOutputEOS) {AMediaCodecBufferInfo info;auto bufferIndex = AMediaCodec_dequeueOutputBuffer(mediaCodec.get(), &info, 0);if (bufferIndex >= 0) {size_t bufferSize = 0;auto mediaFormat = std::shared_ptr<AMediaFormat>(AMediaCodec_getOutputFormat(mediaCodec.get()), deleter_AMediaFormat);AMediaFormat_getInt32(mediaFormat.get(), AMEDIAFORMAT_KEY_WIDTH, &frameWidth);AMediaFormat_getInt32(mediaFormat.get(), AMEDIAFORMAT_KEY_STRIDE, &frameStride);AMediaFormat_getInt32(mediaFormat.get(), AMEDIAFORMAT_KEY_HEIGHT, &frameHeight);AMediaFormat_getInt32(mediaFormat.get(), AMEDIAFORMAT_KEY_COLOR_FORMAT, &colorFormat);uint8_t* codecBuffer = AMediaCodec_getOutputBuffer(mediaCodec.get(), bufferIndex, &bufferSize);buffer = std::vector<uint8_t>(codecBuffer, codecBuffer + bufferSize);LOGV("colorFormat: %d", colorFormat);LOGV("buffer size: %zu", bufferSize);LOGV("width (frame): %d", frameWidth);LOGV("stride (frame): %d", frameStride);LOGV("height (frame): %d", frameHeight);if (info.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM){LOGV("output EOS");sawOutputEOS = true;}AMediaCodec_releaseOutputBuffer(mediaCodec.get(), bufferIndex, info.size != 0);return true;} else if (bufferIndex == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {LOGV("output buffers changed");} else if (bufferIndex == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED) {auto format = AMediaCodec_getOutputFormat(mediaCodec.get());LOGV("format changed to: %s", AMediaFormat_toString(format));AMediaFormat_delete(format);} else if (bufferIndex == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {LOGV("no output buffer right now");} else {LOGV("unexpected info code: %zd", bufferIndex);}}}return false;}bool isOpened() const CV_OVERRIDE { return mediaCodec.get() != nullptr; }int getCaptureDomain() CV_OVERRIDE { return CAP_ANDROID; }bool grabFrame() CV_OVERRIDE{// clear the previous framebuffer.clear();return decodeFrame();}bool retrieveFrame(int, OutputArray out) CV_OVERRIDE{if (buffer.empty()) {return false;}Mat yuv(frameHeight + frameHeight/2, frameStride, CV_8UC1, buffer.data());if (colorFormat == COLOR_FormatYUV420Planar) {cv::cvtColor(yuv, frame, cv::COLOR_YUV2BGR_YV12);} else if (colorFormat == COLOR_FormatYUV420SemiPlanar) {cv::cvtColor(yuv, frame, cv::COLOR_YUV2BGR_NV21);} else {LOGE("Unsupported video format: %d", colorFormat);return false;}Mat croppedFrame = frame(Rect(0, 0, videoWidth, videoHeight));out.assign(croppedFrame);if (videoOrientationAuto && -1 != videoRotationCode) {cv::rotate(out, out, videoRotationCode);}return true;}double getProperty(int property_id) const CV_OVERRIDE{switch (property_id){case CV_CAP_PROP_FRAME_WIDTH:return (( videoOrientationAuto &&(cv::ROTATE_90_CLOCKWISE == videoRotationCode || cv::ROTATE_90_COUNTERCLOCKWISE == videoRotationCode))? videoHeight : videoWidth);case CV_CAP_PROP_FRAME_HEIGHT:return (( videoOrientationAuto &&(cv::ROTATE_90_CLOCKWISE == videoRotationCode || cv::ROTATE_90_COUNTERCLOCKWISE == videoRotationCode))? videoWidth : videoHeight);case CV_CAP_PROP_FPS: return videoFrameRate;case CV_CAP_PROP_FRAME_COUNT: return videoFrameCount;case CAP_PROP_ORIENTATION_META: return videoRotation;case CAP_PROP_ORIENTATION_AUTO: return videoOrientationAuto ? 1 : 0;}return 0;}bool setProperty(int property_id, double value) CV_OVERRIDE{switch (property_id){case CAP_PROP_ORIENTATION_AUTO: {videoOrientationAuto = value != 0 ? true : false;return true;}}return false;}bool initCapture(const char * filename){struct stat statBuffer;if (stat(filename, &statBuffer) != 0) {LOGE("failed to stat file: %s (%s)", filename, strerror(errno));return false;}int fd = open(filename, O_RDONLY);if (fd < 0) {LOGE("failed to open file: %s %d (%s)", filename, fd, strerror(errno));return false;}mediaExtractor = std::shared_ptr<AMediaExtractor>(AMediaExtractor_new(), deleter_AMediaExtractor);if (!mediaExtractor) {return false;}media_status_t err = AMediaExtractor_setDataSourceFd(mediaExtractor.get(), fd, 0, statBuffer.st_size);close(fd);if (err != AMEDIA_OK) {LOGV("setDataSource error: %d", err);return false;}int numtracks = AMediaExtractor_getTrackCount(mediaExtractor.get());LOGV("input has %d tracks", numtracks);for (int i = 0; i < numtracks; i++) {auto format = std::shared_ptr<AMediaFormat>(AMediaExtractor_getTrackFormat(mediaExtractor.get(), i), deleter_AMediaFormat);if (!format) {continue;}const char *s = AMediaFormat_toString(format.get());LOGV("track %d format: %s", i, s);const char *mime;if (!AMediaFormat_getString(format.get(), AMEDIAFORMAT_KEY_MIME, &mime)) {LOGV("no mime type");} else if (!strncmp(mime, "video/", 6)) {int32_t trackWidth, trackHeight, fps, frameCount = 0, rotation = 0;AMediaFormat_getInt32(format.get(), AMEDIAFORMAT_KEY_WIDTH, &trackWidth);AMediaFormat_getInt32(format.get(), AMEDIAFORMAT_KEY_HEIGHT, &trackHeight);AMediaFormat_getInt32(format.get(), AMEDIAFORMAT_KEY_FRAME_RATE, &fps);#if __ANDROID_API__ >= 28AMediaFormat_getInt32(format.get(), AMEDIAFORMAT_KEY_ROTATION, &rotation);LOGV("rotation (track): %d", rotation);#endif#if __ANDROID_API__ >= 29AMediaFormat_getInt32(format.get(), AMEDIAFORMAT_KEY_FRAME_COUNT, &frameCount);#endifLOGV("width (track): %d", trackWidth);LOGV("height (track): %d", trackHeight);if (AMediaExtractor_selectTrack(mediaExtractor.get(), i) != AMEDIA_OK) {continue;}mediaCodec = std::shared_ptr<AMediaCodec>(AMediaCodec_createDecoderByType(mime), deleter_AMediaCodec);if (!mediaCodec) {continue;}if (AMediaCodec_configure(mediaCodec.get(), format.get(), NULL, NULL, 0) != AMEDIA_OK) {continue;}sawInputEOS = false;sawOutputEOS = false;if (AMediaCodec_start(mediaCodec.get()) != AMEDIA_OK) {continue;}videoWidth = trackWidth;videoHeight = trackHeight;videoFrameRate = fps;videoFrameCount = frameCount;videoRotation = rotation;switch(videoRotation) {case 90:videoRotationCode = cv::ROTATE_90_CLOCKWISE;break;case 180:videoRotationCode = cv::ROTATE_180;break;case 270:videoRotationCode = cv::ROTATE_90_COUNTERCLOCKWISE;break;default:videoRotationCode = -1;break;}return true;}}return false;}void cleanUp() {sawInputEOS = true;sawOutputEOS = true;frameStride = 0;frameWidth = 0;frameHeight = 0;colorFormat = 0;videoWidth = 0;videoHeight = 0;videoFrameRate = 0;videoFrameCount = 0;videoRotation = 0;videoRotationCode = -1;}};class AndroidMediaNdkVideoWriter CV_FINAL :public cv::IVideoWriter{typedef struct {int fourcc;const char* mime;OutputFormat muxerFormat;}FourCCInfo;static const int64_t TIMEOUT = 1000L;static const FourCCInfo FOURCC_INFO[];static const FourCCInfo* findInfo(int fourcc) {for( const FourCCInfo *it = FOURCC_INFO; NULL != it->mime; it++ ) {if (fourcc == it->fourcc) return it;}return NULL;}AMediaFormat* format;AMediaCodec* encoder;AMediaMuxer* muxer;#if __ANDROID_API__ >= 26ANativeWindow* surface;#endiflong frameIndex;int width;int height;double frameRate;ssize_t videoTrackIndex;int fd;void drainEncoder(bool end) {if (end) {#if __ANDROID_API__ >= 26AMediaCodec_signalEndOfInputStream(encoder);#elsewriteBytes(NULL, 0);#endif}AMediaCodecBufferInfo bufferInfo;ssize_t bufferIndex;size_t  bufferSize;uint8_t *buffer;while (true) {bufferIndex = AMediaCodec_dequeueOutputBuffer(encoder, &bufferInfo, TIMEOUT);if (bufferIndex >= 0) {buffer = AMediaCodec_getOutputBuffer(encoder, (size_t)bufferIndex, &bufferSize);if (NULL == buffer || 0 == bufferSize){LOGE("Can't get output buffer");break;}if (videoTrackIndex >= 0) {bufferInfo.presentationTimeUs = frameIndex * 1000000L / frameRate;LOGV("Muxer write to track %d: %d byte(s)", (int)videoTrackIndex, (int)bufferInfo.size);AMediaMuxer_writeSampleData(muxer, (size_t)videoTrackIndex, buffer, &bufferInfo);} else {LOGE("Invalid video track !");}AMediaCodec_releaseOutputBuffer(encoder, (size_t)bufferIndex, false);if (bufferInfo.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) break;} else if (AMEDIACODEC_INFO_TRY_AGAIN_LATER == bufferIndex) {if (!end) break;} else if (AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED == bufferIndex) {videoTrackIndex = AMediaMuxer_addTrack(muxer, AMediaCodec_getOutputFormat(encoder));if (videoTrackIndex >= 0) {AMediaMuxer_start(muxer);}LOGV("New videoTrackIndex: %d", (int)videoTrackIndex);}}}#if __ANDROID_API__ < 26void writeBytes( uint8_t* inputBuffer, size_t inputBufferSize ) {LOGV("[writeBytes] inputBufferSize=%u", (unsigned int)inputBufferSize);ssize_t bufferIndex;size_t  bufferSize;uint8_t* buffer;size_t  partialSize;bool firstCall = true;uint32_t flags;while(inputBufferSize > 0 || firstCall) {bufferIndex = AMediaCodec_dequeueInputBuffer(encoder, TIMEOUT);if (bufferIndex >= 0) {firstCall = false;buffer = AMediaCodec_getInputBuffer(encoder, (size_t)bufferIndex, &bufferSize);if (NULL == buffer || 0 == bufferSize) break;flags = 0;partialSize = (inputBufferSize > bufferSize) ? bufferSize : inputBufferSize;if (partialSize > 0) {memcpy(buffer, inputBuffer, partialSize);inputBuffer += partialSize;inputBufferSize -= partialSize;if (inputBufferSize > 0) {flags = AMEDIACODEC_BUFFER_FLAG_PARTIAL_FRAME;}} else {flags = AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM;}LOGV("[writeBytes] partial - bufferIndex=%d, bufferSize=%u, partialSize=%u, remaining inputBufferSize=%u",(int)bufferIndex, (unsigned int)bufferSize, (unsigned int)partialSize, (unsigned int)inputBufferSize);AMediaCodec_queueInputBuffer(encoder, (size_t)bufferIndex, 0, partialSize, frameIndex * 1000000L / frameRate, flags);if (NULL != inputBuffer) drainEncoder(false);}}}#endifpublic:AndroidMediaNdkVideoWriter(const cv::String& filename, int fourcc, double fps, cv::Size frameSize, const VideoWriterParameters& params): format(NULL),encoder(NULL),muxer(NULL),#if __ANDROID_API__ >= 26surface(NULL),#endifframeIndex(0),width(0),height(0),frameRate(0.),videoTrackIndex(-1),fd(-1) {open(filename, fourcc, fps, frameSize, params);}virtual ~AndroidMediaNdkVideoWriter() { close(); }virtual int getCaptureDomain() const CV_OVERRIDE { return cv::CAP_ANDROID; }virtual void write(cv::InputArray image_ ) CV_OVERRIDE{if (!image_.isMat()) {LOGE("Support only Mat input");return;}Mat image = image_.getMat();if (CV_8UC3 != image.type() || image.cols > width || image.rows > height) {LOGE("Expected input to be a mat of maximum %d x %d of type CV_8UC3 (%d), but received %d x %d of type: %d",width, height, CV_8UC3,image.cols, image.rows, image.type());return;}#if __ANDROID_API__ >= 26ANativeWindow_Buffer buffer;if (0 != ANativeWindow_lock(surface, &buffer, NULL)) {LOGE("Failed to lock the surface");} else {if (AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM == buffer.format) {Mat bufferMat(image.rows, image.cols, CV_8UC4, buffer.bits, buffer.stride * 4);cvtColor(image, bufferMat, CV_BGR2RGBA);} else {LOGE("Unknow surface buffer format: %u", buffer.format);}ANativeWindow_unlockAndPost(surface);}#elseLOGV("[write] image: %d  x %d", image.cols, image.rows);//OpenCV don't support RGB to NV12 so we need to connvert to YV12 and then manually changed it to NV12Mat imageYV12;cvtColor(image, imageYV12, CV_BGR2YUV_YV12);//convert from YV12 to NV12size_t yPlaneSize = width * height;size_t vPlaneSize = yPlaneSize / 4;Mat channels[2] = {Mat( vPlaneSize, 1, CV_8UC1, imageYV12.ptr() + yPlaneSize + vPlaneSize ).clone(),Mat( vPlaneSize, 1, CV_8UC1, imageYV12.ptr() + yPlaneSize ).clone()};Mat vuMat( vPlaneSize, 1, CV_8UC2, imageYV12.ptr() + yPlaneSize );merge(channels, 2, vuMat);writeBytes( imageYV12.ptr(), imageYV12.rows * imageYV12.cols );#endifdrainEncoder(false);frameIndex++;}virtual bool open( const cv::String& filename, int fourcc, double fps, cv::Size frameSize, const VideoWriterParameters& params ){media_status_t status;close();const FourCCInfo* info = findInfo(fourcc);if (NULL == info) {LOGE("ERROR: findInfo");return false;}format = AMediaFormat_new();if (NULL == format) {LOGE("ERROR: AMediaFormat_new");goto error;}LOGV("mime: %s, width: %d, height: %d, fps: %f", info->mime, frameSize.width, frameSize.height, fps);AMediaFormat_setString(format, AMEDIAFORMAT_KEY_MIME, info->mime);AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_WIDTH, frameSize.width);AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_HEIGHT, frameSize.height);AMediaFormat_setFloat(format, AMEDIAFORMAT_KEY_FRAME_RATE, (float)fps);AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_I_FRAME_INTERVAL, 5);AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_BIT_RATE, frameSize.width * frameSize.height * 5);AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_COLOR_FORMAT,#if __ANDROID_API__ >= 26COLOR_FormatSurface#elseCOLOR_FormatYUV420SemiPlanar#endif);encoder = AMediaCodec_createEncoderByType(info->mime);if (NULL == encoder) {LOGE("ERROR: AMediaCodec_createEncoderByType");goto error;}status = AMediaCodec_configure(encoder, format, NULL, NULL, AMEDIACODEC_CONFIGURE_FLAG_ENCODE);if (AMEDIA_OK != status) {LOGE("ERROR: AMediaCodec_configure (%d)", status);goto error;}#if __ANDROID_API__ >= 26status = AMediaCodec_createInputSurface(encoder, &surface);if (AMEDIA_OK != status || NULL == surface) {LOGE("ERROR: AMediaCodec_createInputSurface (%d)", status);goto error;}#endifAMediaCodec_start(encoder);fd = ::open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666);if (fd < 0) {LOGE("ERROR: open");goto error;}muxer = AMediaMuxer_new(fd, info->muxerFormat);if (NULL == muxer) {LOGE("ERROR: AMediaMuxer_new");goto error;}AMediaMuxer_setOrientationHint(muxer, params.get(CAP_PROP_ORIENTATION_META, 0));frameIndex = 0;width = frameSize.width;height = frameSize.height;frameRate = fps;videoTrackIndex = -1;return true;error:close();return false;}virtual void close(){if (videoTrackIndex >= 0 && NULL != muxer) {drainEncoder(true);AMediaMuxer_stop(muxer);}if (NULL != encoder) AMediaCodec_delete(encoder);if (NULL != muxer) AMediaMuxer_delete(muxer);#if __ANDROID_API__ >= 26if (NULL != surface) ANativeWindow_release(surface);#endifif (fd >= 0) ::close(fd);if (NULL != format) AMediaFormat_delete(format);format = NULL;encoder = NULL;muxer = NULL;#if __ANDROID_API__ >= 26surface = NULL;#endifframeIndex = 0;width = 0;height = 0;frameRate = 0.;videoTrackIndex = -1;fd = -1;}virtual double getProperty(int) const CV_OVERRIDE { return 0.; }virtual bool setProperty(int, double) CV_OVERRIDE { return false; }virtual bool isOpened() const CV_OVERRIDE { return NULL != encoder; }};const AndroidMediaNdkVideoWriter::FourCCInfo AndroidMediaNdkVideoWriter::FOURCC_INFO[] = {{ CV_FOURCC('H', '2', '6', '4'), "video/avc", AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 },{ CV_FOURCC('H', '2', '6', '5'), "video/hevc", AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 },{ CV_FOURCC('H', '2', '6', '3'), "video/3gpp", AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 },{ CV_FOURCC('M', 'P', '4', 'V'), "video/mp4v-es", AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 },{ 0, NULL },};/****************** Implementation of interface functions ********************/Ptr<IVideoCapture> cv::createAndroidCapture_file(const std::string &filename) {Ptr<AndroidMediaNdkCapture> res = makePtr<AndroidMediaNdkCapture>();if (res && res->initCapture(filename.c_str()))return res;return Ptr<IVideoCapture>();}Ptr<IVideoWriter> cv::createAndroidVideoWriter(const std::string& filename, int fourcc,double fps, const cv::Size& frameSize,const VideoWriterParameters& params) {Ptr<AndroidMediaNdkVideoWriter> writer = makePtr<AndroidMediaNdkVideoWriter>(filename, fourcc, fps, frameSize, params);if (writer && writer->isOpened())return writer;return Ptr<IVideoWriter>();}

相关文章:

android c++ 硬编码硬解码官方demo

参考&#xff1a; https://fossies.org/linux/opencv/modules/videoio/src/cap_android_mediandk.cpp 代码&#xff1a; // This file is part of OpenCV project.// It is subject to the license terms in the LICENSE file found in the top-level directory// of this d…...

Python之Excel数据相关

Excel Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件。直观的界面、出色的计算功能和图表工具&#xff0c;再加上成功的市场营销&#xff0c;使Excel成为最流行的个人计算机数据处理软件。在1993年&#xff0c;作为Microsof…...

Ubuntu网络IP地址一直显示127.0.0.1

问题描述&#xff1a; 终端输入ip a显示127.0.0.1&#xff0c;原来类似192.168.231.1的地址不见了。 ip a 点击网络配置&#xff08;ubuntu桌面版&#xff09;&#xff0c;发现无线网络模块看不见了 正常情况应该有wired 模块&#xff0c;就是下面标红的 解决方案&#xff1a…...

Vulnhub-DC-3 靶机复现完整过程

啰嗦两句&#xff1a; 提权之前完成是一个月前做的&#xff0c;当时在提权处出了点问题就搁置了&#xff0c;今天才完成&#xff0c;所以IP地址可能会会有变化 注意&#xff1a;后续出现的IP地址为192.168.200.55同样是靶机IP地址&#xff0c;若本文能有帮助到你的地方&#xf…...

Dubbo篇---第三篇

系列文章目录 文章目录 系列文章目录一、Dubbo 容错策略二、Dubbo 动态代理策略有哪些?三、说说 Dubbo 与 Spring Cloud 的区别?一、Dubbo 容错策略 failover cluster 模式 provider 宕机重试以后,请求会分到其他的 provider 上,默认两次,可以手动设置重试次数,建 议把写…...

Redis-使用java代码操作Redis->java连接上redis,java操作redis的常见类型数据存储,redis中的项目应用

java连接上redisjava操作redis的常见类型数据存储redis中的项目应用 1.java连接上redis package com.zlj.ssm.redis;import redis.clients.jedis.Jedis;/*** author zlj* create 2023-11-03 19:27*/ public class Demo1 {public static void main(String[] args) { // …...

react 使用笔记

1.学习&#xff1a;https://reactjs.bootcss.com/learn 2.项目启动报错&#xff1a;Delete ␍ prettier/prettier 解决&#xff1a;https://blog.csdn.net/qq_30272167/article/details/133280165 3.访问地址配置 文件&#xff1a;config-overrides.js devServer: functio…...

Ubuntu下启动Apache对.htaccess 的支持步骤, 利用.htaccess绑定域名到子目录

Ubuntu下启动Apache对.htaccess 的支持步骤 1. 终端运行 sudo a2enmod 程序提示可供激活的模块名称&#xff0c;输入&#xff1a; rewrite 2. 修改/etc/apache2/sites-enabled/000-default (该链接指向的是站点配置文件) 把&#xff08;默认的www目录、或者需要应用.htacc…...

C++常用格式化输出

在C语言中可以用printf以一定的格式打印字符&#xff0c;C当然也可以。 输入输出及命名空间还不太了解的小伙伴可以看一看C入门讲解第一篇。  在C中&#xff0c;可以用流操作符&#xff08;stream manipulators&#xff09;控制数据的输出格式&#xff0c;这些流操作符定义在2…...

QCC TX 音频输入切换+提示声音

QCC TX 音频输入切换提示声音 QCC蓝牙芯片&#xff08;QCC3040 QCC3056 等等&#xff09;&#xff0c;AUX、I2S、USB输入 蓝牙音频输入&#xff0c;模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 针对TX切换EQ,调节音量不能出提示声音问题&#xff0c;可以增…...

【Java】封装、继承、多态

面向对象的重要特征&#xff1a;封装、继承、多态&#xff1b; 面向对象的语言的语言并不止Java&#xff0c;C也是面向对象的语言&#xff1b; 访问限定符 public&#xff1a;在哪里都可以使用&#xff08;公开的&#xff09;&#xff1b;private&#xff1a;仅在当前类可以使用…...

第九章 异常处理

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…...

(四) Python Pandas入门

一、介绍 Pandas是Python中一个强大的数据处理库&#xff0c;它提供了许多功能强大的数据结构和数据分析工具。在本文中&#xff0c;我们将介绍Pandas的基本概念和如何使用它生成一个包含今天到未来20个工作日的日期列表的Excel文件。 Pandas提供了大量的数据结构和数据分析工…...

软件测试面试最经典的5个问题

软件测试面试灵魂五问&#xff01; 请做一下自我介绍&#xff1f;你为什么从上家公司离职&#xff1f;为什么转行做测试? 你对测试行业的认识&#xff1f;你的期望薪资是多少&#xff1f;最后&#xff0c;你要问我什么&#xff1f; 一、请做一下自我介绍 简历上有的可以一两…...

从公共业务提取来看架构演进——功能设置篇

1.引言 上一篇文章我们以帐号权限的提取为例&#xff0c;介绍了当架构跟不上业务发展时及时调整架构的一种思路。这篇文章我们以功能设置为例&#xff0c;进一步讨论公共业务提取这个话题。 功能设置在本文中是指产品开放给企业和用户的一些功能设置项&#xff0c;以视频会议…...

Java基础-015-System.java常用类

Java基础-015-System.java常用类 1、标准输入输出2、获取属性3、System.java初始化4、设置标准输出System.out java/lang/System.java 1、标准输入输出 System.in、System.out public class Test {public static void main(String[] args) {String charsetName String.valueOf…...

Flutter笔记:发布一个模块 scale_design - (移动端)设计师尺寸适配工具

Flutter笔记 发布一个模块scale_design设计师尺寸适配工具与常用组件库 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/a…...

torch增加维度操作

使用none作为占位符 在Python中&#xff0c;None 表示空值或占位符。 在masked_pos[:, :, None]这个切片操作中&#xff0c;None 被用作一个占位符&#xff0c;以改变张量的维度。这通常用于将一维张量变为二维张量&#xff0c;或者改变张量的形状。 具体来说&#xff0c;ma…...

软件测试面试题及答案2024

1、你们的缺陷等级如何划分的&#xff1f;☆☆☆☆☆ 我们的缺陷一般分为四个等级&#xff0c;致命级&#xff0c;严重级&#xff0c;一般级和轻微级。致命级指能够导致软件程序无法使用的缺陷&#xff0c;比如宕机&#xff0c;崩溃&#xff0c;手机APP的闪退&#xff0c;数据…...

C现代方法(第18章)笔记——声明

文章目录 第18章 声明18.1 声明的语法18.2 存储类型18.2.1 变量的性质18.2.2 auto存储类型18.2.3 static存储类型18.2.4 extern存储类型18.2.5 register存储类型18.2.6 函数的存储类型18.2.7 小结 18.3 类型限定符18.4 声明符18.4.1 解释复杂声明18.4.2 使用类型定义来简化声明…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

VSCode 没有添加Windows右键菜单

关键字&#xff1a;VSCode&#xff1b;Windows右键菜单&#xff1b;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意&#xff0c;实际使用的时候发现 VSCode 在 Windows 菜单栏…...

今日行情明日机会——20250609

上证指数放量上涨&#xff0c;接近3400点&#xff0c;个股涨多跌少。 深证放量上涨&#xff0c;但有个小上影线&#xff0c;相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析&#xff08;基于最新图片数据&#xff09; 1. 医药&#xff08;11家涨停&#xff09; 代表标…...

Ansible+Zabbix-agent2快速实现对多主机监控

ansible Ansible 是一款开源的自动化工具&#xff0c;用于配置管理&#xff08;Configuration Management&#xff09;、应用部署&#xff08;Application Deployment&#xff09;、任务自动化&#xff08;Task Automation&#xff09;和编排&#xff08;Orchestration&#xf…...

Q1起重机指挥理论备考要点分析

Q1起重机指挥理论备考要点分析 一、考试重点内容概述 Q1起重机指挥理论考试主要包含三大核心模块&#xff1a;安全技术知识&#xff08;占40%&#xff09;、指挥信号规范&#xff08;占30%&#xff09;和法规标准&#xff08;占30%&#xff09;。考试采用百分制&#xff0c;8…...