【深入理解FFMPEG】命令行阅读笔记
这里写自定义目录标题
- 第三章 FFmpeg工具使用基础
- 3.1 ffmpeg常用命令
- 3.1.1
- 3.1.3 转码流程
- 3.2 ffprobe 常用命令
- 3.2.1 ffprobe常用参数
- 3.2.2 ffprobe 使用示例
- 3.3 ffplay常用命令
- 3.3.1 ffplay常用参数
- 3.3.2 ffplay高级参数
- 3.3.4 ffplay快捷键
- 第4章 封装与解封装
- 4.1 视频文件转MP4
- 4.1.4 MP4在FFmpeg中的Demuxer
- 4.2 视频文件转FLV
- 4.3 视频文件转MPEG-TS
- 4.4 视频文件转HLS
第三章 FFmpeg工具使用基础
3.1 ffmpeg常用命令
ffmpeg --help
ffmpeg -h
ffmpeg -h long 查看高级参数部分
ffmpeg -h full 产科全部参数部分
ffmpeg -h type=name
其中 type为 decoder/encoder/demuxer/muxer/filter/bsf/protocol 的一种
name为对应的组件的名字
ffmpeg -L 查看ffmpeg目前支持的license协议
ffmpeg -version 查看ffmpeg版本,以及子模块的详细版本信息
ffmpeg -formats 查看当前ffmpeg支持的容器文件格式,返回值如下:
File formats:D. = Demuxing supported.E = Muxing supported--D 3dostr 3DO STRE 3g2 3GP2 (3GPP2 file format)E 3gp 3GP (3GPP file format)...
共三列,
第一列 D表示 Demuxing, E表示 Muxing
第二列 容器格式在FFmpeg中使用的简短名字
第三列 容器文件格式的补充说明
ffmpeg -codecs 查看编解码格式的所有信息,如:
Codecs:D..... = Decoding supported.E.... = Encoding supported..V... = Video codec..A... = Audio codec..S... = Subtitle codec..D... = Data codec..T... = Attachment codec...I.. = Intra frame-only codec....L. = Lossy compression.....S = Lossless compression-------D.VI.S 012v Uncompressed 4:2:2 10-bitD.V.L. 4xm 4X Movie...
共三列,
第一列 D表示支持解码,E表示支持编码,以及编码的音频/视频/字幕/数据/附件类型,或者只有I帧的编码压缩格式,以及有损和无损压缩类型
第二列 Codec在FFmpeg中使用的简短名字
第三列 Codec格式的详细说明,如果一个Codec有多个对应实现,也会在小括号中显示出来
ffmpeg -encoders / ffmpeg -decoders
ffmpeg -h muxer=flv
ffmpeg -h demuxer=flv
ffmpeg -h encoder=h264
ffmpeg -h filter=colorkey
3.1.1
ffmpeg 中 AVFormatContext 的主要参数
参数 | 说明 |
---|---|
avioflags | 缓冲设置, 默认为0 direct: 无缓冲 |
probesize | probing size |
等等
ffmpeg 中 AVCodecContext 的主要参数
参数 | 说明 |
---|---|
b | 设置文件码流 |
ab | 设置音频码率(不同音频encoder有不同的默认值), |
g | 设置max gop size |
ar | 设置音频sample_rate, |
ac | 设置音频channel_count, |
bf | 设置连续编码B帧的个数,设置为0是无B帧 |
profile | 设置音视频的profle |
level | 设置音视频的level |
level | 设置音视频的level |
color_primaries | 设置视频的primaries (from 1 to 10) (default unspecified) |
color_trc | 设置视频的color transfer characteristics (from 1 to 18) (default unspecified) |
colorspace | 设置视频的colorspace,如 bt709, rgb 等 |
color_range | 设置视频的range mpeg: MPEG (219*2^(n-8)) jpeg: JPEG (2^n-1) |
更多信息查看ffmpeg -h full 的返回值 |
3.1.3 转码流程
ffmpeg -i input1.rmvb -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4
3.2 ffprobe 常用命令
3.2.1 ffprobe常用参数
ffprobe -v 指定log级别, quiet/panic -> debug/ trace
ffprobe -show_format
ffprobe -show_streams 查看文件的流信息, 如视频codec, 帧率,位深,nal_length_size, profile/level, has_b_frames等
ffprobe -show_chpters
ffprobe -v trace -show_format -show_streams -show_chapters -of json video.mp4
3.2.2 ffprobe 使用示例
ffprobe -show_packets input.flv 查看多媒体数据包信息
ffprobe -show_data -show_packets input.flv 查看每一包信息以及包中的具体数据
ffprobe -show_format output.mp4 查看文件format信息
ffprobe -show_frames input.flv 查看视频的每一帧信息
ffprobe -of xml -show_streams input.flv 查看每一路stream的信息,xml的格式输出
此外,of还可以跟 ini/ json/ csv / flat 等信息
ffprobe -show_frames -select_streams v -of xml input.mp4 只查看视频信息
select_streams 后面可以跟 v a s,分别表示 视频/音频/字幕
如果不需要输出所有字段的信息,可以结合 show_entries来使用,如:
ffprobe -select_streams v -show_packets -show_entries packet=codec_type,pts_time,pos input.mp4
表示只输出 packet中的 codec_type/pst_time/pos等字段信息
ffprobe -v trace input.mp4 2>&1| findstr “parent:‘root’” 查看文件中box的位置信息
3.3 ffplay常用命令
3.3.1 ffplay常用参数
ffplay --help
与ffplay 相关的命令
x, y 设置显示窗口的宽高
s 设置视频显示宽高,主要用于播放yuv/rgb裸流, 有的版本没有这个信息
fs 强制全屏播放
an/vn/sn 屏蔽音频/视频/字幕
ss/t 设置seek开始的秒数/设置播放的时间长度
bytes: seek by byes, 0:off, 1:on, -1 auto
nodisp: 关闭显示窗口
f 强制使用某格式,主要用于rawvideo播放裸流
window_title 设置显示窗口的标题
af/vf 设置音频/视频滤镜
codec 强制使用某个codec, 主要针对存在多个视频codec的情况
autorotate 自动旋转视频
ffplay -ss 0 -t 10 input.mp4
ffplay -window_title “Hello, World” output.mp4
ffplay -window_title “播放测试” rtmp://up.v.test.com/live/stream //实际播放不了
3.3.2 ffplay高级参数
ast/vst/sst 设置将要播放音频/视频/字幕流
stats 输出多媒体播放状态 //没发现有啥作用
autoexit 播放完成后自动退出ffplay, 默认不自动退出
exitonkeydown/exitonmousedown 有按键事件/鼠标按键事件后退出ffplay
loop 设置播放循环次数
framedrop cpu占用过高时,自动丢帧
infbuf 设置无极限的播放器buffer,主要用于流媒体播放场景
vf 设置视频滤镜
acodec/vcodec/scodec 强制使用某个codec
time xxx // window上无法使用time统计耗时信息
ffplay -vcodec h264 output.mp4 强制使用h264解码器解码非h264码流会报错
ffmpeg -vst 4 -ast 5 test.ts 针对ts流中有多路节目时,选择对应的音频流和视频流
ffplay -window_title “Test Movie” -vf “subtitles=input.srt” output.mp4
播放视频时,带上 input.srt的字幕文件
input.srt内容可以为
1
00:00:00.000 --> 00:00::30.000
Test first 30 second2
00:00:00.301 --> 00:00::60.000
Test second 30 second3
00:01:01.000 --> 00:01::10.000
Test end
3.3.3 ffplay的数据可视化分析应用
ffplay -showmode 1 output.mp3 //音频的波形以振幅的形式显示出来
ffplay -debug vis_mb_type -window_title “show vis_mb_type” -ss 20 -t 10 -autoexit output.mp4
注: 较新的版本上的 AVCodecContext 帮助中,其-debug没有 vis_mb_type, 只有 qp/mb_type 等信息,不是打印在视频的宏块上,而是直接打印在log里面,如下图,打印的是720x960(每帧45x60个宏块)视频的qp信息,
下面时某一帧每个宏块的qp值
ffplay -vismv pf output.mp4 // 没有 vismv 这个命令
ffplay -flags2 +export_mvs video.mp4 -vf codecview=mv=pf+bf+bb // 这个可以将mv信息显示在画面上,如果没有 flags参数,单纯使用 codecview filter,还是无效果
3.3.4 ffplay快捷键
ffplay播放过程中的一些快捷键
快捷键 | 功能 |
---|---|
f | 全屏/非全屏切换 |
f | 全屏/非全屏切换 |
s | 逐帧显示图像,(暂停的状态时) |
w | 显示图像和声音波形之间切换 |
← / → | 后退10s/前进10s |
↑ / ↓ | 前进60s/后台60s |
鼠标右键单击 | seek至指定位置 |
鼠标左键双击 | 切换全屏/非全屏 |
m | 静音切换 |
功能键区(非小键盘)的 9和0 | 增大和减小音量 |
小键盘区的 / 和 * | 增大和减小音量 |
p | 暂停/恢复播放 |
q和 ESC | 退出播放 |
第4章 封装与解封装
4.1 视频文件转MP4
4.1.4 MP4在FFmpeg中的Demuxer
ffmpeg -h demuxer=mp4
个人觉得有用的信息
ignore_editlist 忽略EditList box信息,默认不开启,
如果同一个视频,ffplay播放音视频不同步,其他播放器正常,可能是mp4的 editlist box里面的参数缘故,设置这个参数再尝试一下
ffmpeg -h muxer=mp4
个人觉得有用的信息
movflags
faststart 设置将moov box置于文件的开头,
dash 将MP4封装为fragment mp4,以便兼容DASH
ffmpeg -i input.flv -c copy -f mp4 output.mp4
ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4
ffmpeg -i input.flv -c copy -f mp4 -movflags dash output.mp4
ffmpeg -re -i input.mp4 -c copy -movflags isml+frag_keyframe -f ismv Stream //与普通mp4的差异就是,Stream里面的 compatible_brands为 ismlpiff, 这里的 -re 表示 每秒只读取1s的input.mp4数据来处理,所以视频有多长,转码时间就会有多长,为了加快速度,可以取消到 -re 这个命令
ffmpeg -i input.mp4 -c:v libx265 -c:a aac -crf 25 -tag:v hvc1 outputh265.mp4
与不加 -tag:v hvc1生成的普通Mp4相比,
普通MP4视频生成 hev1 box, 这里生成 hvc1 box
4.2 视频文件转FLV
ffmpeg -h muxer=flv 查看 flv muxer的使用信息
ffmpeg -i input_ac3.mp4 -c copy -f flv output.flv
ffmpeg -i input_ac3.mp4 -vcodec copy -acodec aac -f flv output.flv
ffmpeg -i input.mp4 -c copy -f flv -flvflags add_keyframe_index output.flv
相比默认 不加 flvflags的命令,生成的flv文件,多了存放关键帧信息的metadata
ffprobe -v trace -i output.flv // 查看flv信息
4.3 视频文件转MPEG-TS
TS/PS 分为三层
- ES层: 单独的音频流视频流组成的Elementary Stream, ES
- PES层: 将ES按一定的规则进行封装,如H.264的AU作为拆分单元,打上时间戳,组成分组的基本数据流 Packetized Elementary Stream, PES,
- TS/PS 层: 将PES包进行切分再封装成固定大小(一般为188 Byte)的传输流 Transport Stream, TS
ffmpeg -h muxer=mpegts 查看mpegts muxer的帮助信息
4.4 视频文件转HLS
ffmpeg -h muxer=hls 查看hls muxer的help信息
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8
实操发现是否加 -bsf:v h264_mp4toannexb, 效果一样,ffmpeg内部会自动把MP4中nal的长度头更换为起始码的头
- start_number参数
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8 // 设置m3u8中的切片从 300开始
ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8
每一个切片,几乎都是10s
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:11.066667,
output0.ts
#EXTINF:10.166667,
output1.ts
#EXTINF:10.000000,
output2.ts
#EXTINF:6.166667,
output3.ts
#EXT-X-ENDLIST
ffmpeg -i input.mp4 -c copy -f hls -hls_list_size 3 output.m3u8
只保留了最多3片的切片
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:13
#EXTINF:2.266667,
output13.ts
#EXTINF:2.300000,
output14.ts
#EXTINF:1.600000,
output15.ts
#EXT-X-ENDLIST
hls_wrap 参数已经废弃
ffmpeg -i input.mp4 -c copy -f hls -hls_base_url http://192.168.0.1/lives/ output1.m3u8
从生成的m3u8来看,每个分片都加了 http://192.168.0.1/lives/ 的前缀
D:\_Video>type output1.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.800000,
http://192.168.0.1/lives/output111.ts
#EXTINF:1.833333,
http://192.168.0.1/lives/output112.ts
#EXTINF:2.266667,
http://192.168.0.1/lives/output113.ts
#EXTINF:2.300000,
http://192.168.0.1/lives/output114.ts
#EXTINF:1.600000,
http://192.168.0.1/lives/output115.ts
#EXT-X-ENDLIST
ffmpeg -i input.mp4 -c copy -vframes 1000 -f hls -hls_segment_filename test_output-%d.ts output.m3u8
可以看出,切片名字不再是默认的 output1.ts, output2.ts 这些ts
而是指定的 test_output-%d.ts
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:9
#EXTINF:3.066667,
test_output-9.ts
#EXTINF:3.300000,
test_output-10.ts
#EXTINF:1.800000,
test_output-11.ts
#EXTINF:1.833333,
test_output-12.ts
#EXTINF:2.100000,
test_output-13.ts
#EXT-X-ENDLIST
ffmpeg -f lavfi -i testsrc2=s=176x144:r=15 -vcodec libx264 -g 30 -r:v 15 -f hls -hls_time 2 -hls_list_size 4 -hls_flags delete_segments -t 30 output-test.m3u8
D:\_Video>type output-test.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:2.000000,
output-test11.ts
#EXTINF:2.000000,
output-test12.ts
#EXTINF:2.000000,
output-test13.ts
#EXTINF:2.000000,
output-test14.ts
#EXT-X-ENDLIST
-t 30 指定要生成30s的视频,hls_time 为2,指定切片duration为2s, 故一共有15个切片
从 output-test0 - output-test14
而这是了 delete_segment, 且 hls_list_size 4, 故前11个切片都删了,只保留最后4个
ffmpeg -i input.mp4 -c copy -f hls -hls_flags round_durations output.m3u8
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:2
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:2,
output11.ts
#EXTINF:2,
output12.ts
#EXTINF:2,
output13.ts
#EXTINF:2,
output14.ts
#EXTINF:2,
output15.ts
#EXT-X-ENDLIST
每一片的切片时长变为了整数,而不是浮点数了
discount_start 子参数, P124 todo
相关文章:

