Linux系统USB摄像头测试程序(三)_视频预览
这是在linux上usb摄像头视频预览程序,此程序用到了ffmpeg、sdl2、gtk3组件,程序编译之前应先安装他们。
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <zconf.h>
#include <linux/videodev2.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gtk-3.0/gtk/gtk.h>#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavdevice/avdevice.h"
#include "libavutil/imgutils.h"
#include <libavfilter/avfilter.h>
#include <libavfilter/buffersrc.h>
#include <libavfilter/buffersink.h>#include <SDL2/SDL.h>//dhl:gtk窗口组件
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button1,*button2,*button3;
GtkWidget *text,*text1,*text2,*text3;
GtkTextBuffer *buffer,*buffer1,*buffer2,*buffer3;
GtkWidget *label1,*label2,*label3,*label_line;//dhl:sdl窗口组件
SDL_Window *sdl_window;
SDL_Renderer *sdl_renderer;
SDL_Texture *sdl_texture;//dhl:消息缓存
char disp[2048]={0};
char temp[128]={0};int getWHR(char *device_name,char *win_size,int *win_width,int *win_height, char *frame_rate_t)
{GtkTextIter start,end;gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer1),&start,&end);GtkTextIter s=start,e=end;sprintf(device_name,"%s",gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer1),&s,&e,FALSE));gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer2),&start,&end);s=start,e=end;gchar *win_size1 = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer2),&s,&e,FALSE);sprintf(win_size,"%s",gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer2),&s,&e,FALSE));gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer3),&start,&end);s=start,e=end;sprintf(frame_rate_t,"%s",gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer3),&s,&e,FALSE));if (!strcmp(device_name,"")|| !strcmp(win_size,"")||!strcmp(frame_rate_t,"")) {GtkWidget * dialog= dialog = gtk_message_dialog_new (NULL,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_CLOSE,"请输入摄像头设备名称、窗口尺寸、帧速率");gtk_dialog_run (GTK_DIALOG (dialog));gtk_widget_destroy (dialog);return -1;}sscanf(win_size1, "%dx%d", win_width, win_height);return 0;
}//dhl:发现摄像头
void button1_clicked(GtkWidget *widget, gpointer data)
{char camera_devices_name[128]={0};for (int loop=0;loop<10;loop++) {sprintf(camera_devices_name,"/dev/video%d",loop);int fd = open(camera_devices_name, O_RDWR);if(fd < 0){printf("打开设备失败(%s)\n",camera_devices_name);close(fd);continue;}close(fd);sprintf(temp,"发现摄像头:%s\n",camera_devices_name);strcat(disp,temp);gtk_text_buffer_set_text(buffer,disp,-1);}sprintf(disp,"%s","");
}//dhl:查询配置信息
void button2_clicked(GtkWidget *widget, gpointer data)
{int line_num=0;gchar *device_name;GtkTextIter start,end;gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer1),&start,&end);const GtkTextIter s=start,e=end;device_name=gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer1),&s,&e,FALSE);if (!strcmp(device_name,"")){sprintf(temp,"请输入摄像头设备文件名\n");strcat(disp,temp);gtk_text_buffer_set_text(buffer,disp,-1);sprintf(disp,"%s","");return;}//dhl:查询摄像头支持的视频格式int fd = open(device_name, O_RDWR);if(fd < 0){printf("打开设备失败\n");return;}struct v4l2_fmtdesc v4fmt;v4fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //视频捕获设备int i=0;while(1){v4fmt.index = i++;int ret = ioctl(fd, VIDIOC_ENUM_FMT, &v4fmt);if(ret < 0){printf("获取摄像头格式失败");break;}printf("index=%d\n", v4fmt.index);printf("flags=%d\n", v4fmt.flags);printf("description=%s\n", v4fmt.description);unsigned char *p = (unsigned char *)&v4fmt.pixelformat;printf("pixelformat=%c%c%c%c\n", p[0],p[1],p[2],p[3]);printf("reserved=%d\n", v4fmt.reserved[0]);sprintf(temp,"摄像头支持的视频格式(%d)\n",i);strcat(disp,temp);sprintf(temp,"index=%d,", v4fmt.index);strcat(disp,temp);sprintf(temp,"flags=%d,", v4fmt.flags);strcat(disp,temp);sprintf(temp,"description=%s,", v4fmt.description);strcat(disp,temp);sprintf(temp,"pixelformat=%c%c%c%c,", p[0],p[1],p[2],p[3]);strcat(disp,temp);sprintf(temp,"reserved=%d\n", v4fmt.reserved[0]);strcat(disp,temp);}close(fd);//dhl:MJPG支持的所有分辨率如下fd = open(device_name, O_RDWR);if(fd < 0){perror("打开设备失败");return;}struct v4l2_frmsizeenum frmsize;frmsize.index = 0;frmsize.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;printf("MJPEG格式支持所有分辨率如下:\n");//frmsize.pixel_format = V4L2_PIX_FMT_YUYV;frmsize.pixel_format = V4L2_PIX_FMT_MJPEG;sprintf(temp,"MJPG支持的分辨率:\n");strcat(disp,temp);line_num=1;while(ioctl(fd,VIDIOC_ENUM_FRAMESIZES,&frmsize) == 0){printf("frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);frmsize.index++;if ((line_num % 5) != 0) { sprintf(temp,"MJPEG frame_size<%d*%d>, ",frmsize.discrete.width,frmsize.discrete.height);}else {sprintf(temp,"MJPEG frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);}strcat(disp,temp);line_num++;if (line_num == 6) {line_num = 1;}}close(fd);sprintf(temp,"%s","\n");strcat(disp,temp);//dhl:YUV支持所有分辨率如下fd = open(device_name, O_RDWR);if(fd < 0){perror("打开设备失败");return;}//struct v4l2_frmsizeenum frmsize;frmsize.index = 0;frmsize.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;printf("MJPEG格式支持所有分辨率如下:\n");frmsize.pixel_format = V4L2_PIX_FMT_YUYV;//frmsize.pixel_format = V4L2_PIX_FMT_MJPEG;sprintf(temp,"YUV支持的分辨率:\n");strcat(disp,temp);line_num = 1;while(ioctl(fd,VIDIOC_ENUM_FRAMESIZES,&frmsize) == 0){printf("frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);frmsize.index++;if ((line_num % 5) != 0) { sprintf(temp,"YUYV frame_size<%d*%d>, ",frmsize.discrete.width,frmsize.discrete.height);}else {sprintf(temp,"YUYV frame_size<%d*%d>\n",frmsize.discrete.width,frmsize.discrete.height);}strcat(disp,temp);line_num++;if (line_num == 6) {line_num = 1;}}close(fd);gtk_text_buffer_set_text(buffer,disp,-1);sprintf(disp,"%s","");}//dhl:视频预览
void button3_clicked(GtkWidget *widget, gpointer data)
{AVFormatContext *pFormatCtx;int i, videoindex;AVCodecContext *pCodecCtx;AVCodec *pCodec;int ret = -1;int win_width=0, win_height=0;gchar device_name[128];gchar win_size[128];gchar frame_rate_t[128];int iRet=getWHR(device_name,win_size,&win_width,&win_height, frame_rate_t);if (iRet!=0) {return;}const char * out_path = "out_yuyv422.yuv";FILE* outFile = fopen(out_path, "wb");if (!outFile) {printf("Could not open %s\n", out_path);return;}if (SDL_Init(SDL_INIT_VIDEO)) {printf("Could not initialize SDL - %s\n", SDL_GetError());return;}else{printf("initialize SDL ok\n");}sdl_window = SDL_CreateWindow("视频预览",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,win_width,win_height,SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);if(sdl_window == NULL){printf("SDL_window创建失败\n");return;}sdl_renderer = SDL_CreateRenderer(sdl_window,-1,SDL_RENDERER_ACCELERATED);sdl_texture = SDL_CreateTexture(sdl_renderer//,SDL_PIXELFORMAT_IYUV,SDL_PIXELFORMAT_YUY2,SDL_TEXTUREACCESS_TARGET,win_width,win_height);SDL_Rect sdl_rect;char *buffer_pixels = malloc(win_width*win_height*4);pFormatCtx = avformat_alloc_context();const AVInputFormat *ifmt = av_find_input_format("v4l2");AVDictionary *option =NULL;av_dict_set(&option,"video_size",win_size,0);av_dict_set(&option,"framerate",frame_rate_t,0);//av_dict_set(&option,"pixel_format","yuv420p12be",0); //指定格式avformat_open_input(&pFormatCtx, device_name, ifmt,&option);if(avformat_find_stream_info(pFormatCtx, NULL) < 0){printf("Couldn't find stream information.\n");return;}videoindex = -1;for(i = 0; i < pFormatCtx->nb_streams; i++){if(pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){videoindex = i;break;}}if(videoindex == -1){printf("Didn't find a video stream.\n");return;}else{printf("Find a video stream:%d.\n", videoindex);}pCodec = (AVCodec*)avcodec_find_decoder(pFormatCtx->streams[videoindex]->codecpar->codec_id);if(pCodec == NULL){printf("Codec not found.\n");return;}pCodecCtx = avcodec_alloc_context3(pCodec);avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);printf("VideoStream:Frame.Width=%d,Height=%d\n",pCodecCtx->width, pCodecCtx->height);if(avcodec_open2(pCodecCtx, pCodec, NULL) < 0){printf("Could not open codec.\n");return;}AVPacket *pkt = av_packet_alloc();if(!pkt){printf("av_packet_alloc错误\n");return;}AVFrame *frame_yuyv422 = av_frame_alloc();if(!frame_yuyv422){printf("av_frame_alloc错误\n");return;}int frame_count = 0;//记录获取的帧数SDL_Event event;while (av_read_frame(pFormatCtx, pkt) >= 0 ) {if(pkt->stream_index == videoindex){//dhl:发送给解码器if(avcodec_send_packet(pCodecCtx,pkt) != 0){printf("avcodec_send_packet error ...\n");break;}//dhl:从解码器中得到摄像头的原始视频帧int loop=0;while(avcodec_receive_frame(pCodecCtx,frame_yuyv422) == 0){frame_count++;for(int i = 0;i < frame_yuyv422->height;i++){memcpy(buffer_pixels+i * frame_yuyv422->linesize[0],frame_yuyv422->data[0] + i * frame_yuyv422->linesize[0],frame_yuyv422->linesize[0]);}SDL_UpdateTexture(sdl_texture,NULL,buffer_pixels,win_width*2);//dhl:将纹理数据拷贝给渲染器sdl_rect.x = 0;sdl_rect.y = 0;sdl_rect.w = win_width;sdl_rect.h = win_height;//dhl:先清空帧画面,再重新绘制SDL_RenderClear(sdl_renderer);SDL_RenderCopy(sdl_renderer,sdl_texture,NULL,&sdl_rect);//dhl:显示帧画面SDL_RenderPresent(sdl_renderer);//dhl:延时渲染//SDL_Delay(frame_rate);//延时}}av_packet_unref(pkt);for (int ll=0;ll<10;ll++) {SDL_PollEvent(&event);} if (event.type == SDL_QUIT) {break;}}fclose(outFile);sprintf(disp,"预览总帧数:%d",frame_count);gtk_text_buffer_set_text(buffer,disp,-1);sprintf(disp,"%s","");av_free(frame_yuyv422);av_packet_free(&pkt);avformat_close_input(&pFormatCtx);free(buffer_pixels);SDL_DestroyTexture(sdl_texture);SDL_DestroyRenderer(sdl_renderer);SDL_DestroyWindow(sdl_window ); SDL_Quit();return;}int main(int argc,char *argv[])
{gtk_init(&argc,&argv);avdevice_register_all();window = gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"USB摄像头测试程序(v1.0.20230728)");//gtk_window_set_resizable(GTK_WINDOW(window),FALSE);gtk_window_set_default_size(GTK_WINDOW(window),1280,800);gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);fixed = gtk_fixed_new();gtk_container_add(GTK_CONTAINER(window),fixed);text = gtk_text_view_new();buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));gtk_text_buffer_set_text(buffer,"",-1);gtk_fixed_put(GTK_FIXED(fixed),text,20,480);gtk_widget_set_size_request(text,1240,300);button1 = gtk_button_new_with_label("查询摄像头");gtk_fixed_put(GTK_FIXED(fixed),button1,320,14);gtk_widget_set_size_request(button1,100,20);label1 = gtk_label_new("摄像头:");gtk_fixed_put(GTK_FIXED(fixed),label1,440,14);gtk_widget_set_size_request(label1,50,30);text1 = gtk_text_view_new();buffer1=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text1));gtk_text_buffer_set_text(buffer1,"",-1);gtk_fixed_put(GTK_FIXED(fixed),text1,500,16);gtk_widget_set_size_request(text1,100,28);sprintf(disp,"/dev/video0");gtk_text_buffer_set_text(buffer1,disp,-1);button2 = gtk_button_new_with_label("查询配置");gtk_fixed_put(GTK_FIXED(fixed),button2,610,14);gtk_widget_set_size_request(button2,80,35);label2 = gtk_label_new("分辨率:");gtk_fixed_put(GTK_FIXED(fixed),label2,740,18);gtk_widget_set_size_request(label2,50,30);text2 = gtk_text_view_new();buffer2=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text2));gtk_text_buffer_set_text(buffer2,"",-1);gtk_fixed_put(GTK_FIXED(fixed),text2,800,16);gtk_widget_set_size_request(text2,100,28);sprintf(disp,"640x480");gtk_text_buffer_set_text(buffer2,disp,-1);label3 = gtk_label_new("帧率:");gtk_fixed_put(GTK_FIXED(fixed),label3,930,18);gtk_widget_set_size_request(label3,50,30);text3 = gtk_text_view_new();buffer3=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text3));gtk_text_buffer_set_text(buffer3,"",-1);gtk_fixed_put(GTK_FIXED(fixed),text3,980,16);gtk_widget_set_size_request(text3,100,28);sprintf(disp,"30");gtk_text_buffer_set_text(buffer3,disp,-1);label_line = gtk_label_new("______________________________________________________________________________________________________________________________");gtk_fixed_put(GTK_FIXED(fixed),label_line,320,45);gtk_widget_set_size_request(label_line,800,3);GtkWidget *labelChild;PangoFontDescription *font;int fontSize = 10;font = pango_font_description_from_string("Sans"); //"Sans"字体名pango_font_description_set_size(font, fontSize * PANGO_SCALE); //设置字体大小labelChild = gtk_bin_get_child(GTK_WIDGET(button1)); //取出GtkButton里的labelgtk_widget_modify_font(GTK_WIDGET(labelChild), font); //设置label的字体, 这样这个GtkButton上面显示的字体就变了labelChild = gtk_bin_get_child(GTK_WIDGET(button2)); gtk_widget_modify_font(GTK_WIDGET(labelChild), font); button3 = gtk_button_new_with_label("视频预览");gtk_fixed_put(GTK_FIXED(fixed),button3,320,80);gtk_widget_set_size_request(button3,80,20);g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(button1_clicked),NULL);g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(button2_clicked),NULL);g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(button3_clicked),NULL); gtk_widget_show_all(window);gtk_main();return 0;
}
编译命令:gcc preview_camera.c -o camera_preview `pkg-config --cflags --libs libavdevice libavfilter libavformat libavcodec libavutil libpostproc libswresample libswscale` `pkg-config --cflags --libs sdl2` `pkg-config --cflags --libs gtk+-3.0` -w
运行截图:
相关文章:
Linux系统USB摄像头测试程序(三)_视频预览
这是在linux上usb摄像头视频预览程序,此程序用到了ffmpeg、sdl2、gtk3组件,程序编译之前应先安装他们。 #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <zconf.h> …...
目标检测任务数据集的数据增强中,图像水平翻转和xml标注文件坐标调整
需求: 数据集的数据增强中,有时需要用到图像水平翻转的操作,图像水平翻转后,对应的xml标注文件也需要做坐标的调整。 解决方法: 使用pythonopencvimport xml.etree.ElementTree对图像水平翻转和xml标注…...
系统架构的演变
随着互联网的发展,网站应用的规模不断扩大,常规的应用架构已无法应对,分布式服务架构以及微服务架构势在必行,必需一个治理系统确保架构有条不紊的演进。 单体应用架构 Web应用程序发展的早期,大部分web工程(包含前端…...
IDC发布《亚太决策支持型分析数据平台评估》报告,亚马逊云科技位列“领导者”类别
日前,领先的IT市场研究和咨询公司IDC发布《2023年亚太地区(不含日本)决策支持型分析数据平台供应商评估》1报告,亚马逊云科技位列“领导者”类别。IDC认为,亚马逊云科技在解决方案的协同性、敏捷性、完整性、及时性、经…...
C#之OpenFileDialog创建和管理文件选择对话框
OpenFileDialog 是用于图形用户界面(GUI)编程的一个类,它用于显示一个对话框,允许用户选择要打开的文件。在需要用户加载或打开文件的应用程序中(如文本编辑器、图像查看器或文档处理器),这是一…...
Java中使用MongoTemplate 简单操作MongoDB
Autowired private MongoTemplate mongoTemplate; User:封装的对象 插入:mongoTemplate.insert(user); 根据id查询:mongoTemplate.findById(id, User.class); 查询所有:mongoTemplate.findAll(User.class); 条件查询&#…...
[Mac软件]Pixelmator Pro 3.3.12 专业图像编辑中文版
Pixelmator Pro是专为Mac设计的功能强大,美观且易于使用的图像编辑器。借助广泛的专业级无损图像编辑工具,Pixelmator Pro可使您发挥出最佳的照片效果,创建华丽的构图和设计,绘制,绘画,应用令人惊叹的效果&…...
吴恩达 GPT Prompting 课程
Prompting Guidelines 目录 Guidelines for PromptingPrompting Principles Principle 1: Write clear and specific instructions1.1: Use delimiters to clearly indicate distinct parts of the input1.2: Ask for a structured output1.3: Ask the model to check whether …...
gpt3.5写MATLAB代码剪辑视频,使之保留画面ROI区域
% 输入和输出文件名 inputVideoFile input_video.mp4; outputVideoFile output_video.mp4;% 创建 VideoReader 和 VideoWriter 对象 videoReader VideoReader(inputVideoFile); outputVideo VideoWriter(outputVideoFile, MPEG-4); outputVideo.FrameRate videoReader.Fra…...
设计模式二十一:状态模式(State Pattern)
一个对象的内部状态发生变化时,允许对象改变其行为。这种模式使得一个对象看起来好像在运行时改变了它的类,主要目的是将状态的行为从主要对象中分离出来,使得主要对象不必包含所有状态的逻辑,而是将每个状态的行为封装在独立的类…...
【校招VIP】产品思维能力之产品设计
考点介绍: 对于产品经理来说最重要的就是产品思维,而拥有一个好的产品思维需要做到以下三点: 1、把握关键点的能力 2、出方案,协调资源,说服团队把资源倾斜到关键点上的能力 3、评估关键点进展程度的能力 『产品思维能…...
微信小程序卡片横向滚动竖图
滚动并不是使用swiper,该方式使用的是scroll-view实现 Swiper局限性太多了,对竖图并不合适 从左往右滚动图片示例 wxml代码: <view class"img-x" style"margin-top: 10px;"><view style"margin: 20rpx;…...
SpringBoot项目(支付宝整合)——springboot整合支付宝沙箱支付 从极简实现到IOC改进
目录 引出git代码仓库准备工作支付宝沙箱api内网穿透 [natapp.cn](https://natapp.cn/#download) springboot整合—极简实现版1.导包配置文件2.controller层代码3.进行支付流程4.支付成功回调 依赖注入的改进1.整体结构2.pom.xml文件依赖3.配置文件4.配置类,依赖注入…...
【AIGC】一款离线版的AI智能换脸工具V2.0分享(支持图片、视频、直播)
随着人工智能技术的爆发,AI不再局限于大语言模型,在图片处理方面也有非常大的进步,其中AI换脸也是大家一直比较感兴趣的,但这个技术的应用一直有很大的争议。 今天给大家分享一个开源你的AI换脸工具2.0,只需要一张所需…...
管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——选言——相容选言——或
文章目录 第五章 选言命题:相容选言-或;不相容选言-要么要么第一节 选言-相容选言-或-推结论-A或B为真,则非A→B,非B→A(否一则肯一)真题(2010-28)-选言-相容选言-或-推结论-(1)A或B为真,A为假:得B为真(否一则肯一);真题(2012-29)-选言-相容选言-或-推结论-(1)…...
Git如何操作本地分支仓库?
基本使用TortoiseGit 操作本地仓库(分支) 分支的概念 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,避免影响开发主线。多线程开发,可以同时开启多个任务的开发,多个任务之间互不影响。 为何要…...
WPS右键新建没有docx pptx xlsx 修复
解决wps右键没有新建文档的问题 右键没有新建PPT和Excel 1 wps自带的修复直接修复没有用 以上不管咋修复都没用 2 先编辑注册表 找到 HKEY_CLASSES_ROOT CTRLF搜文件扩展名 pptx docx xlsx 新建字符串 三种扩展名都一样操作 注册表编辑之后再次使用wps修复 注册组件&am…...
【巧学C++之西游篇】No.2 --- C++闹天宫,带着“重载“和“引用“
文章目录 前言🌟一、函数重载🌏1.1.函数重载概念🌏1.2.C支持函数重载的原理 -- 名字修饰 🌟二、引用🌏2.1.引用的概念🌏2.2.引用特性🌏2.3.常引用🌏2.4.使用场景🌏2.5.传…...
【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)
【关键字】 音频编码、管道模式、createEncoder 【写在前面】 在使用API6开发HarmonyOS应用时,如何将pcm源文件进行编码并写入文件,最后生成aac文件,本文直接附上主要代码开发步骤供大家参考。 【主要功能代码】 import ohos.media.codec.…...
KaiwuDB CTO 魏可伟:回归用户本位,打造“小而全”的数据库
8月16日,KaiwuDB 受邀亮相第十四届中国数据库技术大会 DTCC 2023。KaiwuDB CTO 魏可伟接受大会主办方的采访,双方共同围绕“数据库架构演进、内核引擎设计以及不同技术路线”展开深度探讨。 以下是采访的部分实录 ↓↓↓ 40 多年前,企业的数…...
行业追踪,2023-08-22
自动复盘 2023-08-22 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
浏览器安装selenium驱动,以Microsoft Edge安装驱动为例
Selenium是一个用于Web应用程序测试的自动化工具。它可以直接在浏览器中运行,模拟真实用户对浏览器进行操作。利用selenium,可以驱动浏览器执行特定的动作,比如:点击、下拉等等,还可以获取浏览器当前呈现的页面的源代码…...
边缘计算网关是如何提高物联网的效率的?
随着物联网的持续发展,物联网应用的丰富和规模的扩大,带来了海量的数据处理、传输和计算需求。 传统的“数据中央处理”模式越来越难以适应物联网的扩展速度,在这一趋势下,边缘计算在物联网系统的部署运营中就发挥出了显著的增效…...
AWVS安装~Windows~激活
目录 1.下载安装包 2.双击acunetix_15.1.221109177.exe进行安装 3.配置C:\Windows\System32\drivers\etc\hosts 4.复制wvsc.exe到C:\Program Files (x86)\Acunetix\15.1.221109177下 5.复制license_info.json与wa_data.dat到C:\ProgramData\Acunetix\shared\license下&…...
ATFX汇市:杰克逊霍尔年会降至,鲍威尔或再发鹰派言论
环球汇市行情摘要—— 昨日,美元指数下跌0.11%,收盘在103.33点, 欧元升值0.22%,收盘价1.0898点; 日元贬值0.58%,收盘价146.23点; 英镑升值0.18%,收盘价1.2757点; 瑞…...
Zipkin开源的分布式链路追踪系统
Zipkin是一款开源的分布式链路追踪系统,主要功能包括: 1. 采集跟踪数据 - Zipkin client库负责收集并上报各服务的请求信息。 2. 存储跟踪数据 - 存储层默认采用Zipkin自带的基于内存的快速存储,也支持整合MySQL、Cassandra等外部存储。 3. 查询接口 - 提供RESTful API进行跟…...
java 项目运行时,后端控制台出现空指针异常---java.lang.NullPointerException
项目场景: 提示:这里简述项目背景: 场景如下: java 项目运行时,后端控制台出现如下图所示报错信息:— 问题描述 提示:这里描述项目中遇到的问题: java 项目运行时,后…...
模型数据处理-数据放入 session和@ModelAttribute 实现 prepare 方法详细讲解
😀前言 本文详细讲解了模型数据处理-数据放入 session和ModelAttribute 实现 prepare 方法详细讲解 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,…...
关于android studio 几个简单的问题说明
自信是成功的第一步。——爱迪生 1. android studio 如何运行不同项目是否要更换不同的sdk 和 gradle 2.编译Gradle总是错误为什么 3.如何清理android studio 的缓存 4. 关于android Studio中的build 下面的rebuild project...
angular常用命令
文章目录 1. 创建新项目:2. 生成组件:3. 生成模块:4. 生成服务:5. 运行项目:6. 构建项目:其他 在 Angular 开发中,以下是一些常用的 Angular CLI 命令: 1. 创建新项目: …...
网站数据分析视频/seo排名点击软件运营
Day0 到了广州的瑞季悦居酒店,酒店设施显然不如从前(谁说之前的酒店烂的来着?),而且位置极为偏僻。 LJF甚至疑惑这家酒店设立在这里究竟是为了什么样的经济效益。 拼房时被人背叛,于是在高一中被挤出来。跟…...
php网站开发建设/河南网站建设制作
24、墨 池 记曾巩学习重点:1、体会文章的主旨2、体会记叙与议论之间的关系从而把握作者要表达的观点。课时安排:三课时第一课时教学步骤:一、导语:笔墨纸砚是我国古代所说的“文房四宝”,用毛笔写字不用时要洗净&…...
怎么做网站文字优化/促销活动推广语言
在使用ajks时,json是经常使用的一种数据,我对它了解的也不是很透彻,但在这里想要分享一下最近答辩中我使用它的一种形式,当然这是一种很笨的方法。 我希望在访问网上书店时,主页里有一些分类,点击不同的分类…...
成都物流网站建设/重庆seo1
异 常:★★★★异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信…...
网站建设方案项目背景意义/app关键词优化
大数据就业方向有哪些?看到了大数据的就业前景及就业薪资,相信很多人都对大数据技术跃跃欲试,想要学习大数据技术。小编认为在学习大数据之前,你还需要了解一下大数据的就业方向有哪些?毕竟我们学习大数据就是为了以后…...
网站建设教程浩森宇特/视频app推广
基于Android 11:三星OneUI 3.0详细升级计划公布2020-12-02 22:06:1414点赞18收藏47评论本周,三星方面公布了基于Android 11的OneUI 3.0具体升级安排,其最早出现在埃及地区手机用户的三星会员APP中。2020年12月:Galaxy S20 Ultra、…...