【FFmpeg从入门到精通】第三章-FFmpeg转封装
1 音视频文件转MP4格式
在互联网常见的格式中,跨平台最好的应该是MP4文件,因为MP4文件既可以在PC平台的 Flashplayer 中播放,又可以在移动平台的 Android、ios 等平台中进行播放,而且使用系统默认的播放器即可播放,因此我们说MP4格式是最常见的多媒体文件格式。本章首先重点介绍MP4封装的基本格式。
1.1 MP4格式标准介绍
如果要了解 MP4的格式信息,首先要清楚几个概念,具体如下。
- MP4文件由许多个Box与FullBox组成
- 每个Box由Header和 Data两部分组成
- FullBox是Box的扩展,其在Box结构的基础上,在Header中增加8位version标志和 24 位的 flags 标志
- Header 包含了整个Box的长度的大小(size)和类型(type),当size等于0时,代表这个Box是文件的最后一个Box。当size等于1时,说明Box长度需要更多的位来描述,在后面会定义一个64位的largesize用来描述Box的长度。当Type为uuid 时,说明这个 Box中的数据是用户自定义扩展类型
- Data为Box的实际数据,可以是纯数据,也可以是更多的子Box
- 当一个 Box中 Data是一系列的子Box时,这个Box又可以称为Container(容器)Box
MP4文件中Box的组成可以用表所示的列表进行排列,表中标记“V”的Box为必要Box,否则为可选Box。
解析 MP4 多媒体文件时需要一些关键的信息
1 moov容器
2 解析mvhd容器
3 解析trak子容器
4 解析tkhd
5 解析mdia容器
6 解析mdhd容器
7 解析hdlr容器
8 解析minf容器
9 解析vmhd容器
10 解析smhd容器
11 解析dinf容器
12 解析stbl容器
13 解析edts容器
1.2 MP4分析工具
1 Elecard StreamEye
2 mp4box
3 mp4info
1.3 MP4在FFmpeg中的Demuxer
根据前面介绍过的查看FFmpeg的MP4文件的Demuxer的方法,使用命令行ffmpeg -h demuxer=mp4 查看 MP4 文件的 Demuxer 信息:
ffmpeg -h demuxer=mp4
Demuxer mov,mp4,m4a,3gp,3g2,mj2 [QuickTime / MOV]:
Common extensions: mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,avif,heic,heif.
如输出内容所示,通过查看FFmpeg的help信息,可以看到MP4的Demuxer与mov、3gp、m4a、3g2、mj2的 Demuxer 相同,解析 MP4 文件的参数如表所示。
参数 | 类型 | 说明 |
---|---|---|
use_absolute_path | 布尔 | 可以通过绝对路径加载外部的 track,可能会有安全因素的影响,默认不开启 |
seek_streams_individually | 布尔 | 根据单独流进行 seek,默认开启 |
ignore_editlist | 布尔 | 忽略 EditList Atom 信息,默认不开启 |
ignore_chapters | 布尔 | 忽略 Chapters 信息,默认不开启 |
enable_drefs | 布尔 | 外部 track 支持,默认不开启 |
1.4 MP4在FFmpeg中的Muxer
MP4的封装相对解封装来说稍微复杂一些
从参数的列表中可以看到,MP4的muxer支持的参数比较复杂,例如支持在视频关键帧处切片、支持设置moov容器大小的最大值、支持设置encrypt加密等。下面就对常见的参数进行举例说明。
1 faststart参数使用案例
正常情况下 ffmpeg生成moov是在mdat写完成之后再写入,可以通过参数faststart将moov容器移动至mdat的前面,下面参考一个例子:
ffmpeg -i input.mp4 -c copy -f mp4 output.mp4
2 dash参数使用案例
3 isml参数使用案例
2 视频文件转 FLV格式
在网络的直播与点播场景中,FLV也是一种常见的格式,FLV是Adobe发布的一种可以作为直播也可以作为点播的封装格式,其封装格式非常简单,均以FLVTAG的形式存在,并且每一个TAG都是独立存在的,接下来就来详细介绍一下FLV 标准。
2.1 FLV格式标准介绍
FLV 文件格式分为两部分:一部分为FLV文件头,另一部分为FLV文件内容。
1 FLV 文件头格式解析
根据表可以看出FLV文件头格式中签名字段占用了三字节,最终组成的三个字符分别为“FLV”;然后是文件的版本,常见的为1;接下来的一个字节前边5位为0,接着音频展示设置为1,然后下一位为0,再下一位为视频展示设置为1。如果是一个音视频都展示的FLV文件,那么这个字节会设置为0x05(00000101)。然后是4字节的数据,为FLV文件头数据的偏移位置。
2 FLV文件内容格式解析
3 FLVTAG格式解析
4 VideoTag 数据解析
5 AudioTag数据格式解析
6 ScriptData格式解析
2.2 FFmpeg 转 FLV 参数
使用FFmpeg生成FLV格式相对来说比较简单,下面就来查看FFmpeg生成FLV文件时可以使用的参数,具体见表
根据表中的参数可以看出,在生成FLV文件时,写人视频、音频数据时均需要写人 Sequence Header数据,如果FLV的视频流中没有Sequence Header,那么视频很有可能不会显示出来;如果FLV的音频流中没有Sequence Header,那么音频很有可能不会被播放出来。所以需要将fmpeg中的参数fvflags的值设置为aac_seqheader_detect,其将会写人音频 AAC的Sequence Header。
2.3 FFmpeg 文件转 FLV 举例
从前文的 FLV 标准中可以看到,FLV封装中可以支持的视频编码主要包含如下内容。
- Sorenson H.263
- Screen Video
- On2 VP6
- 带 Alpha 通道的 On2 VP6
- Screen Video 2
- H.264(AVC)
而 FLV 封装中支持的音频主要包含如下内容。
- 限行 PCM,大小端取决于平台
- ADPCM音频格式
- MP3
- 线性PCM,小端
- Nellymoser 16kHz Mono
- Nellymoser 8kHz Mono
- Nellymoser
- G.711 A-law
- G.711 mu-law
- 保留
- AAC
- Speex
- MP3 8kHz
如果封装FLV时,内部的音频或者视频不符合标准时,那么它们是肯定封装不进FLV的,而且还会报错。
解决方式:将不支持的音频转成flv支持的格式。
2.4 FFmpeg 生成带关键索引的FLV
在网络视频点播文件为FLV格式文件时,人们常用yamdi 工具先对FLV文件进行次转换,主要是将FLV文件中的关键帧建立一个索引,并将索引写人Metadata头中,这个步骤用FFmpeg 同样也可以实现,使用参数add_keyframe_index即可:
ffmpeg -i input.mp4 -c copy -f flv -flvflags add_keyframe_index output.flv
没成功
2.5 FLV 文件格式分析工具
flvparse和FlvAnalyzer,还有ffprobe
ffprobe -v trace -i output.flv
没成功
3 视频文件转 M3U8格式
3.1 M3U8 格式标准介绍
M3U8是一种常见的流媒体格式,主要以文件列表的形式存在,既支持直播又支持点播,尤其在 Android、iOS等平台最为常用,下面就来看一下M3U8的最简单的例子:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:3.760000
out0.ts
#EXTINF:1.880000
outl.ts
#EXTINF:1.760000
out2.ts
#EXTINF:1.040000
out3.ts
#EXTINF:1.560000
out4.ts
EXTM3U
M3U8文件必须包含的标签,并且必须在文件的第一行,所有的M3U8文件中必须包含这个标签
EXT-X-VERSION
M3U8文件的版本,常见的是3,其实版本已经发展了很多了,直至截稿时,已经发布到了版本7,经历了这么多版本,期间也对不少标记进行了增删
EXT-X-TARGETDURATION
每一个分片都会有一个分片自己的 duration,这个标签是最大的那个分片的浮点数四舍五入后的整数值,例如1.02四舍五入后的整数为1,2.568四舍五人后的整数为3,如果在M3U8 分片列表中的最大的duration 的数值为5.001,那么这个 EXT-X-TARGETDURATION值为 5。
EXT-X-MEDIA-SEOUENCE
M3U8直播时的直播切片序列,当播放打开M3U8时,以这个标签的值为参考,播放对应的序列号的切片。
EXTINF
EXTINF为M3U8列表中每一个分片的duration,如上面例子输出信息中的第一个分片的 duration为 4.120000秒;在EXTINF标签中除了duration值,还可以包含可选的描述信息,主要为标注切片信息,使用逗号分隔开。
3.2 FFmpeg转HLS参数
FFmpeg中自带HLS的封装参数,使用HLS格式即可进行HLS的封装,但是生成HLS的时候有各种参数可以进行参考,例如设置HLS列表中切片的前置路径、生成HLS的TS切片时设置TS的分片参数、生成HLS时设置M3U8列表中保存的TS个数等,详细参数请参考表
参数 | 类型 | 说明 |
---|---|---|
start_number | 整数 | 设置 M3U8 列表中的第一片的序列数 |
hls_time | 浮点数 | 设置每一片时长 |
hls_list_size | 整数 | 设置 M3U8 中分片的个数 |
hls_ts_options | 字符串 | 设置 TS 切片的参数 |
hls_wrap | 整数 | 设置切片索引回滚的边界值 |
hls_allow_cache | 整数 | 设置 M3U8 中 EXT-X-ALLOW-CACHE 的标签 |
hls_base_url | 字符串 | 设置 M3U8 中每一片的前置路径 |
hls_segment_filename | 字符串 | 设置切片名模板 |
hls_key_info_file | 字符串 | 设置 M3U8 加密的 key 文件路径 |
hls_subtitle_path | 字符串 | 设置 M3U8 字幕路径 |
hls_flags | 标签(整数) | 设置 M3U8 文件列表的操作,具体如下:<br>single_file: 生成一个媒体文件索引与字节范围<br>delete_segments: 删除 M3U8 文件中不包含的过期的 TS 切片文件<br>round_durations: 生成的 M3U8 切片信息的 duration 为整数<br>discont_start: 生成 M3U8 的时候在列表前边加上 discontinuity 标签<br>omit_endlist: 在 M3U8 末尾不追加 endlist 标签 |
use_localtime | 布尔 | 设置 M3U8 文件序号为本地时间戳 |
use_localtime_mkdir | 布尔 | 根据本地时间戳生成目录 |
hls_playlist_type | 整数 | 设置 M3U8 列表为事件或者点播列表 |
method | 字符串 | 设置 HTTP 属性 |
3.3 FFmpeg转HLS举例
常规的从文件转换 HLS 直播时,使用的参数如下
ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f hls output.m3u8
因为默认是HLS直播,所以生成的M3U8文件内容会随着切片的产生而更新,如果仔细观察,会发现命令行中多了一个参数“-bsf:vh264 mp4toannexb”,这个参数的作用是将MP4中的H.264数据转换为H.264 AnnexB 标准的编码,AnnexB 标准的编码常见于实时传输流中。如果源文件为FLV、TS等可作为直播传输流的视频,则不需要这个参数。生成HLS时还有一些参数可以设置,下面就来逐一介绍。有很多参数一已经不适用了,需要的时候再查询。
1 start_number 参数
2 hls_time 参数
3 hls_list_size 参数
4 hls_wrap 参数
5 hls_base_url参数
6 hls_segment_filename 参数
7 hls_flags 参数
8 use_localtime 参数
9 method 参数
4 视频文件切片
视频文件切片与HLS基本类似,但是HLS切片在标准中只支持TS格式的切片,并且是直播与点播切片,既可以使用segment方式进行切片,也可以使用ss加上t参数进行切片,下面重点介绍一下segment与ss加上t参数对视频文件进行剪切的方法。
4.1 FFmpeg切片 segment 参数
FFmpeg切片segment参数具体见表
4.2 FFmpeg切片segment 举例
1 segment_format指定切片文件的格式
通过使用segment format来指定切片文件的格式,前面讲述过HLS切片的格式主要为MPEGTS文件格式,那么在segment中,可以根据segmentformat来指定切片文件的格式,其既可以为MPEGTS切片,也可以为MP4切片,还也可以为FLV切片等,下面举例说明:
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 test_output-%d.mp4
然后查看第一片分片MP4的最后的时间戳:
ffprobe -v quiet -show_packets -select_streams c test_output-0.mp4 2 > x | grep pts_time | tail -n 3
2 segment_list与segment list type指定切片索引列表
使用 segment 切割文件时,不仅仅可以切割 MP4,同样也可以切割 TS或者 FLV 等文件,生成的文件索引列表名称也可以指定名称,当然,列表不仅仅是M3U8,也可以是其他的格式:
生成ffconcat格式索引文件
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type ffconcat -segment_list output.lst test_output-%d.mp4
生成FLAT格式索引文件
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type flat -segment_list filelist.txt test_output-%d.mp4
生成CSV格式索引文件
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type flat -segment_list filelist.csv test_output-%d.mp4
生成M3U8格式索引文件
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type m3u8 -segment_list output.m3u8 test_output-%d.mp4
3 reset_timestamps使切片时间截归0
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -reset_timestamps 1 test_output-%d.mp4
然后查看一下第一片末尾的时间戳:
ffprobe -v quiet -show_packets -select_streams c test_output-0.mp4 2 > x | grep pts_time | tail -n 3
4 segment_times按照时间点剪切
对文件进行切片时,有时候需要均匀的切片,有时候需要按照指定的时间长度进行切片,segment可以根据指定的时间点进行切片,下面举例说明:
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_times 3,9,12 test_output-%d.mp4
4.3 FFmpeg 使用ss与t参数进行切片
在FFmpeg 中,使用ss可以进行视频文件的seek定位,ss所传递的参数为时间值,t所传递的参数也为时间值,下面就来举例说明ss与t的作用。
1 使用ss指定剪切开头部分
在前面章节中介绍FFmpeg基本参数时,粗略地介绍过FFmpeg的基本转码原理FFmpeg自身的ss参数可以用作切片定位起始时间点,例如从一个视频文件的第10秒钟开始截取内容:
ffmpeg -ss 10 -i input.mp4 -c copy output.ts
命令行执行之后,生成的output.ts将会比input.mp4的视频少8秒,因为output.ts是从input.mp4的第8秒开始截取的,使用前面介绍过的fprobe分别获得input.mp4与output.ts 的文件 duration 并进行对比,信息如下:
ffprobe -v quiet -show_format input.mp4 | grep duration
ffprobe -v quiet -show_format output.ts | grep duration
2 使用t指定视频总长度
使用FFmpeg截取视频除了可以指定开始截取位置,还可以指定截取数据的长度FFmpeg的t参数可以指定截取的视频长度,例如截取input.mp4文件的前10秒的数据:
ffmpeg -i input.mp4 -c copy -t 10 -copyts output.mp4
命令行执行完之后,会生成一个时间从0开始的output.mp4,查看一下input.mp4与output.mp4的起始时间与长度相关信息:
ffprobe -v quiet -show_format input.mp4 | grep start_time
ffprobe -v quiet -show_format output.mp4 | grep start_timeffprobe -v quiet -show_format input.mp4 | grep duration
ffprobe -v quiet -show_format output.mp4 | grep duration
从两个文件的 duration信息可以看到,input的start time是0,duration是322.947948,而output.mp4的start time也是0,duration 则是10.010010,参数生效。
3 使用 output_ts_offset指定输出 start_time
FFmpeg 支持ss与t两个参数一同使用以达到切割视频的某一段的效果,但其并不能指定输出文件的 start time,而且也不希望时间戳归0,可以使用 output ts offset来达到指定输出文件的 start time的目的:
ffmpeg -i input.mp4 -c copy -t 10 -output_ts_offset 120 output.mp4
5 音视频文件音视频流抽取
当音视频文件出现异常时,除了分析封装数据之外,还需要分析音视频流部分,本节将重点介绍如何抽取音视频流,FFmpeg支持从音视频封装中直接抽取音视频数据,下面就来列举几个例子。
5.1 FFmpeg 抽取音视频文件中的 AAC 音频流
FFmpeg除了转封装、转码之外,还可以提取音频流,例如需要将音频流提取出来然后合成之后插人到另一个封装中的情况,下面就来看一下FFmpeg 提取 MP4文件中的AAC音频流的方法:
ffmpeg -i input.mp4 -vn -acodec copy output.aac
5.2 FFmpeg 抽取音视频文件中的 H.264 视频流
有时在视频编辑场景中需要将视频流提取出来进行编辑,或者与另一路视频流进行合并等操作,这时可以使用FFmpeg来完成:
ffmpeg -i input.mp4 -c:v libx264 -an output.h264
5.3 FFmpeg 抽取音视频文件中的 H.265 数据
ffmpeg -i input.mp4 -c:v libx265 -an output.hevc
6 系统资源使用情况
在使用FFmpeg进行格式转换、编码转换操作时,所占用的系统资源各有不同,如果使用FFmpeg 仅仅转换封装格式而并非转换编码,那么其使用的CPU资源并不多,下面来看一下转换封装时的CPU使用率:
ffmpeg -re -i input.mp4 -c copy -f mpegts output.tstop
通过图可以看出,使用FFmpeg进行封装转换时并不会占用大量的CPU资源,因为使用FFmpeg进行封装转换时主要是以读取音视频数据、写人音视频数据为主,并不会涉及复杂的计算。
如果使用 FFmpeg 进行编码转换,则需要进行大量的计算,从而将会占用大量的CPU资源
ffmpeg -re -i input.mp4 -vcodec libx264 -acodec copy -f mpegts output.tstop
相关文章:
【FFmpeg从入门到精通】第三章-FFmpeg转封装
1 音视频文件转MP4格式 在互联网常见的格式中,跨平台最好的应该是MP4文件,因为MP4文件既可以在PC平台的 Flashplayer 中播放,又可以在移动平台的 Android、ios 等平台中进行播放,而且使用系统默认的播放器即可播放,因…...
PG数据库推进医疗AI向量搜索优化路径研究(2025年3月修订版)
PG数据库推进医疗AI向量搜索优化路径研究 一、医疗 AI 向量搜索的发展现状与挑战 1.1 医疗数据特征与检索需求 医疗数据作为推动医疗领域进步与创新的关键要素,具有鲜明且复杂的特征。从多模态角度看,医疗数据涵盖了结构化数据,如患者基本信息、检验检查报告中的数值结果;…...
Android 下拉栏中的禁用摄像头和麦克风隐藏
Android 下拉栏中的禁用摄像头和麦克风隐藏 文章目录 Android 下拉栏中的禁用摄像头和麦克风隐藏一、前言二、下拉框中的禁用摄像头和麦克风隐藏实现1、设置支持属性为false2、修改代码 三、其他1、下拉栏中的禁用摄像头和麦克风隐藏小结2、 Android SensorPrivacyService ps&a…...
阿里云Clickhouse 冷热数据分层存储 实战记录
一、 背景 某业务Clickhouse库月数据增长超过2.5T,云上Clickhouse容量并不是无限的,单节点有32T上限,而业务已使用一半以上,依此速度,半年内就将达到上限。 与业务讨论,大致有以下几种解决思路:…...
ARINC818-实现
1.编码和解码;分隔符插入和删除;空闲idle字符插入 2.视频TX和RX接口:可以设计为流传输和帧同步传输 3.传输媒介:光纤或者铜缆 4.链路支持fc 1x,2x,3x,5x,6x,8x 上图中N有限制,N不能允许ADVB帧负载和填充长度不超过2112…...
OpenStack Yoga版安装笔记(23)Swift安装
一、官方文档 Object Storage Install Guide — Swift 2.29.3.dev5 documentation 二、环境准备 之前的实验,已经有controller, compute1, block1节点,并已经完成Keystone、Glance、Nova、Neutron、Cinder等主要OpenStack Service的安装。 此处新增…...
MySql 三大日志(redolog、undolog、binlog)详解
:费解的开关
审题: 本题需要我们将多组测试用例中拉灯数小于等于6的最小拉灯数输出,若拉灯数最小值仍大于6,则输出-1 思路: 方法一:二进制枚举 首先我们先分析一下基本特性: 1.所有的灯不可能重复拉:若拉的数…...
2025.04.19-阿里淘天春招算法岗笔试-第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 数值平衡之道 问题描述 LYA 是一位精通树形数据结构的数学家,她有一棵包含 n n n...
单片机毕业设计选题物联网计算机电气电子类
题目一:基于单片机的PM2.5空气质量检测仪器 选 1.用到ADC0832模数转换芯片,数据更加精准。 2.使用夏普传感器的GP2Y1010AUOF粉尘传感器实时检测空气中的PM2.5值并通过1602显示出来,检测准确。 3.LCD1602液晶第一行 前面显示测到的PM2.5…...
TDOA解算——牛顿迭代法|以4个基站的三维空间下TDOA定位为背景,使用牛顿迭代法解算。附完整代码,订阅专栏后可复制粘贴
本问所介绍的代码通过TDOA(到达时间差)方法,结合牛顿迭代算法,实现了三维空间内目标位置的定位。系统包含1个主锚点和3个副锚点,通过测量信号到达各基站的时间差计算距离差,最终迭代求解目标坐标。订阅专栏后可以获得完整的MATLAB代码,粘贴到空脚本中即可运行 文章目录 …...
海量聊天数据处理:基于Spring Boot与SharingJDBC的分库分表策略及ClickHouse冷热数据分离
引言 随着互联网应用的快速发展,每天产生的聊天记录数量级已经达到了惊人的程度。以2000万条/天为例,一年下来就是大约7.3亿条记录。如此庞大的数据量给数据库的设计和管理带来了前所未有的挑战。本文将探讨如何使用SharingJDBC整合Spring Boot技术来实…...
网络开发基础(游戏)之 Socket API
Socket简介 Socket (套接字)是网络编程的基础,在 C# 中通过 System.Net.Sockets 命名空间提供了一套完整的 API 来实现网络通信。 网络上的两个程序通过一个双向的通信连接实现数据交换, 这个连接的一端称为一个Socket。 一个Socket包含了进行网络通信必…...
在 Amazon Graviton 上运行大语言模型:CPU 推理性能实测与调优指南
引言 在生成式 AI 浪潮中,GPU 常被视为大模型推理的唯一选择。然而,随着 ARM 架构的崛起和量化技术的成熟,CPU 推理的性价比逐渐凸显。本文基于 Amazon Graviton 系列实例与 llama.cpp 工具链,实测了 Llama 3、DeepSeek 等模型的…...
基于尚硅谷FreeRTOS视频笔记——15—系统配制文件说明与数据规范
目录 配置函数 INCLUDE函数 config函数 数据类型 命名规范 函数与宏 配置函数 官网上可以查找 最核心的就是 config和INCLUDE INCLUDE函数 这些就是裁剪的函数 它们使用一个ifndef。如果定义了,就如果定义了这个宏定义,那么代码就生效。 通过ifn…...
Nacos 使用了什么日志框架?如何配置和查看日志?
Nacos 使用的日志框架 Nacos 主要使用 SLF4j (Simple Logging Facade for Java) 作为日志门面(API),并选择 Logback 作为其底层的日志实现。 SLF4j: 这是一个日志抽象层,允许开发者在代码中使用统一的接口进行日志记录ÿ…...
【基于Fluent+Python耦合的热管理数字孪生系统开发:新能源产品开发的硬核技术实践】
引言:热管理数字孪生的技术革命 在新能源领域(如动力电池、储能系统、光伏逆变器等),热管理是决定产品性能与安全的核心问题。传统热设计依赖实验与仿真割裂的流程,而数字孪生技术通过实时数据驱动与动态建模…...
【工具变量】A股上市公司信息披露质量KV指数测算数据集(含do代码 1991-2024年)
KV指数(Key Value Index)作为评估信息披露质量的关键指标,在证券市场,尤其是A股市场上市公司信息披露监管与评估中占据重要地位。该指数通过系统化、定量化的方法,对企业发布的信息进行全面剖析与打分,精准…...
【ELF2学习板】利用OpenMP采用多核并行技术提升FFTW的性能
目录 引言 OpenMP简介 编译OpenMP支持的FFTW库 部署与测试 测试程序 程序部署 测试结果 结语 引言 在前面已经介绍了在ELF2开发板上运行FFTW计算FFT。今天尝试利用RK3588的多核运算能力来加速FFT运算。FFTW利用多核能力可以考虑使用多线程或者OpenMP。今天介绍一下Ope…...
打靶日记 zico2: 1
一、探测靶机IP(进行信息收集) 主机发现 arp-scan -lnmap -sS -sV -T5 -p- 192.168.10.20 -A二、进行目录枚举 发现dbadmin目录下有个test_db.php 进入后发现是一个登录界面,尝试弱口令,结果是admin,一试就出 得到加…...
【技术派后端篇】 Redis 实现用户活跃度排行榜
在各类互联网应用中,排行榜是一个常见的功能需求,它能够直观地展示用户的表现或贡献情况,提升用户的参与感和竞争意识。在技术派项目中,也引入了用户活跃度排行榜,该排行榜主要基于 Redis 的 ZSET 数据结构来实现。接下…...
MySql Innodb详细解读
参考文档:https://www.cnblogs.com/acatsmiling/p/18424729 一、数据存储:从磁盘到内存的"黑帮走私" 1. 物理结构:表空间与页的江湖规矩 表空间(Tablespace): 所有InnoDB数据存在表空间里&…...
每日两道leetcode
399. 除法求值 - 力扣(LeetCode) 题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 …...
在RK3588上使用哪个流媒体服务器合适
在RK3588平台上选择合适的流媒体服务器时,需考虑其ARM Cortex-A76/A55架构、硬件编解码能力(如支持H.264/H.265/AV1解码)以及Linux/Android系统支持。以下是推荐的方案: 1. 轻量级方案:GStreamer RTSP 适用场景&…...
分享一个DeepSeek+自建知识库实现人工智能,智能回答高级用法。
这个是我自己搞的DeepSeek大模型自建知识库相结合到一起实现了更强大的回答问题能力还有智能资源推荐等功能。如果感兴趣的小伙伴可以联系进行聊聊,这个成品已经有了实现了,所以可以融入到你的项目,或者毕设什么的还可以去参加比赛等等。 1.项…...
PyTorch 深度学习实战(38):注意力机制全面解析(从Seq2Seq到Transformer)
在上一篇文章中,我们探讨了分布式训练实战。本文将深入解析注意力机制的完整发展历程,从最初的Seq2Seq模型到革命性的Transformer架构。我们将使用PyTorch实现2个关键阶段的注意力机制变体,并在机器翻译任务上进行对比实验。 一、注意力机制演…...
Android Studio 获取配置资源与第三方包信息详解
文章目录 Android Studio 获取配置资源与第三方包信息详解一、获取资源文件中的配置1. 获取颜色值Java 中获取:Kotlin 中获取: 2. 获取字符串Java 中获取:Kotlin 中获取: 3. 获取尺寸值Java 中获取:Kotlin 中获取&…...
【网络初识】从零开始彻底了解网络编程(一)
本篇博客给大家带来的是网络的知识点. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺便进步 一. 网络…...
Vivado比特流生成、下载及板级验证操作步骤
1. 前期准备 安装Vivado软件:确保Vivado开发环境已正确安装并配置。创建工程: 打开Vivado,点击“Create Project”新建工程。设置工程名称(例如“led_flow”)和路径。选择目标FPGA型号(例如XC7A35TFFG484&…...
【Flutter DevTools】性能优化的瑞士军刀
一、性能分析:帧率与资源监控 1.1 帧率监控(Performance面板) 通过Performance面板可实时捕获应用的渲染流水线数据。开发者点击"Record"按钮后,DevTools会以时间轴形式展示每一帧的构建、布局、绘制耗时。当帧率低于…...
使用Redis实现实时排行榜
为了实现一个实时排行榜系统,我们可以使用Redis的有序集合(ZSet),其底层通常是使用跳跃表实现的。有序集合允许我们按照分数(score)对成员(member)进行排序,因此非常适合…...
HTML5 应用程序缓存:原理、实践与演进
在 Web 技术的发展历程中,HTML5 引入的应用程序缓存(Application Cache)曾是提升 Web 应用离线体验的重要技术。它允许 Web 应用进行缓存,使用户在没有因特网连接时也能访问应用,为 Web 应用带来了显著的优势。然而&am…...
Compose笔记(十七)--AsyncImage
这一节了解一下Compose中的AsyncImage的使用,AsyncImage是由 Coil库提供的一个用于异步加载图片的组件。它支持加载网络图片、本地图片资源,并提供了占位符、错误处理、过渡动画等功能,简单介绍如下: API 1. model 含义:指定要加…...
Python语法系列博客 · 第7期[特殊字符] 列表推导式与字典推导式:更优雅地处理数据结构
上一期小练习解答(第6期回顾) ✅ 练习1:统计文件行数 with open("data.txt", "r", encoding"utf-8") as f:lines f.readlines()print(f"总行数:{len(lines)}")✅ 练习2:反…...
Redis--主从复制
目录 一、配置 1.1 建立复制 1.2 断开复制 1.3 安全性 1.4 只读 1.5 传输延迟 二、拓扑 2.1 一主一从结构 2.2 一主多从结构 2.3 树形主从结构 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满足故障恢 复和负载均衡等需求…...
FPGA练习———DDS波形发生器
简介:使用DDS波形发生器可以在fpga上生成方波、正弦波等波形,其具体方法是计算相位的变化,然后根据数据表的数值进行数模转化改变波形。 DDS的第一步是生成一个相位加法器 相位加法器 在生成一个波,例如正弦波时,我们…...
力扣面试150题-- 存在重复元素 II和最长连续序列
Day 26 题目描述 思路 定义一个map用来存放每个元素以及它对应的序号从前向后遍历数组如果该元素存在于map(说明满足了重复元素的条件),用当前元素的序号值减去map中存放的序号值(因为是从前遍历的所以当前元素序号一定大于存放…...
卸载Anaconda并保留虚拟环境,重装Anaconda并还原之前的虚拟环境
参考 https://blog.csdn.net/qq_63611690/article/details/134560333 该博文是虚拟环境和Anaconda安装路径在一起 我的是虚拟环境早就搞到了别的盘 问题描述 我之前把Anaconda安装到了C盘,随之时间推移,C盘占用空间越来越大。我想把Anaconda卸载重装…...
ArcGIS及其组件抛出 -- “Sorry, this application cannot run under a Virtual Machine.“
产生背景: 使用的是“破解版本”或“被套壳过”的非官方 ArcGIS 版本 破解版本作者为了防止: 被研究破解方式 被自动化抓包/提权/逆向 被企业环境中部署多机使用 通常会加入**“虚拟化环境检测阻断运行”机制** 原因解释: 说明你当前运…...
Ubuntu 25.04 “Plucky Puffin” 正式发布
Ubuntu 25.04 “Plucky Puffin” 于 2025 年 4 月 17 日正式发布。这是一个短期支持版本,只支持到 2026 年 1 月1。以下是该版本的一些主要新变化: 内核与系统:采用 Linux 6.14 内核;systemd v257.4 带来重要上游更新,…...
2. ubuntu20.04 和VS Code实现 ros的输出 (C++,Python)
本节对应赵虚左ROS书籍的1.4.2 1)创建工作空间 mkdir -p catkin_ws/src cd catkin_ws catkin_make 2) 终端进入VS Code code . 3) vscoe 的基本配置 3.1)修改.vscode/tasks.json ,修改内容如下: { // 有关 tasks.json 格式的文档,请参见…...
0801ajax_mock-网络ajax请求1-react-仿低代码平台项目
0 vite配置proxy代理 vite.config.ts代码如下图所示: import { defineConfig } from "vite"; import react from "vitejs/plugin-react";// https://vite.dev/config/ export default defineConfig({plugins: [react()],server: {proxy: {&qu…...
前端vue+后端ssm项目
下载地址: 前端:https://download.csdn.net/download/2401_83418369/90649449 后端: https://download.csdn.net/download/2401_83418369/90649441 一、项目基础环境搭建 1、新建Maven项目 2、创建目录,结构如下: …...
Python实例题:Python获取阴阳师壁纸
目录 Python实例题 题目 实现思路 代码实现 代码解释 get_wallpaper_links 函数: download_wallpapers 函数: 主程序: 运行思路 注意事项 Python实例题 题目 Python获取阴阳师壁纸 实现思路 发送请求获取网页内容:使…...
考研408操作系统文件管理——4.2目录系统详解
考研408操作系统文件管理——目录系统详解 一、目录管理基本概念 1.1 目录的核心功能 目录是文件系统的核心管理组件,主要实现: 按名存取:通过文件名快速定位物理地址路径解析:将逻辑路径转换为物理块地址共享控制:支持多用户共享同一文件命名空间管理:维护全局唯一的…...
国产SMT贴片机自主技术突破解析
内容概要 随着电子信息产业对精密制造需求的持续升级,国产SMT贴片机的技术突破已成为装备自主化进程的关键节点。本文聚焦设备研发的三大核心领域:高动态运动控制系统通过线性电机与数字信号处理技术的融合,将重复定位精度提升至5μm级别&am…...
Ai Agent 在生活领域的深度应用与使用指南
在科技不断革新的时代,Ai Agent 正以前所未有的态势融入生活的各个角落,成为提升生活品质与效率的得力助手。它凭借强大的智能处理能力,解决了传统生活模式中的诸多痛点,在家庭、出行、健康管理等多个场景中展现出巨大的应用价值…...
CPU与GPU之间的交互
命令队列和命令列表 每个GPU都维护着一个命令队列,本质上是一个环形缓冲区,等待着cpu提交到gpu的命令,同时执行命令 在Direct3D中命令队列被抽象为ID3D12CommandQueue接口来表示。通过下面的方式创建命令队列。 ComPtr<ID3D12CommandQue…...
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
文章目录 一、服务器选型——给数据库一个舒适的家二、系统调优——打造高性能跑道三、MySQL配置——让数据库火力全开四、监控体系——数据库的体检中心五、备份恢复——数据安全的最后防线六、主从复制——数据同步的艺术七、安全加固——守护数据长城 引言:从小白…...
Python制作简易PDF查看工具PDFViewerV1.0查找功能优化
原文说明 为不破坏原文结构,因此功能优化不在原文中维护了。关于这款工具原文请通过下面链接访问。Python制作简易PDF查看工具PDFViewerV1.0 这款小工具基本功能已经可以作为一款文档浏览器使用,但还有一些美中不足的地方,本文将介绍对文本查…...