FFmpeg深入学习

文章目录

  • 前言
  • 一、FFmpeg 基础指令
  • 二、FFmpeg 应用之视频播放器
    • 1、音视频播放流程
    • 2、音视频同步
  • 三、FFplay 播放器
    • 1、FFmpeg 播放器的整体框架
    • 2、ffplay 的初体验及快捷键
    • 3、ffplay 模块划分
    • 4、ffplay 原理及流程
  • 四、FFmpeg 编解码及转码
    • 1、FFmpeg 转码全流程简介
    • 2、FFmpeg 转码步骤分析
  • 五、FFmpeg 特效处理 libavfilter
    • 1、libavfilter 介绍
    • 2、ffmpeg 添加水印基本流程
    • 3、ffmpeg 向视频中添加文字
    • 4、实战测试


前言

上文主要讲解了 FFmpeg 相关知识,以及在 Windows 下编译 FFmpeg 源码,本文继续对 FFmpeg 进行更深入的介绍。


一、FFmpeg 基础指令

 主要参数:◼ -i 设定输入流◼ -f 设定输出格式(format)-ss 开始时间◼ -t 时间长度音频参数:◼ -aframes 		设置要输出的音频帧数◼ -b:a 			音频码率◼ -ar 			设定采样率◼ -ac			设定声音的Channel数◼ -acodec 		设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。◼ -an 			不处理音频◼ -af 			音频过滤器
ffmpeg -i test.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out2.mp3视频参数:◼ -vframes 			设置要输出的视频帧数◼ -b 				设定视频码率◼ -b:v 				视频码率◼ -r 				设定帧速率◼ -s 				设定画面的宽与高◼ -vn 				不处理视频◼ -aspect aspect 	设置横纵比 4:3 16:9 或 1.3333 1.7777-vcodec 			设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。◼ -vf 				视频过滤器
ffmpeg -i test.mp4 -vframes 300 -b:v 300k -r 30 -s 640x480 -aspect 16:9 -vcodec libx265

二、FFmpeg 应用之视频播放器

1、音视频播放流程

播放一个音视频文件的流程:
在这里插入图片描述

  • 解协议
    • 将流媒体协议的数据,解析为标准的相应的封装格式数据视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTPRTMP,或是 MMS 等等。
    • 这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据。
  • 解封装
    • 将输入的封装格式的数据,分离成为音频流压缩编码数据视频流压缩编码数据
    • 封装格式种类很多,例如 MP4,MKV,RMVB,TS,FLV,AVI 等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV 格式的数据,经过解封装操作后,输出 H.264 编码的视频码流和 AAC 编码的音频码流。
  • 解码
    • 将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据
    • 音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等
    • 解码是整个系统中最重要也是最复杂的一个环节。
    • 通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
  • 音视频同步
    • 根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
    • 视音频封装格式数据分为 flv、mkv、 mp4、rmvb、ts 等等格式

2、音视频同步

音视频同步的方式基本是确定一个时钟(音频时钟、视频时钟、外部时钟)作为主时钟,非主时钟的音频或视频时钟为从时钟

在播放过程中,主时钟作为同步基准,不断判断从时钟与主时钟的差异,调节从时钟,使从时钟追赶(落后时)或等待(超前时)主时钟。

视频同步到音频的基本方法是:如果视频超前音频,则不进行播放,以等待音频;如果视频落后音频,则丢弃当前帧直接播放下一帧,以追赶音频。

