ffmpeg-mov-metadate不识别Bug修复
文章目录
- BUG起因
- 类似问题反馈
- 问题解决
- 具体步骤:
- 阅读过文章
- ffmpeg命令行解析调试流程记录
- movenc.c源码分析
BUG起因
在ffmpeg参数默认可识别的metadata参数如下:
具体可见libavformat/movenc.c->mov_write_udta_tag()
mov_write_string_metadata(s, pb_buf, "\251ART", "artist", 0);mov_write_string_metadata(s, pb_buf, "\251nam", "title", 0);mov_write_string_metadata(s, pb_buf, "\251aut", "author", 0);mov_write_string_metadata(s, pb_buf, "\251alb", "album", 0);mov_write_string_metadata(s, pb_buf, "\251day", "date", 0);mov_write_string_metadata(s, pb_buf, "\251swr", "encoder", 0);// currently ignored by mov.cmov_write_string_metadata(s, pb_buf, "\251des", "comment", 0);// add support for libquicktime, this atom is also actually read by mov.cmov_write_string_metadata(s, pb_buf, "\251cmt", "comment", 0);mov_write_string_metadata(s, pb_buf, "\251gen", "genre", 0);mov_write_string_metadata(s, pb_buf, "\251cpy", "copyright", 0);mov_write_string_metadata(s, pb_buf, "\251mak", "make", 0);mov_write_string_metadata(s, pb_buf, "\251mod", "model", 0);mov_write_string_metadata(s, pb_buf, "\251xyz", "location", 0);mov_write_string_metadata(s, pb_buf, "\251key", "keywords", 0);mov_write_raw_metadata_tag(s, pb_buf, "XMP_", "xmp");
而原视频中的参数都是:
com.apple.quicktime.location.accuracy.ho :
com.apple.quicktime.location.ISO6709 :
com.apple.quicktime.make :
com.apple.quicktime.model :
com.apple.quicktime.software :
com.apple.quicktime.creationdate :
这些参数不在ffmpeg的atom列表中 所以ffmpeg会当作自定义medatada参数处理,可以使用脚本测试:
#!/bin/bash
list=( title author album_artist album grouping composer year track comment genre copyright description synopsis show episode_id network lyrics )
for i in ${list[@]};doecho "use -> $i"./ffmpeg -i input_old.mov -metadata ${i}="YYYY-MM-DD HH:MM:SS" -c copy output_mdta_time.mov -y && mediainfo output_mdta_time.mov | grep "YYYY-MM-DD HH:MM:SS" --colorsleep 1
done
那么就需要使用-movflags use_metadata_tags参数来添加自定义metadata在使用ffmpeg对视频添加metadata或者保存metadata时处理之后视频在QuickTime中无法正确读取metadata->key比如:
$ ./ffmpeg -i input_old.mov -c copy -movflags use_metadata_tags -metadata name="YJ" output.mov -y
此时通过ffprobe、mediainfo等工具查看是没有问题的:
$ mediainfo output.mov
General
Complete name : output.mov
Format : MPEG-4
Format profile : QuickTime
Codec ID : qt 0000.02 (qt )
File size : 785 KiB
Duration : 780 ms
Overall bit rate : 8 245 kb/s
major_brand : qt
minor_version : 0
compatible_brands : qt
com.apple.quicktime.creationdate : xxx//clear
com.apple.quicktime.location.accuracy.ho : xxx//clear
com.apple.quicktime.location.ISO6709 : xxx//clear
com.apple.quicktime.make : Apple
com.apple.quicktime.model : iPhonexxx //clear
com.apple.quicktime.software : xxx//clear
name : YJ
encoder : Lavf58.29.100
但是QuickTime获取视频属性、以及IOS开发使用AVAsset中会出现如下情况:
//ios->switch
let _asset = AVAsset(url: videoURL)
let metadata = _asset.metadata
print("start\(metadata.count)")
for item in metadata {if let identifier = item.identifier?.rawValue,let value = item.value {print("Identifier: \(identifier), Value: \(value)")}
}
print("end")//Print :
start11
Identifier: itsk/%00%00%00%01, Value: qt
Identifier: itsk/%00%00%00%02, Value: 0
Identifier: itsk/%00%00%00%03, Value: qt
Identifier: itsk/%00%00%00%04, Value: 2023-03-25T14:57:05+0800
Identifier: itsk/%00%00%00%05, Value: 35.000000
Identifier: itsk/%00%00%00%06, Value: xxxx
Identifier: itsk/%00%00%00%07, Value: Apple
Identifier: itsk/%00%00%00%08, Value: xxx
Identifier: itsk/%00%00%00%09, Value: xxx
Identifier: itsk/%00%00%00%0A, Value: YJ
Identifier: itsk/%00%00%00%0B, Value: xxx
end
类似问题反馈
https://trac.ffmpeg.org/ticket/4209
-
添加
-movflags use_metadata_tags将允许您添加和继承自定义元数据。至少ff*工具将在输出中显示这些标签 -
我刚刚用iPhone X HEVC视频测试了ffmpeg 4.0.3版本。
命令很简单:ffmpeg -i IMG_9988.MOV -movflags use_metadata_tags -c copy aaaa.mov我可以用ffprobe在目标文件(GPS、模型等)上看到原始元数据:
com.apple.quicktime.创建日期:2018-11-28T17:47:53-0200com.apple.quicktime.location.ISO6709:-23.5424-046.6576/com.apple.quicktime.make:苹果com.apple.quicktime.model:iPhone Xcom.apple.quicktime.software:12.1但苹果堆栈不会在目标文件上显示元数据。这是一张屏幕截图,左侧显示右侧的源和目标
https://exiftool.org/forum/index.php?topic=11782.0
ffmpeg似乎支持数量有限的.mp4格式的iTunes标签。'-map_metadata 0’不保留自定义/任意元密钥。为此目的的开关是“-movflags use_metadata_tags”,但这些是以非常规方式编写的,Quicktime Player无法识别它们(我目前使用的是Mojave QT–Catalina QT有些不同)
https://www.linuxmi.com/ffmpeg-shili.html
ffmpeg -i source.mov \-map_metadata 0 -movflags use_metadata_tags \
linuxmi.mp4
由于某些视频存储自定义元数据,此命令可能无法正确复制所有数据。
https://www.mail-archive.com/libav-user@ffmpeg.org/msg12683.html
在编码视频文件时向容器添加元数据
我在向mp4或mov容器添加元数据时遇到一些问题,不确定是否>这是avformat中的问题,或者如果我做错了什么。
在查看了二进制ffmpeg后,我自己找到了答案,它具有同样的问题,如果做:ffmpeg -i input.mp4 -metadata hello='world' -c copy output.mp4...网上有更多关于命令行工具的信息比图书馆 :)...我在这里找到了:https://superuser.com/questions/1208273/how-to-add-new-and-non-defined-metadata-to-an-mp4-file...输出用户元数据ffmpeg需要以下选项:-movflags use_metadata_tags...所以我这样更改了avformat_write_header()调用:av_dict_set(&options, "movflags", "use_metadata_tags", 0);/* 编写流标头(如果有的话)。*/int ret = avformat_write_header(oc_, &options);// 字典复制到write_header中,我们应该释放这是我们的副本av_dict_free(&options);...现在我的metadatsa出现在输出文件中!我希望这对有问题的人有所帮助,那不是非常明显的行为
https://video.stackexchange.com/questions/23741/how-to-prevent-ffmpeg-from-dropping-metadata
现在我发现use_metadata_tags选项是个坏主意,因为它不是标准-例如Plex不再读取任何元数据。有趣的是,我试图将更多的元数据导入Plex,但这个选项实际上恰恰相反。在上面的代码中,我可以看到MDTA的方式是写入所有键,然后写入所有值,而我想大多数程序都期望列表中的键/值对,因此不知道如何读取MDTA元数据。
支持最多的解决方案:
exiftool -TagsFromFile source.mp4 -All:All target.mp4
问题解决
为了看清楚ffmpeg对metadata做了什么这里使用exiftool工具进行比较
$ exiftool -v input_old.mov > 1 && exiftool -v output.mov > 2
$ vim -d 1 2
注意看下面(左边为原始视频、右边为ffmpeg编辑后视频metadata)区别:
Movie (SubDirectory) --> │ Movie (SubDirectory) -->+ [Movie directory] │ + [Movie directory]// .....| UserData (SubDirectory) --> │ | UserData (SubDirectory) -->| Unknown_free = │ | + [UserData directory]| Meta (SubDirectory) --> │ | | Meta (SubDirectory) -->| + [Meta directory] │ | | + [Meta directory]| | Handler (SubDirectory) --> │ | | | Handler (SubDirectory) --| | + [BinaryData directory, 26│ | | | + [BinaryData directory,| | | HandlerClass = │ | | | | HandlerClass =| | | HandlerType = mdta │ | | | | HandlerType = mdta| | | HandlerVendorID = │ | | | | HandlerVendorID =| | | HandlerDescription = │ | | | | HandlerDescription =| | Keys (SubDirectory) --> │ | | | Keys (SubDirectory) -->| | + [Keys directory] │ | | | + [Keys directory]| | | Added ItemList Tag 1.1 = │ | | | | Added ItemList Tag 1.1| | | Added ItemList Tag 1.2 = │ | | | | Added ItemList Tag 1.2| | | Added ItemList Tag 1.3 = │ | | | | Added ItemList Tag 1.3| | | Added ItemList Tag 1.4 = │ | | | | Added ItemList Tag 1.4| | | Added ItemList Tag 1.5 = │ | | | | Added ItemList Tag 1.5| | | Added ItemList Tag 1.6 = │ | | | | Added ItemList Tag 1.6| | ItemList (SubDirectory) -->│ | | | | Added ItemList Tag 1.7| | + [ItemList directory] │ | | | | Added ItemList Tag 1.8| | | LocationAccuracyHorizonta│ | | | | Added ItemList Tag 1.9| | | GPSCoordinates = xxx. │ | | | | Added ItemList Tag 1.10| | | Make = Apple │ | | | | Added ItemList Tag 1.11| | | Model = iPhxxx. │ | | | ItemList (SubDirectory) -| | | Software = xxxxxx │ | | | + [ItemList directory]| | | CreationDate = 2023-03-25│ | | | | MajorBrand = qt
结果是ffmpeg将Meta Box放在了Movie->UserData->Meta Box的位置。而这个位置在QuickTime中是无法识别的,QuickTime的具体解释如下:
https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/Metadata/Metadata.html
Storage Location in a QuickTime File
Within a QuickTime file, metadata can be stored within a movie atom (‘moov’), a track atom (‘trak’) or a media atom (‘mdia’). Only one metadata atom is allowed for each location. If there is user data and metadata stored in the same location, and both declare the same information, for example, declare a copyright notice, the metadata takes precedence
具体的"Metadata Structure"构造在ffmpeg->libavformat/movenc.c文件中可见:
/* meta data tags */static int mov_write_meta_tag(AVIOContext *pb, MOVMuxContext *mov,AVFormatContext *s){int size = 0;int64_t pos = avio_tell(pb); s:avio_wb32(pb, 0); /* size */ s: val:ffio_wfourcc(pb, "meta"); s:avio_wb32(pb, 0);if (mov->flags & FF_MOV_FLAG_USE_MDTA) {mov_write_mdta_hdlr_tag(pb, mov, s); mov_write_mdta_keys_tag(pb, mov, s);mov_write_mdta_ilst_tag(pb, mov, s);}else {/* iTunes metadata tag */mov_write_itunes_hdlr_tag(pb, mov, s);mov_write_ilst_tag(pb, mov, s);}size = update_size(pb, pos);return size;}
所以只需要将Movie->UserData->Meta Box转移到Movie->Meta Box即可正确识别
具体步骤:
- 修改
libavformat/movenc.c如下:
$ git diff movenc.cint64_t pos = avio_tell(pb);avio_wb32(pb, 0); /* size */ffio_wfourcc(pb, "meta");
- avio_wb32(pb, 0);
+ //TODO -> update2
+ //avio_wb32(pb, 0); //Offset to -> moov/metaif ((size = avio_close_dyn_buf(pb_buf, &buf)) > 0) {
+ /*
+ * TODO update1
+ *创建一个box,udta box 的大小应该包括 8 个字节的 box 头:
+ *- 4 个字节的 box 大小
+ *- 4 个字节的 box 类型
+ */
+ if (!(mov->mode & MODE_3GP) &&
+ !(mov->mode == MODE_MOV && !(mov->flags & FF_MOV_FLAG_USE_MDTA))) {
+ avio_wb32(pb, 8); //置空moov->uata box
+ ffio_wfourcc(pb, "udta");
+ avio_write(pb, buf, size); //将moov->uata->meta box偏移到moov->meta box
+ }else{avio_wb32(pb, size + 8);ffio_wfourcc(pb, "udta");avio_write(pb, buf, size);}
+
+ }av_free(buf);
- 重新编译
make - 再次执行保存metadata
$ ./ffmpeg -i input_old.mov -c copy -movflags use_metadata_tags -metadata name="YJ" output.mov -y
- 测试
//ios->switch
let _asset = AVAsset(url: videoURL)
let metadata = _asset.metadata
print("start\(metadata.count)")
for item in metadata {if let identifier = item.identifier?.rawValue,let value = item.value {print("Identifier: \(identifier), Value: \(value)")}
}
print("end")//Print :
start10
Identifier: mdta/major_brand, Value: qt
Identifier: mdta/minor_version, Value: 0
Identifier: mdta/compatible_brands, Value: qt
Identifier: mdta/com.apple.quicktime.creationdate, Value: 2023-03-25T14:57:05+0800
Identifier: mdta/com.apple.quicktime.location.accuracy.horizontal, Value: 35.000000
Identifier: mdta/com.apple.quicktime.location.ISO6709, Value: xxxx
Identifier: mdta/com.apple.quicktime.make, Value: Apple
Identifier: mdta/com.apple.quicktime.model, Value: iPhoxxx
Identifier: mdta/com.apple.quicktime.software, Value: xxx
Identifier: mdta/name, Value: YJ
Identifier: mdta/encoder, Value: Lavf58.29.100
end
阅读过文章
- https://www.qiniu.com/qfans/qnso-70261246#comments
- https://trac.ffmpeg.org/ticket/4209?cversion=2&cnum_hist=25#comment:25
- https://trac.ffmpeg.org/ticket/4209
- https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/Metadata/Metadata.html
ffmpeg命令行解析调试流程记录
main
ffmpeg_parse_options
split_commandline -> av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hQmJ9qBh-1682697624690)(…/Library/Application Support/typora-user-images/image-20230311144719815.png)]
这里可以直接快速断电在``fftools/cmdutils.c+823`即可查看每次循环得到的参数
split_commandline后就会解析完成所有参数命令
fftools/ffmpeg_opt.c -> ffmpeg_parse_options->open_files() 会读取输入文件并打印输入文件的数据,比如metadata
fftools/ffmpeg_opt.c+3331-> ret = open_files(&octx.groups[GROUP_OUTFILE], “output”, open_output_file);
movenc.c源码分析
命令如下:
set args -i input_old.mov -movflags use_metadata_tags -c copy output.mov -y
判断用户态释放输入了-use-metadata参数:
3630 static int mov_write_meta_tag(AVIOContext *pb, MOVMuxContext *mov,3631 AVFormatContext *s)3632 {3633 int size = 0;3634 int64_t pos = avio_tell(pb);→ 3635 avio_wb32(pb, 0); /* size */3636 ffio_wfourcc(pb, "meta");3637 avio_wb32(pb, 0);3638 if (mov->flags & FF_MOV_FLAG_USE_MDTA) {3639 mov_write_mdta_hdlr_tag(pb, mov, s);//hdlr 标签用于指定这些自定义元数据的类型,比如使用 'mdta' 表示这是用户自定义元数据。3640 mov_write_mdta_keys_tag(pb, mov, s);//keys 标签用于指定这些自定义元数据的键名和键类型,比如使用 com.apple.quicktime.description 表示这是 QuickTime 描述信息的键名。3641 mov_write_mdta_ilst_tag(pb, mov, s);//ilst 标签用于实际存储这些自定义元数据的值。3642 }
主要是下面几个函数:
mov_write_mdta_keys_tag(pb, mov, s);mov_write_mdta_ilst_tag(pb, mov, s);
static int mov_write_mdta_ilst_tag(AVIOContext *pb, MOVMuxContext *m ov,AVFormatContext *s){AVDictionaryEntry *t = NULL;int64_t pos = avio_tell(pb); s:int count = 1; /* keys are 1-index based */avio_wb32(pb, 0); /* size */ s: val:ffio_wfourcc(pb, "ilst"); s:while (t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX )) { m: key: prev: flags:int64_t entry_pos = avio_tell(pb); s:avio_wb32(pb, 0); /* size */ s: val:avio_wb32(pb, count); /* key */ s: val:mov_write_string_data_tag(pb, t->value, 0, 1); data: lang: lupdate_size(pb, entry_pos); pos:count += 1; //TODO 这里改了有用}return update_size(pb, pos);}
相关文章:
ffmpeg-mov-metadate不识别Bug修复
文章目录 BUG起因类似问题反馈问题解决具体步骤: 阅读过文章ffmpeg命令行解析调试流程记录movenc.c源码分析 BUG起因 在ffmpeg参数默认可识别的metadata参数如下: 具体可见libavformat/movenc.c->mov_write_udta_tag() mov_write_string_metadata(s,…...
(8)(8.6) 引导程序更新
文章目录 前言 1 我在哪里可以下载最新的引导程序? 2 使用任务规划器进行升级...
汽车电路图、原理框图、线束图、元器件布置图的识读技巧与要点
摘要: 想要读懂汽车电路图就必须把电的通路理清楚,即某条线是什么信号,该信号是输入信号、输出信号还是控制信号以及信号起什么作用,在什么条件下有信号,从哪里来,到哪里去。 一、汽车电路图的识读技巧 1.…...
( 数组和矩阵) 667. 优美的排列 II ——【Leetcode每日一题】
❓667. 优美的排列 II 难度:中等 给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件: 假设该列表是 answer [a1, a2, a3, ... , an] ࿰…...
【python基础语法七】python内置函数和内置模块
内置全局函数 abs 绝对值函数 print(abs(-1)) # 1 print(abs(100)) # 100round 四舍五入 """奇进偶不进(n.5的情况特定发生)""" res round(3.87) # 4 res round(4.51) # 5 # res round(2.5) # 2 # res round(3.5) # 4 res round(6.5) # …...
81. read readline readlines 读取文件的三种方法
81. read readline readlines 读取文件的三种方法 文章目录 81. read readline readlines 读取文件的三种方法1. 读取文件的三种方法2. read方法3. readline方法4. readlines方法5. 代码总结5.1 read方法读取全部内容5.2 readline方法读取一行,返回字符串5.3 readli…...
【社区图书馆】【图书活动第四期】
目录 一、前言 二、作者简介 三、《PyTorch高级机器学习实战》内容简介 四、书目录 一、前言 今天,偶尔逛到csdn社区图书馆,看到有活动 “【图书活动第四期】来一起写书评领实体奖牌红包电子勋章吧!”(活动到今天结束…...
webpack学习指南(上)
构建流程 Webpack 的构建流程可以分为以下几个步骤: 解析配置文件:Webpack 会读取项目中的 webpack.config.js 文件,并解析其中的配置项。 解析入口文件:Webpack 通过配置文件中设置的 entry 入口,递归地解析出所有依…...
刷题记录˃ʍ˂
一、1033. 移动石子直到连续 思路 这道题是一道数学题,它一共分为三种可能 第一种可能为三个石子本来就是连续的时候 第二种可能为最少步数为1的时候,相邻石子不能大于一格 第三种可能为最少步数为2的时候,这时相邻石子大于一格 那么第二…...
Word2vec原理+实战学习笔记(二)
来源:投稿 作者:阿克西 编辑:学姐 前篇:Word2vec原理实战学习笔记(一) 视频链接:https://ai.deepshare.net/detail/p_5ee62f90022ee_zFpnlHXA/6 5 对比模型(论文Model Architectur…...
什么是Java的多线程?
Java的多线程是指在同一时间内,一个程序中同时运行多个线程。每个线程都是一个独立的执行路径,可以独立地执行代码。Java中的多线程机制使得程序可以更高效地利用计算机的多核处理器和CPU时间,从而提高程序的性能和响应能力。 创建和使用Jav…...
“use strict“是什么? 使用它有什么优缺点?
严格模式 - JavaScript | MDN Javascript 严格模式详解 - 阮一峰的网络日志 1、"use strict" 是什么? "use strict" :指定代码在严格条件下执行; 2、 使用 "use strict" 有什么优缺点? ① 严格模式通过抛出错…...
【C++】C++11常用特性总结
哥们哥们,把书读烂,困在爱里是笨蛋! 文章目录 一、统一的列表初始化1.统一的{}初始化2.std::initializer_list类型的初始化 二、简化声明的关键字1.decltype2.auto && nullptr 三、STL中的一些变化1.新增容器:array &…...
泛型——List 优于数组
数组与泛型有很大的不同: 1. 数组是协变的(covariant) 意思是:如果Sub是Super的子类型,则数组类型Sub[] 是数组类型Super[] 的子类型。 2. 泛型是不变的(invariant) 对于任何两种不同的类型Ty…...
JavaScript中对象的定义、引用和复制
JavaScript是一种广泛使用的脚本语言,其设计理念是面向对象的范式。在JavaScript中,对象就是一系列属性的集合,每个属性包含一个名称和一个值。属性的值可以是基本数据类型、对象类型或函数类型,这些类型的值相互之间有着不同的特…...
JavaScript通过函数异常处理来输入圆的半径,输出圆的面积的代码
以下为实现通过函数异常处理来输入圆的半径,输出圆的面积的代码和运行截图 目录 前言 一、通过函数异常处理来输入圆的半径,输出圆的面积 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以…...
Ubuntu 安装 Mysql
主要内容 本文主要是实现在虚拟机 Ubuntu 18.04 成功安装 MySQL 5.7,并实现远程访问功能,以 windows 下客户端访问虚拟机上的 mysql 数据库。 1. 切换至 root 用户 ,shell 终端指令均执行在 root 用户下 sudo su 2. 安装并设置 mysql 安…...
【五一创作】【Midjourney】Midjourney 连续性人物创作 ② ( 获取大图和 Seed 随机种子 | 通过 seed 随机种子生成类似图像 )
文章目录 一、获取大图和 Seed 随机种子二、通过 seed 种子生成类似图像 一、获取大图和 Seed 随机种子 注意 : 一定是使用 U 按钮 , 在生成的大图的基础上 , 添加 信封 表情 , 才能获取该大图的 Seed 种子编码 ; 在上一篇博客生成图像的基础上 , 点击 U3 获取第三张图的大图 ;…...
分布式事务 --- Seata事务模式、高可用
一、事务模式 1.1、XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。…...
SQL(基础)
DDL: 数据定义语言 Definition,用来定义数据库对象(数据库、表、字段)CREATE、DROP、ALTER DML: 数据操作语言 Manipulation,用来对数据库表中的数据进行增删改 INSERT、UPDATE、DELETE 注意: DDL是改变表的结构 DML…...
3步快速上手RobotHelper:安卓自动化脚本框架新手指南
3步快速上手RobotHelper:安卓自动化脚本框架新手指南 【免费下载链接】RobotHelper 安卓游戏自动化脚本框架|Automated script for Android games 项目地址: https://gitcode.com/gh_mirrors/ro/RobotHelper 你是否想要开发安卓游戏自动化脚本,却…...
告别STM32cubeIDE的路径红波浪线:VSCode配置C/C++插件的保姆级指南
告别STM32cubeIDE的路径红波浪线:VSCode配置C/C插件的保姆级指南 对于习惯了STM32cubeIDE的嵌入式开发者来说,第一次用VSCode打开工程时,满屏的红色波浪线可能会让人瞬间崩溃。别担心,这不是你的代码有问题,而是VSCode…...
SINAMICS V90伺服驱动器故障代码大全
SINAMICS V90伺服驱动器在运行过程中可能出现故障,导致设备停机。用户可通过BOP面板或调试软件查看故障代码,并根据以下信息判断故障原因及处理方法。序号报警号信息故障信息可能原因处理方法1F1000内部软件错误出现了一个内部软件错误。分析故障缓冲器为…...
智能体架构实战:从LangGraph状态机到多智能体协作
1. 从理论到实践:为什么我们需要一个“智能体架构大全”项目如果你在过去一年里关注过AI领域,尤其是大语言模型的应用开发,那么“智能体”这个词一定已经听得耳朵起茧了。从能帮你写代码的Devin,到能自主完成复杂任务的GPT-4o&…...
基于MCP协议实现AI助手个性化:Terminal Buddies项目实战解析
1. 项目概述:当你的终端伙伴遇见AI助手 如果你和我一样,每天有大量时间泡在终端和代码编辑器里,那么一个能带来些许乐趣和陪伴感的“数字伙伴”或许能点亮枯燥的编码时光。Terminal Buddies 正是这样一个巧妙结合了复古 ASCII 艺术、轻量级游…...
Gemini实时字幕在Google Meet中延迟超800ms?揭秘谷歌内部SRE监控数据与3步毫秒级调优法
更多请点击: https://intelliparadigm.com 第一章:Gemini实时字幕在Google Meet中延迟超800ms?揭秘谷歌内部SRE监控数据与3步毫秒级调优法 谷歌内部SRE团队近期公开的一组匿名化监控数据显示:在高并发(>500人&…...
BGA虚焊别头疼!从焊膏印刷到回流焊曲线,一份保姆级的SMT工艺避坑指南
BGA虚焊别头疼!从焊膏印刷到回流焊曲线,一份保姆级的SMT工艺避坑指南 在SMT产线上,BGA虚焊问题就像个幽灵,时不时冒出来折腾工程师。上周产线刚报修一批主板,X光下那些不规则焊点像极了抽象派画作——可惜客户要的是工…...
别再只调API了!微信支付Native/JSAPI开发中,订单号生成与回调处理的5个实战避坑点
微信支付开发实战:订单与回调的五个关键陷阱与解决方案 在移动支付领域,微信支付作为主流平台之一,其开发文档看似详尽,但实际落地时仍存在诸多"暗坑"。许多开发者过度关注支付接口调用本身,却忽视了订单生成…...
算法21,搜索插入位置
一道经典的二分查找应用题,通常被称为“搜索插入位置”。笔记中的思路非常清晰,下面为你整理这道题的具体解法、代码实现以及需要注意的细节。1. 题目理解题目描述:给定一个排序数组和一个目标值,在数组中找到目标值,并…...
Linux桌面便签神器Sticky:3分钟告别灵感遗忘的终极解决方案
Linux桌面便签神器Sticky:3分钟告别灵感遗忘的终极解决方案 【免费下载链接】sticky A sticky notes app for the linux desktop 项目地址: https://gitcode.com/gh_mirrors/stic/sticky 你是否曾经有过这样的经历?在编码时突然想到一个绝妙的算法…...