【深入理解FFMPEG】命令行阅读笔记
这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…...

图形化数据报文转换映射工具
目录 概要整体架构流程技术名词解释技术细节小结 概要 在当今数字化时代,数据的处理和分析是企业、科研机构以及各类组织日常运营的核心环节。数据来源广泛,格式多样,常见的数据格式包括XML(可扩展标记语言)和JSON&a…...

智能体0门槛开发
分享一个智能体开发流程。 2025 年啊,好多专家还有行业报告都觉得这是智能体(AI Agent)应用的头一年。相关的应用在商业、工业、消费等好些领域都到了关键的时候,这意味着从实验室走向大规模实际应用的重要转变。而且呢࿰…...

ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”
起因 环境:Windows10 背景:之前就是按照官方说明创建个rsa密钥,在git后台添加上,就行了,近期怎么添加怎么失败,总是“Error: Permission denied (publickey)”的提示! 尝试 各种尝试…...

mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用
全国地图json数据下载地址 目录 html加载全部代码 方式一:使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式,设置type加载数据类型 设置线条 鼠标移入改变颜色,设置图层属性,此处是fill-extru…...
考研机试题:打印日期
描述 给出年分m和一年中的第n天,算出第n天是几月几号。 输入描述: 输入包括两个整数y(1<y<3000),n(1<n<366)。 输出描述: 可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。 …...
OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?
找了一圈发现官方的文档都是最新的,3.2很多API都不支持,比如获取OhosAppContext,通过OhosAppContext来获取应用版本号,最终是通过读取app.json5的文件内容来读取版本号,最终修改entry下的hvigorfile.ts如下,…...
【openwrt】openwrt odhcpd配置介绍
odhcpd odhcpd是一个嵌入式DHCP/DHCPv6/RA服务器和NDP中继的进程,odhcpd是一个守护进程,用于服务和中继IP管理协议,以配置客户端和下游路由器。它试图遵循IPv6家用路由器的RFC 6204要求。odhcpd为DHCP、RA、无状态SLAAC和有状态DHCPv6、前缀委派提供服务器服务,并可用于在没…...