按照主时钟的不同种类,可以将音视频同步模式分为如下三种:

  • 音频同步到视频,视频时钟作为主时钟。
  • 视频同步到音频,音频时钟作为主时钟。(常用
  • 音视频同步到外部时钟,外部时钟作为主时钟。
    在这里插入图片描述

三、FFplay 播放器

1、FFmpeg 播放器的整体框架

FFmpeg 播放器的整体框架图
在这里插入图片描述

2、ffplay 的初体验及快捷键

ffplay 是 ffmpeg 工程中提供的播放器,功能相当的强大,凡是 ffmpeg 支持的视音频格式它基本上都支持。

甚至连 VLC 不支持的一些流媒体都可以播放(比如说 RTMP),但是它的缺点是其不是图形化界面的,必须通过键盘来操作。

通过 ffplay 播放 D:\Work\test 目录下的 SampleVideo_1280x720_20mb.mp4 文件

ffplay -i SampleVideo_1280x720_20mb.mp4

在这里插入图片描述
可以看到视频正在被播放,按空格是暂停,左右键是快退和快进
请添加图片描述

3、ffplay 模块划分

  • 解析输入
  • 打开码流
  • 音视频队列
  • 音视频解码
  • 播放控制
  • 开始播放
  • 停止播放
  • 暂停播放
  • 跳到(seek)指定位置播放
  • 音频输出
  • 视频输出
  • ffplay 快捷键支持

4、ffplay 原理及流程

在这里插入图片描述

  • av_register_all():用于注册所有muxers、demuxers 与 protocols;
  • avformat_open_input():根据传入的 url 确定了要使用的协议 URLProtocol,比如 http 的或是 file 类型的协议;
  • av_find_stream_info():获取更多的码流信息。比如获取视频帧率、视频宽高,重新计算最大分析时长,打开解码器解码获取 codec 数据;
  • avcodec_find_decoder():查找解码器;
  • avcodec_open():打开编解码器;
  • av_read_frame():读取音视频帧;
  • avcodec_decode_video2():解码一帧视频数据;

SDL 显示 YUV 图像的流程图:
在这里插入图片描述

  • SDL_Init():主要是初始化内存等;
  • SDL_SetVideoMode():设置显示模式,创建 SDL 窗口,并指定图像尺寸及像素个数;
  • SDL_Surface:是一种图片数据类型,包含了图片的全部像素点,以及渲染这张图片需要的其它数据;
  • SDL_CreateYUVOverlay():创建画布对象;
  • SDL_Overlay:用于显示YUV数据;
  • SDL_DisplayYUVOverlay():让 SDL 来渲染我们给它的数据;

四、FFmpeg 编解码及转码

1、FFmpeg 转码全流程简介

FFmpeg 常规处理流程
在这里插入图片描述
大流程可以划分为输入、输出、转码、播放四大块

其中转码涉及比较多的处理环节,从图中可以看出,转码功能在整个功能图中占比很大,转码的核心功能在解码编码两个部分,但在一个可用的示例程序中,编码解码与输入输出是难以分割的。

解复用器为解码器提供输入,解码器会输出原始帧,对原始帧可进行各种复杂的滤镜处理,滤镜处理后的帧经编码器生成编码帧,多路流的编码帧经复用器输出到输出文件。

2、FFmpeg 转码步骤分析

  • 解复用
    • 从输入文件中读取编码帧,判断流类型,根据流类型将编码帧送入视频解码器或音频解码器。
  • 解码
    • 将视音频编码帧解码生成原始帧。
  • 滤镜
    • 提供多种多样的滤镜,用来处理原始帧数据 FFmpeg。
  • 编码
    • 将原始视音频帧编码生成编码帧。
  • 复用
    • 将编码帧按不同流类型交织写入输出文件。

五、FFmpeg 特效处理 libavfilter

1、libavfilter 介绍

libavfilter 是 FFmpeg 提供的滤波器类,可以用其做一些音视频处理,如音视频倍速、水平翻转、裁剪、加方框、叠加文字等功能。

例如之前介绍过的音频重采样,视频的像素格式转换,本质上也是滤波,所以 libavfilter 也可以实现 libswresample、libswscale 提供的对音视频格式变换的功能。

2、ffmpeg 添加水印基本流程

这里主要讲述如何利用 ffmpeg 向视频文件添加水印这一功能,文中最后会给出源代码下载地址以及视频下载地址,视频除了讲述添加水印的基本原理以及代码实现,还提到了要注意的一些地方,因为直接运行 demo 源码可能会有问题。

利用 ffmpeg 向视频文件添加水印的基本原理是将视频文件的视频包解码成一帧帧 “Frame”,通过 ffmpeg Filter(overlay)实现待添加水印与 “Frame” 的叠加,最后将叠加后的视频帧进行编码并将编码后的数据写到输出文件里。

基本的流程如下图所示:
在这里插入图片描述

3、ffmpeg 向视频中添加文字

ffmpeg 支持添加文字能,具体如何将文字叠加到视频中的每一张图片,ffmpeg 调用了文字库 FreeSerif.ttf。

当我们用到 ffmpeg 添加文字功能时我们需要先下载改文字库,下载地址是:http://www.fonts2u.com/free-serif.font,这算是前期准备工作。
在这里插入图片描述
准备工作完成以后,介绍下 ffmpeg 实现视频文件添加文字功能的基本流程,流程图如下图所示:
在这里插入图片描述

4、实战测试

首先我们先截取一个 10s 的本地视频文件

ffmpeg -ss 0 -t 10 -i SampleVideo_1280x720_20mb.flv -c copy -f flv -y SampleVideo_1280x720_20mb_10s.flv

回显如下

D:\Work\test>ffmpeg -ss 0 -t 10 -i SampleVideo_1280x720_20mb.flv -c copy -f flv -y SampleVideo_1280x720_20mb_10s.flv
ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberbandlibavutil      58.  2.100 / 58.  2.100libavcodec     60.  3.100 / 60.  3.100libavformat    60.  3.100 / 60.  3.100libavdevice    60.  1.100 / 60.  1.100libavfilter     9.  3.100 /  9.  3.100libswscale      7.  1.100 /  7.  1.100libswresample   4. 10.100 /  4. 10.100libpostproc    57.  1.100 / 57.  1.100
Input #0, flv, from 'SampleVideo_1280x720_20mb.flv':Metadata:major_brand     : isomminor_version   : 512compatible_brands: isomiso2avc1mp41encoder         : Lavf60.3.100Duration: 00:01:57.31, start: 0.000000, bitrate: 1442 kb/sStream #0:0: Video: h264 (Main), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1048 kb/s, 25 fps, 25 tbr, 1k tbnStream #0:1: Audio: aac (LC), 48000 Hz, 5.1, fltp, 383 kb/s
Output #0, flv, to 'SampleVideo_1280x720_20mb_10s.flv':Metadata:major_brand     : isomminor_version   : 512compatible_brands: isomiso2avc1mp41encoder         : Lavf60.3.100Stream #0:0: Video: h264 (Main) ([7][0][0][0] / 0x0007), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1048 kb/s, 25 fps, 25 tbr, 1k tbnStream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 48000 Hz, 5.1, fltp, 383 kb/s
Stream mapping:Stream #0:0 -> #0:0 (copy)Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=  250 fps=0.0 q=-1.0 Lsize=    1723kB time=00:00:09.98 bitrate=1414.0kbits/s speed=1.46e+03x
video:1244kB audio:467kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.769128%D:\Work\test>

在这里插入图片描述
使用 Everything 工具找到 simhei.ttf 将其拷贝到待添加水印的视频目录下
在这里插入图片描述
接下来我们在这个 10s 的视频上面添加一个文字跑马灯水印,执行下面命令:

ffmpeg -i SampleVideo_1280x720_20mb_10s.flv -acodec aac -vcodec libx264 -r 30 -g 300 -vf "drawtext=fontfile=simhei.ttf:text='hello world!':x=10:y=h-80:enable=lt(mod(t\,3)\,2):fontsize=50:fontcolor=red@0.5:shadowy=2" -f flv -y SampleVideo_1280x720_20mb_wm2.flv
  • -i:设定输入流
  • -acodec aac:指定音频 aac 编码
  • -vcodec libx264:设定视频编解码器为 libx264
  • -r 30:一秒钟播 30 帧
  • -g 300:GOP,300 个帧里面才有一个 I 帧
  • -vf:视频过滤器
  • enable=lt(mod(t,3),2):播放时间对 3 求余数,当小于等于 2 的时候显示,也就是说每 3 秒中显示 2 秒灭 1 秒
  • @0.5:透明度
  • shadowy=2:阴影

执行后回显如下:

D:\Work\test>ffmpeg -i SampleVideo_1280x720_20mb_10s.flv -acodec aac -vcodec libx264 -r 30 -g 300 -vf "drawtext=fontfile=simhei.ttf:text='你好: hello':x=10:y=h-80:enable=lt(mod(t\,3)\,2):fontsize=50:fontcolor=red@0.5:shadowy=2" -f flv -y SampleVideo_1280x720_20mb_wm2.flv
ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberbandlibavutil      58.  2.100 / 58.  2.100libavcodec     60.  3.100 / 60.  3.100libavformat    60.  3.100 / 60.  3.100libavdevice    60.  1.100 / 60.  1.100libavfilter     9.  3.100 /  9.  3.100libswscale      7.  1.100 /  7.  1.100libswresample   4. 10.100 /  4. 10.100libpostproc    57.  1.100 / 57.  1.100
Input #0, flv, from 'SampleVideo_1280x720_20mb_10s.flv':Metadata:major_brand     : isomminor_version   : 512compatible_brands: isomiso2avc1mp41encoder         : Lavf60.3.100Duration: 00:00:10.01, start: 0.000000, bitrate: 1411 kb/sStream #0:0: Video: h264 (Main), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1048 kb/s, 25 fps, 25 tbr, 1k tbnStream #0:1: Audio: aac (LC), 48000 Hz, 5.1, fltp, 383 kb/s
Stream mapping:Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
Fontconfig error: Cannot load default config file: No such file: (null)
[Parsed_drawtext_0 @ 0000020b250b80c0] Using "C:/Windows/fonts\CascadiaCode.ttf"
[libx264 @ 0000020b24cce480] using SAR=1/1
[libx264 @ 0000020b24cce480] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0000020b24cce480] profile High, level 3.1, 4:2:0, 8-bit
[libx264 @ 0000020b24cce480] 264 - core 164 r3106 eaa68fa - H.264/MPEG-4 AVC codec - Copyleft 2003-2023 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=22 lookahead_threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=300 keyint_min=30 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, flv, to 'SampleVideo_1280x720_20mb_wm2.flv':Metadata:major_brand     : isomminor_version   : 512compatible_brands: isomiso2avc1mp41encoder         : Lavf60.3.100Stream #0:0: Video: h264 ([7][0][0][0] / 0x0007), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 1k tbnMetadata:encoder         : Lavc60.3.100 libx264Side data:cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/AStream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 48000 Hz, 5.1, fltp, 341 kb/sMetadata:encoder         : Lavc60.3.100 aac
frame=  300 fps=196 q=-1.0 Lsize=    2018kB time=00:00:09.98 bitrate=1655.5kbits/s dup=50 drop=0 speed=6.52x
video:1582kB audio:422kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.706711%
[libx264 @ 0000020b24cce480] frame I:2     Avg QP:16.30  size: 76289
[libx264 @ 0000020b24cce480] frame P:162   Avg QP:21.71  size:  7884
[libx264 @ 0000020b24cce480] frame B:136   Avg QP:27.74  size:  1392
[libx264 @ 0000020b24cce480] consecutive B-frames: 28.0% 32.7%  6.0% 33.3%
[libx264 @ 0000020b24cce480] mb I  I16..4: 22.7% 32.6% 44.7%
[libx264 @ 0000020b24cce480] mb P  I16..4:  0.9%  1.5%  0.2%  P16..4: 28.7%  7.2%  3.6%  0.0%  0.0%    skip:58.0%
[libx264 @ 0000020b24cce480] mb B  I16..4:  0.1%  0.1%  0.0%  B16..8: 28.1%  0.8%  0.1%  direct: 0.2%  skip:70.7%  L0:48.3% L1:49.7% BI: 2.0%
[libx264 @ 0000020b24cce480] 8x8 transform intra:49.5% inter:54.9%
[libx264 @ 0000020b24cce480] coded y,uvDC,uvAC intra: 51.3% 66.0% 23.6% inter: 7.1% 9.2% 0.5%
[libx264 @ 0000020b24cce480] i16 v,h,dc,p: 28% 31% 11% 30%
[libx264 @ 0000020b24cce480] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 22% 20%  4%  6%  6%  5%  5%  6%
[libx264 @ 0000020b24cce480] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 14% 11%  8%  8%  9%  7% 12%  7%
[libx264 @ 0000020b24cce480] i8c dc,h,v,p: 51% 20% 21%  8%
[libx264 @ 0000020b24cce480] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0000020b24cce480] ref P L0: 81.7% 11.4%  5.9%  1.0%
[libx264 @ 0000020b24cce480] ref B L0: 95.0%  4.8%  0.2%
[libx264 @ 0000020b24cce480] ref B L1: 98.3%  1.7%
[libx264 @ 0000020b24cce480] kb/s:1295.36
[aac @ 0000020b250d0b80] Qavg: 1102.865

