音视频剪辑|Windows|抽帧和合帧

什么是抽帧?

FFmpeg 抽帧(Extracting frames)的作用是从视频文件中按需提取单张或多张静止图像(帧),并将它们保存为图片文件(如 JPEG、PNG 等格式)。这一功能在以下场合十分有用:

  1. 制作GIF或截图

    • 从视频中提取某一帧或几帧,可以生成有趣的动态GIF,或者静态截图用于文章、报告、演示文稿等。
  2. 视频剪辑预览

    • 在视频剪辑的过程中,可以通过抽帧快速浏览视频中的关键帧,帮助剪辑师决定哪些镜头适合使用,或者标记重要的剪辑点。
  3. 机器学习与计算机视觉

    • 在机器学习和计算机视觉领域,经常需要从视频中提取帧,用于训练深度学习模型。例如,进行物体检测、人脸识别、动作识别等任务时,大量的图像样本至关重要。
  4. 帧分析与修复

    • 从视频中抽出帧,可以针对每一帧进行单独的分析和修复,比如去噪、色彩校正、锐化等操作。
  5. 视频制作特效

    • 在动画制作、影视后期制作中,通过抽取视频中的关键帧,可以进行逐帧的手动编辑和绘制,制作出独特的视觉效果。
  6. 质量检查

    • 对视频质量进行检查时,抽帧可以帮助技术人员精确地观察每一帧的画面质量,如清晰度、颜色准确度、是否存在瑕疵等。
  7. 帧序列输出

    • 将视频转换为一系列连续的图片,可用于打印、拼接等多种用途,或者用于渲染成动画或视频游戏等场景。

FFmpeg 抽帧的命令一般格式如下:

 

Sh

ffmpeg -i C:\Users\Administrator\Desktop\111.mp4 -framerate 5 -v 5 -vfrwamers 20 -f image2 d:\222\image_%3d.jpeg

其中,frame_number 表示要抽取的帧编号,output_frame_%04d.png 表示输出图片的命名格式(每一张图片编号递增)。通过调整 select 过滤器的表达式,可以实现灵活的抽帧需求。

一,

抽帧实例

先查看原视频1的帧率信息这些:

C:\Users\Administrator>ffprobe -i C:\Users\Administrator\Desktop\111.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\Administrator\Desktop\111.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.20.100
  Duration: 00:00:14.60, start: 0.000000, bitrate: 1983 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/smpte170m, progressive), 720x1280, 1927 kb/s, 30 fps, 30 tbr, 90k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 47 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

可以看到该视频在桌面,名称为111.mp4,一个视频流,时长是14.6秒,帧率是30fps,格式为h264,视频大小是720*1280;音频流为44100Hz,aac编码格式的

那么,很简单,可以计算出此视频大概会抽帧出来的图片为30*14.6=438张的图片

原视频2的音视频信息:

C:\Users\Administrator>ffprobe -i D:\tejing.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\tejing.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 1250 kb/s
  Stream #0:0[0x1](chi): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](chi): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

这个原视频2是我从电影里抽取的,视频长度是10秒,帧率是25fps,格式为h264,视频大小是1280*720;音频流为44100Hz,aac编码格式的

那么,很简单,可以计算出此视频大概会抽帧出来的图片为25*10=250张的图片

下面开始抽帧,全部帧都抽取出来:

ffmpeg   -i D:\tejing.mp4  -framerate 10   d:\222\image_%3d.jpeg

那么,这个framerate 在这里其实好像没有什么意义,但可以看到确实全部抽帧,确实是250张图片,每个图片的清晰度也是比较好的,图片分辨率和视频是一致的都是1280*720

抽帧的同时图片分辨率修改为720*520

C:\Users\Administrator>ffmpeg   -i D:\tejing.mp4  -framerate 10  -s 720*520  d:\222\image_%3d.jpeg -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\tejing.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 1250 kb/s
  Stream #0:0[0x1](chi): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](chi): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0000016583b3ce80] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'd:\222\image_%3d.jpeg':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Stream #0:0(chi): Video: mjpeg, yuvj420p(pc, progressive), 720x520 [SAR 104:81 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