基于神经网络的视频编码NNVC(1):帧内预测
在H.266/VVC发布后,基于传统编码框架提升压缩率越来越难,随着深度学习的发展,研究人员开始尝试将神经网络引入编码器。为此,JVET工作组在2020年成立AHG11小组来专门进行基于神经网络的视频编码的研究。 为了方便研究,工…...

Android开发,待办事项提醒App的设计与实现
文章目录 1. 研究目的2. 主要内容3. 运行效果图4. 涉及到的技术点5. 开发环境6. 关于作者其它项目视频教程介绍 1. 研究目的 当今,随着时代的发展和计算机的普及,人们开始利用网络来记录并管理日常的事务,时下这方面的软件数不胜数。各种日程管理软件就是将每天的工作和事务安…...
豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)
文章目录 豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)写在前面数据采集(Visual Studio Code+Navicat)1.观察网页信息2.编写Scrapy代码(Visual Studio Code)2.1 创建Scrapy项目`doubanProject`2.2 创建爬虫脚本`douban.py`2.3 修改`douban.py`的代码2…...

MySQL索引——让查询飞起来
文章目录 索引是什么??硬件理解MySQL与存储 MySQL 与磁盘交互基本单位索引的理解B vs B聚簇索引 VS 非聚簇索引索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引 在现代数据库应用中,查询性能是决定系统响应…...
Springboot集成Elasticsearch8.0(ES)版本,采用JAVA Client方式进行连接和实现CRUD操作
本文章介绍了 springboot t集成Elasticsearch8.0(ES)版本,如何通过 AVA Client方式进行连接和实现CRUD操作 在ES7.15版本之后,ES官方将高级客户端 RestHighLevelClient标记为弃用状态。同时推出了全新的 Java API客户端 Elasticsearch Java API Client,该客户端也将在 Ela…...
【Linux】APT 密钥管理迁移指南:有效解决 apt-key 弃用警告
引言 随着 Debian 11 和 Ubuntu 22.04 版本的推出,APT 的密钥管理方式发生了重大的变化。apt-key 命令被正式弃用,新的密钥管理机制要求使用 /etc/apt/keyrings/ 或 /etc/apt/trusted.gpg.d/ 来存储和管理密钥。这一变化对管理员和普通用户来说至关重要…...