可以看到本地生成了一个 SampleVideo_1280x720_20mb_wm2.flv 文件
在这里插入图片描述
打开视频可以看到左下角 hello world 闪烁效果
在这里插入图片描述


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132644.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JetBrains设置inline hint的背景色、前景色

如题。修改IDE的hint前景色和背景色。 修改后结果:

redis深度历险 1 - Redis基础数据结构-001

Redis有5种基础数据结构,分别为: string (字符串)、list(列表)、set (集合)、hash (哈希)和zset (有序集合)。熟练掌握这5种基本数据结构的使用是Redis 知识最基础也最重要的部分,它也是在 Redis面试题中问到最多的内容。 1 字符串 string …

【论文阅读】MARS:用于自动驾驶的实例感知、模块化和现实模拟器

【论文阅读】MARS:用于自动驾驶的实例感知、模块化和现实模拟器 Abstract1 Introduction2 Method2.1 Scene Representation2.3 Towards Realistic Rendering2.4 Optimization3.1 Photorealistic Rendering3.2 Instance-wise Editing3.3 The blessing of moduler des…

【深度学习】 Python 和 NumPy 系列教程(十八):Matplotlib详解:2、3d绘图类型(4)3D曲面图(3D Surface Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 0. 设置中文字体 1. 3D线框图(3D Line Plot) 2. 3D散点图(3D Scatter Plot) 3. 3D条形图(3D Bar Plot) 4. 3D曲面图…

VMware vCenter 从6.7跨版本升级至7.0U3N

本文尝试使用 vCenter Server Appliance 管理界面 (VAMI) 进行对vCenter Server Appliance7应用进行小版本升级,从6.7.0.47000升级到7.0.3.01600(7.0U3N)。 一、升级前的准备工作 1、检查当前运行环境(当前为6.7.0.47000&#x…

【数据结构-树】AVL树

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

MFC中嵌入显示opencv窗口

在MFC窗体中建立一个Picture Control控件,用于显示opencv窗口 在属性中设置图片控件的资源ID为IDC_PIC1 主要的思路: 使用GetWindowRect可以获取图片控件的区域 使用cv::resizeWindow可以设置opencv窗口的大小,适合图片控件的大小 使用cvGetWindowHandle函数可以获取到ope…

Flutter 通过BottomSheetDialog实现抖音打开评论区,内容自动上推、缩放效果

一、先来看下实现的效果 实现上面的效果需要解决俩个问题 当列表进行向下滑动到顶部的时候,继续滑动可以让弹窗向下收起来弹出上下拖动的时候,视图内容跟着上下移动、缩放大小 二、实现弹窗上下滑动的时候,动态改变内容区的位置和大小 通过…

PPT 生成整数序列字典序的r-组合算法

生成整数序列字典序的r-组合算法 一、PPT效果展示二、问题2.1 简述2.2 算法简述2.3 例子 三、PPT实现 一、PPT效果展示 二、问题 2.1 简述 给定一个整数序列 (1,2,3,…n),输出其所有字典序的r-组合,注意事项&#xf…

前端html原生页面兼容多端H5和移动端适配方案

目录 图片代码最后 图片 是一个注册页面 代码 自己查看效果 注意: 单位全部用rem这样才能保证兼容性适配多端&#xff0c;px转rem转换公式 1px 1/37.5rem 所以想要20px应该对应20/37.5 0.53rem <!DOCTYPE html> <html lang"en"><head><met…

关于时空数据的培训 GAN:实用指南(第 01/3 部分)

第 1 部分&#xff1a;深入了解 GAN 训练中最臭名昭著的不稳定性。 一、说明 GAN 是迄今为止最受欢迎的深度生成模型&#xff0c;主要是因为它们最近在图像生成任务上产生了令人难以置信的结果。然而&#xff0c;GAN并不容易训练&#xff0c;因为它们的基本设计引入了无数的不稳…

可变参数JAVA

public class Main {public static void main(String[] args) {//方法形参的个数是可以变化的//格式&#xff1a;属性类型...名字System.out.println(getSum(1,2,3,4,5,6,7,8));}//通过键值对对象来遍历&#xff1b;public static int getSum(int a,int...args){//可变参数;int…

ArcGIS 10.7安装教程!

软件介绍&#xff1a;ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成地图生产全过程&#xff0c;为地图分析和处理提供了新的解决方…

【蓝桥杯选拔赛真题60】Scratch旋转风车 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch旋转风车 一、题目要求 编程实现 二、案例分析 1、角色分析

Linux自动化构建项目工具——Makefile/makefile

目录 一&#xff0c;背景知识 二&#xff0c;makefile/Makefile的编写 1.创建makefile/Makefile文件 2.在Makefile文件里写编译代码 3.伪目标——.PHONY 1.伪目标的特点 2.怎样实现总是被执行 4.Makefile/makefile文件的不同编写风格 1.背景知识 2.改写 一&#xff0c;背…

goaccess 日志分析 nginx

分析命令&#xff1a; goaccess -a -d -f /mnt/winshare/access-2023070112.log -p goaccess.conf -o /mydata/nginx/html/2023070112_new.html分析日志时的参数 goaccess使用参数详解-a 开启 UserAgent 列表。开启后会降低解析速度 -c 在程序开始运行时显示 日志/日期 配…

nbcio-boot移植到若依ruoyi-nbcio平台里一formdesigner部分(三)

因为这个版本的若依plus不支持本地文件上传&#xff0c;所以需要增加这些本地上传文件的后端代码 和前端代码修改。 1、后端部分 先配置跳过测试吧&#xff0c;平时编译也不需要这个 <!--添加配置跳过测试--><plugin><groupId>org.apache.maven.plugins<…

新增动态排序图、桑基图、AntV组合图,DataEase开源数据可视化分析平台v1.18.10发布

2023年9月14日&#xff0c;DataEase开源数据可视化分析平台正式发布v1.18.10版本。 这一版本的功能升级包括&#xff1a;数据集方面&#xff0c;对字段管理的后台保存做了相关优化&#xff0c;降低了资源消耗&#xff1b;仪表板方面&#xff0c;对联动、查询结果以及过滤组件等…

分享!JetBrains IDE中的GitLab支持

GitLab是流行的基于git的软件开发和部署平台之一&#xff0c;虽然很长一段时间以来&#xff0c;所有基本git操作都已经可以通过GitLab实现&#xff0c;但GitLab集成仍是JetBrains社区的一大最热门请求。为此&#xff0c;JetBrains团队今年与GitLab联手提供了这种类型的集成。 …

PWA及小程序在系统生态方面的支持对比

PWA代表“渐进式网络应用”&#xff08;Progressive Web Application&#xff09;。它是一种结合了网页和移动应用程序功能的技术概念。PWA旨在提供类似于原生应用程序的用户体验&#xff0c;包括离线访问、推送通知、后台同步等功能&#xff0c;同时又具有网页的优势&#xff…