[out#0/image2 @ 00000165ffb1abc0] video:2715kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
frame=  250 fps=0.0 q=24.8 Lsize=N/A time=00:00:09.96 bitrate=N/A speed=40.9x

只抽取2秒的视频帧,2秒就是50张图片,可以看到确实只抽了50张图片,关键参数-vframes 50 :

C:\Users\Administrator>ffmpeg   -i D:\tejing.mp4  -framerate 10 -vframes 50 -vf "select=not(mod(n\,15))"  d:\222\image_%3d.jpeg -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\tejing.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 1250 kb/s
  Stream #0:0[0x1](chi): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](chi): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0000014c2483bf00] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'd:\222\image_%3d.jpeg':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Stream #0:0(chi): Video: mjpeg, yuvj420p(pc, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
[out#0/image2 @ 0000014c20a68300] video:1233kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
frame=   50 fps=0.0 q=24.8 Lsize=N/A time=00:00:01.96 bitrate=N/A dup=56 drop=0 speed=21.9x

每25帧抽一帧,均匀抽帧

因为帧率fps是25,因此抽取10个图片,均匀抽取,关键参数-vsync vfr

C:\Users\Administrator>ffmpeg   -i D:\tejing.mp4  -framerate 10 -vf "select=not(mod(n\,25))" -vsync vfr   d:\222\image_%3d.jpeg -hide_banner
-vsync is deprecated. Use -fps_mode
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\tejing.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 1250 kb/s
  Stream #0:0[0x1](chi): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](chi): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 000001c54248b500] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'd:\222\image_%3d.jpeg':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Stream #0:0(chi): Video: mjpeg, yuvj420p(pc, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
[out#0/image2 @ 000001c53e369500] video:342kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
frame=   10 fps=0.0 q=19.4 Lsize=N/A time=00:00:09.00 bitrate=N/A speed= 127x

 每隔5帧抽一帧:

###这里提示-vsync参数已经过期,以后可能要废弃,要改为-fps_mode 这个参数

C:\Users\Administrator>ffmpeg   -i D:\tejing.mp4  -framerate 10 -vf "select=not(mod(n\,5))" -vsync vfr   d:\222\image_%3d.jpeg -hide_banner
-vsync is deprecated. Use -fps_mode
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\tejing.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 1250 kb/s
  Stream #0:0[0x1](chi): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](chi): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 000001e0c80e8480] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'd:\222\image_%3d.jpeg':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Stream #0:0(chi): Video: mjpeg, yuvj420p(pc, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
[out#0/image2 @ 000001e0c3f690c0] video:1174kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
frame=   50 fps=0.0 q=24.8 Lsize=N/A time=00:00:09.80 bitrate=N/A speed=90.3x

因此,命令可以修改为如下:

ffmpeg   -i D:\tejing.mp4  -framerate 10 -vf "select=not(mod(n\,5))" -fps_mode vfr   d:\222\image_%3d.jpeg -hide_banner

二、

合帧实例

以上面的最后一个抽帧取出的图片为例,将这50张图片合成为一个新的视频:

说明:vcodec 是指定视频的编码格式,一般常用的视频格式是libx264,因为是50张图片合成,因此,指定帧率是25,这样视频的长度就是2秒了

C:\Users\Administrator>ffmpeg -f image2 -r 25 -i d:\222\image_%3d.jpeg -vcodec libx264  test1.mp4 -y -hide_banner
Input #0, image2, from 'd:\222\image_%3d.jpeg':
  Duration: 00:00:01.67, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 30 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 00000176db102a80] using SAR=1/1
[libx264 @ 00000176db102a80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 00000176db102a80] profile High, level 3.1, 4:2:0, 8-bit
[libx264 @ 00000176db102a80] 264 - core 164 r3172 c1c9931 - 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=250 keyint_min=25 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, mp4, to 'test1.mp4':
  Metadata:
    encoder         : Lavf60.16.100
  Stream #0:0: Video: h264 (avc1 / 0x31637661), yuvj420p(pc, bt470bg/unknown/unknown, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 15360 tbn
    Metadata:
      encoder         : Lavc60.31.102 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
[out#0/mp4 @ 00000176db17c380] video:628kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.228960%
frame=   50 fps=0.0 q=-1.0 Lsize=     630kB time=00:00:01.56 bitrate=3292.7kbits/s speed=5.83x
[libx264 @ 00000176db102a80] frame I:1     Avg QP:24.53  size: 24782
[libx264 @ 00000176db102a80] frame P:13    Avg QP:22.08  size: 17738
[libx264 @ 00000176db102a80] frame B:36    Avg QP:24.48  size: 10758
[libx264 @ 00000176db102a80] consecutive B-frames:  4.0%  0.0%  0.0% 96.0%
[libx264 @ 00000176db102a80] mb I  I16..4: 26.2% 69.1%  4.8%
[libx264 @ 00000176db102a80] mb P  I16..4: 19.6% 42.9%  1.4%  P16..4:  7.3%  3.9%  2.3%  0.0%  0.0%    skip:22.7%
[libx264 @ 00000176db102a80] mb B  I16..4:  7.9% 21.8%  0.1%  B16..8: 16.0%  5.9%  1.9%  direct: 5.8%  skip:40.6%  L0:49.5% L1:44.2% BI: 6.3%
[libx264 @ 00000176db102a80] 8x8 transform intra:70.4% inter:88.9%
[libx264 @ 00000176db102a80] coded y,uvDC,uvAC intra: 47.9% 68.7% 3.6% inter: 12.4% 19.5% 0.2%
[libx264 @ 00000176db102a80] i16 v,h,dc,p: 52% 30% 16%  3%
[libx264 @ 00000176db102a80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 17% 42%  4%  1%  1%  1%  2%  5%
[libx264 @ 00000176db102a80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 43% 29% 12%  2%  3%  3%  3%  3%  2%
[libx264 @ 00000176db102a80] i8c dc,h,v,p: 39% 25% 33%  3%
[libx264 @ 00000176db102a80] Weighted P-Frames: Y:7.7% UV:0.0%
[libx264 @ 00000176db102a80] ref P L0: 50.0% 14.5% 17.6% 15.7%  2.2%
[libx264 @ 00000176db102a80] ref B L0: 72.8% 19.4%  7.8%
[libx264 @ 00000176db102a80] ref B L1: 86.9% 13.1%
[libx264 @ 00000176db102a80] kb/s:3084.74

查看合成的视频长度,确实是2秒了:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\Administrator\test1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:02.00, start: 0.000000, bitrate: 2716 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt470bg/unknown/unknown, progressive), 1280x720 [SAR 1:1 DAR 16:9], 2710 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264

上面的合帧命令-r 修改为5,那么,50/5 就是10秒的视频了,查看新的合成视频,可以看到确实是10秒了,也可以正常的打开播放:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\Administrator\test1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 790 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt470bg/unknown/unknown, progressive), 1280x720 [SAR 1:1 DAR 16:9], 789 kb/s, 5 fps, 5 tbr, 10240 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

入侵检测系统的设计与实现

入侵检测系统(Intrusion Detection System,简称IDS)是一种能够监视网络或计算机系统活动的安全工具,旨在识别并响应可能的恶意行为或安全事件。这些事件可能包括未经授权的访问、恶意软件、拒绝服务攻击等。入侵检测系统通过不同的…

【Python笔记-设计模式】装饰器模式

一、说明 装饰器模式是一种结构型设计模式,旨在动态的给一个对象添加额外的职责。 (一) 解决问题 不改变原有对象结构的情况下,动态地给对象添加新的功能或职责,实现透明地对对象进行功能的扩展。 (二) 使用场景 如果用继承来扩展对象行…

python 3.7.3的安装

参考 Linux安装Python3.7-良许Linux教程网 (lxlinux.net) 1、Index of /ftp/python/3.7.9/ 1、安装gcc,yum -y install gcc 2、 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel…

主流开发语言和开发环境:探索编程世界的基础

在当今这个快速发展的技术时代,软件开发已经成为推动创新的重要力量。无论是构建下一代应用、开发先进的算法还是创建复杂的系统,选择合适的编程语言和开发环境都是至关重要的。在本文中,我们将探讨当前流行的几种主流开发语言以及它们常用的…

展锐S8000安卓核心板参数_紫光展锐5G核心板模块定制方案

展锐S8000核心板模块是基于八核S8000平台开发设计的,采用了先进的6nm EUV制程技术。搭载了全新的智能Android 13操作系统,展现出超强的画面解析能力和高性能双通道MIPI,拥有120Hz高刷新率,独立NPU和3.2TOPS Al算力,同时…

python实现维特比算法

对于维特比算法,首先想到的就是高通公司,对于现在的通信行业的两大巨头公司之一,高通公司的发家是由器创始人维特比发明了一种高效的通信解码技术,维特比算法。 对于维特比算法是什么,以一个例子来讲述什么是维特比算…

Xcode中App图标和APP名称的修改

修改图标 选择Assets文件 ——> 点击Applcon 换App图标 修改名称 点击项目名 ——> General ——> Display Name

问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因 在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统,上面三个函数会被频繁的触发&am…

新代码质量评审标准与评分表格

前面发了一个《代码质量评审标准与评分表格》,是比较宽泛的,下面发一个更贴近具体场景的《新代码质量评审标准与评分表格》。 一、引言 本文档旨在为代码质量评审提供一个统一的标准和评分机制,以确保代码质量、可读性和可维护性。通过遵循这…

单片机04__基本定时器__毫秒微秒延时

基本定时器__毫秒微秒延时 基本定时器介绍(STM32F40x) STM32F40X芯片一共包含14个定时器,这14个定时器分为3大类: 通用定时器 10个 TIM9-TIM1和TIM2-TIM5 具有基本定时器功能, 还具有输入捕获,输出比较功…

桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、实例详解五、优缺点分析总结: 一、引言 ​ 桥接模式是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构&…

普中51单片机学习(DS1302)

DS1302时钟 DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。内部含有31个字节静态RAM,可提供用户访问。采用串行数据传送方式,使得管脚数量最少,简单SPI 3线接口。工作电压…

初识表及什么是数据表

一、了解表 1.1.概述 表是处理数据和建立关系型数据库及应用程序的基本单元,是构成数据库的基本元素之一,是数据库中数据组织并储存的单元,所有的数据都能以表格的形式组织,目的是可读性强。 1.2.表结构简述 一个表中包括行和列…

下载 axios.js 文件到本地【linux】

方式一 npm install axios在$NODE_PATH/node_modules/axios/dist路径下即可找到axios.js。 方式二 1、百度搜索 GitHub 官网:https://github.com/ 2、搜索 axios 3、点击 axios/axios 4、下载到本地 5、解压,进入到 dist 文件夹** 参考&#x…

实现可拖拽的页面元素排序更新数据库排序

摘要: 拖拽列表改变路边排序,并且更新后台数据库列表的排序,重新请求的时候获取拖拽后的排序! Layui: // 拖拽内页顺序list document.querySelector(#view_side_tab);// 创建cruentItem存放将要拖动的元素let cruen…

Zookeeper经典应用场景实战

Zookeeper经典应用场景实战 ZK的不足之处 watcher检测是一次性的,每次触发之后都需要重新注册会话超时之后没有实现重连机制异常处理繁琐仅提供byte数组类型的接口,没提供java实体序列化级接口创建节点时如果抛出异常,需要自行检查节点是否…

【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量形状操作

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算2. 矩阵…

【MySQL】多表操作、事务、索引

MySQL MYSQL 多表设计 一对多插入测试数据外键约束(物理外键)使用逻辑外键 MYSQL 多表设计 一对一表结构 MYSQL 多表设计 多对多 MYSQL 多表设计 一对多 建表语句 员工表 CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT ID,username VARCHAR(20) N…

130 如何通过vs2017开发linux c++程序

使用VS2017开发linux下的应用程序(C/C)_vc_linux.exe vs2017-CSDN博客 参考上面这哥们的,写的很详细 前言 本文章记录如何使用VS2017进行linux应用程序的开发(针对新手小白),VS2017能较为方便的通过SSH编辑…

强大的文本绘图——PlantUML

PlantUML是一款开源工具,它允许用户通过简单的文本描述来创建UML图(统一建模语言图)。这种方法可以快速地绘制类图、用例图、序列图、状态图、活动图、组件图和部署图等UML图表。PlantUML使用一种领域特定语言(DSL)&am…