洛谷P1143 进制转换
题目链接:P1143 进制转换 - 洛谷 | 计算机科学教育新生态 题目难度:普及— 解题思路:本题先将输入的数转为10进制,然后取模,最后倒着输出就好了,最后直接上代码 #include<bits/stdc.h> using namespa…...
99.12 金融难点通俗解释:毛利率
目录 0. 承前1. 简述2. 比喻:冰淇淋店赚钱2.1 第一步:准备材料2.2 第二步:卖冰淇淋2.3 第三步:计算毛利率 3. 生活中的例子3.1 好的毛利率3.2 一般的毛利率3.3 差的毛利率 4. 小朋友要注意4.1 毛利率高不一定好4.2 毛利率低不一定…...

HUMANITY’S LAST EXAM (HLE) 综述:人工智能领域的“最终考试”
论文地址:Humanity’s Last Exam 1. 背景与动机 随着大型语言模型(LLMs)能力的飞速发展,其在数学、编程、生物等领域的任务表现已超越人类。为了系统地衡量这些能力,LLMs 需要接受基准测试(Benchmarks&…...

C++从入门到实战(二)C++命名空间
C从入门到实战(二)C命名空间 前言一、C的第一个程序二、命名空间(一)为什么需要命名空间(二)定义命名空间(三)使用命名空间1.通过命名空间限定符:2.使用 using 声明&…...

C# OpenCV机器视觉:实现农作物病害检测
在酷热难耐的夏日,阳光似火舌般舔舐大地。阿强惬意地躺在老家院子摇椅上,哼着小曲,手边放着一碗冰镇西瓜,头顶大槐树宛如巨大遮阳伞,洒下斑驳阴凉。他本想趁假期回老家放松,远离城市喧嚣与代码 “纠缠”。 …...
开源软件协议介绍
一、可以闭源使用/不具传染性的协议 允许商业使用和分发 1、BSD:详细介绍 2、LGPL许可证:详细介绍 3、MPL2.0:详细介绍 二、具有传染性/使用后需要开源自身软件的协议 不建议商业使用 1、GPL许可证:详细介绍...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...