一个由通义千问以及FFmpeg的AVFrame、buffer引起的bug:前面几帧影响后面帧数据
目录
1 问题描述
2 我最开始的代码----错误代码
3 正确的代码
4 为什么前面帧的结果会叠加到了后面帧上----因为ffmpeg新一帧只更新上一帧变化的部分
5 以后不要用通义千问写代码
1 问题描述
某个项目中,需要做人脸马赛克,然后这个是君正的某款芯片,他没有硬件解码,我就用了ffmpeg解码,然后我让通义千问给我写一个用ffmpeg解码h264视频的代码,然后对人脸区域做马赛克处理,出现的问题就是比如我在打人脸马赛克的时候出现重影、残留,就是比如我前面几帧做的马赛克在后面几帧上竟然还有,
这个看现象就是前面帧的马赛克效果被叠加到后面了。
2 我最开始的代码----错误代码
int SkuDetect::face_mosaic(const char* video_path) {// 初始化 FFmpegav_register_all();// 打开视频文件AVFormatContext* format_context = nullptr;if (avformat_open_input(&format_context, video_path, nullptr, nullptr) != 0) {std::cerr << "Could not open source file " << video_path << "\n";return -1;}if (avformat_find_stream_info(format_context, nullptr) < 0) {std::cerr << "Failed to retrieve input stream information.\n";return -1;}int video_stream_index = -1;for (unsigned i = 0; i < format_context->nb_streams; ++i) {if (format_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {video_stream_index = i;break;}}if (video_stream_index == -1) {std::cerr << "File does not contain any video stream.\n";return -1;}AVCodecParameters* codec_parameters = format_context->streams[video_stream_index]->codecpar;const AVCodec* codec = avcodec_find_decoder(codec_parameters->codec_id);AVCodecContext* codec_context = avcodec_alloc_context3(codec);avcodec_parameters_to_context(codec_context, codec_parameters);if (avcodec_open2(codec_context, codec, nullptr) < 0) {std::cerr << "Failed to open codec.\n";return -1;}printf("Pixel format: %d\n", codec_context->pix_fmt);// 获取视频的原始宽高int orig_w = codec_context->width;int orig_h = codec_context->height;// 加载人脸坐标std::map<int, std::vector<std::array<int, 4>>> face_coords_map = load_face_coordinates(video_path, orig_w, orig_h);//AVFrame* frame = av_frame_alloc();AVPacket packet;int frameCount = 0; // 记录帧数while (av_read_frame(format_context, &packet) >= 0) {AVFrame* frame = av_frame_alloc();if (packet.stream_index == video_stream_index) {if (avcodec_send_packet(codec_context, &packet) != 0) {std::cerr << "Error sending a packet for decoding." << std::endl;continue;}while (avcodec_receive_frame(codec_context, frame) == 0) {// 深拷贝 AVFrame 数据AVFrame* cloned_frame = av_frame_alloc();//用了深拷贝之后也还是有残影,并且深拷贝之后里面的data[0]的地址跟frame值一样的,指向同一块内存地址。cloned_frame = av_frame_clone(frame);// 获取当前帧的人脸坐标auto it = face_coords_map.find(frameCount);if (it != face_coords_map.end()) {const std::vector<std::array<int, 4>>& faces = it->second;printf("faces.size(): %d\n", faces.size());//用了深拷贝,并且memeset,然后前面这里保存依然会有马赛克残影,//save_frame_as_image(frame, frameCount, "result_image", it != face_coords_map.end() ? it->second : std::vector<std::array<int, 4>>());// 遍历所有人脸区域for (const auto& face : faces) {int x = face[0];int y = face[1];int width = face[2];int height = face[3];printf("frameCount:%d, x: %d, y: %d, width: %d, height: %d\n",frameCount, x, y, width, height);printf("frame->data[0]:0x%x, frame->linesize[0]:%d \n", frame->data[0], frame->linesize[0]);// 对 Y 分量进行马赛克apply_uniform_mosaic_y(dst_frame->data[0], dst_frame->linesize[0], x, y, width, height);// 对 U 和 V 分量进行马赛克int x_uv = x_expanded / 2, y_uv = y_expanded / 2;int width_uv = width_expanded / 2, height_uv = height_expanded / 2;apply_uniform_mosaic_uv(frame->data[1], frame->linesize[1], x_uv, y_uv, width_uv, height_uv);apply_uniform_mosaic_uv(frame->data[2], frame->linesize[2], x_uv, y_uv, width_uv, height_uv);}}// 保存处理后的帧为图片//save_frame_as_image(frame, frameCount, "result_image_mosaic", it != face_coords_map.end() ? it->second : std::vector<std::array<int, 4>>());// 保存处理后的帧为图片save_frame_as_image(dst_frame, frameCount, "result_image_mosaic", it != face_coords_map.end() ? it->second : std::vector<std::array<int, 4>>());av_frame_free(&dst_frame); //memset(frame, 0, sizeof(AVFrame));//用了memset之后也还是有残影。// 释放克隆帧av_frame_unref(cloned_frame);av_frame_free(&cloned_frame);frameCount++; // 增加帧数}}// 重置 AVFrameav_frame_unref(frame);av_packet_unref(&packet);av_frame_free(&frame);}// 清理资源//avcodec_free_context(&codec_context);avformat_close_input(&format_context);std::cout << "Processing completed." << std::endl;return 0;
}
上面的代码是让通义千问给写的,刚开始不对,他还让加上了clone函数做深拷贝,但其实深拷贝不是这样的,
3 正确的代码
AVFrame* apply_mosaic_with_copy(const AVFrame* src_frame, int x, int y, int width, int height, int block_size) {if (!src_frame || !src_frame->data[0]) {return nullptr;}// 创建新帧AVFrame* dst_frame = av_frame_alloc();if (!dst_frame) {return nullptr;}// 复制帧属性dst_frame->format = src_frame->format;dst_frame->width = src_frame->width;dst_frame->height = src_frame->height;// 分配缓冲区if (av_frame_get_buffer(dst_frame, 32) < 0) {av_frame_free(&dst_frame);return nullptr;}// 复制原始数据if (av_frame_copy(dst_frame, src_frame) < 0) {av_frame_free(&dst_frame);return nullptr;}// 设置其他属性if (av_frame_copy_props(dst_frame, src_frame) < 0) {av_frame_free(&dst_frame);return nullptr;}// 应用马赛克(使用修改后的版本)if (apply_mosaic_to_avframe(dst_frame, x, y, width, height, block_size) < 0) {av_frame_free(&dst_frame);return nullptr;}return dst_frame;
}
正确的深拷贝的代码应该是这样的,不只是alloc一个frame,还需要av_frame_get_buffer,重点就在这里的buffer。
4 为什么前面帧的结果会叠加到了后面帧上----因为ffmpeg新一帧只更新上一帧变化的部分
看完下面几个问题和答案之后就明白为什么了,下面几个问题是用deepseek问的,不是通义千问,通义千问的答案明显不行
5 以后不要用通义千问写代码
通义千问不适合写代码,不行,以前的h264转yuv视频的时候,也是通义千问给写的代码错了,将.mp4视频文件转成.yuv视频文件C++代码备份_mp4视频保存为yuv格式-CSDN博客
这个以前的代码就是通义千问给写错了,而且错误很隐蔽,转出来的yuv是对的,只是稍微有点色差,当初这个bug也耽误了不少时间。
相关文章:
一个由通义千问以及FFmpeg的AVFrame、buffer引起的bug:前面几帧影响后面帧数据
目录 1 问题描述 2 我最开始的代码----错误代码 3 正确的代码 4 为什么前面帧的结果会叠加到了后面帧上----因为ffmpeg新一帧只更新上一帧变化的部分 5 以后不要用通义千问写代码 1 问题描述 某个项目中,需要做人脸马赛克,然后这个是君正的某款芯片…...
MyBatis-动态SQL
MyBatis Plus 作为 MyBatis 的增强工具,简化了 CRUD 操作,但在复杂查询时,仍需使用 MyBatis 的动态 SQL 功能。以下是一些常用的动态标签、用法示例及注意事项: 常用动态标签及用法示例 <if> 标签 用途:条件判…...
顺序表(Arraylist)和链表(Linkedlist)
List List是一个接口,继承自Collection。 从数据结构角度来说,List就是一个线性表,即用n个相同类型的有限序列,可以在此序列中可以进行增删改查操作。 List是接口不能直接实例化,Linkedlist和Arraylist都实现了List…...
【python】django sqlite版本过低怎么办
方法一:下载最新版本 复制上面的内容的链接 在服务器上进行操作 wget https://sqlite.org/2025/sqlite-autoconf-3490100.tar.gz tar -zxvf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefix/usr/local make && make in…...
解决Dify使用Docker Compose部署中无法通过OpenAI插件等国外大模型厂商的插件访问其API的问题
解决Dify使用Docker Compose部署中无法通过OpenAI插件等国外大模型厂商的插件访问其API的问题 问题描述 在使用Docker Compose部署Dify时,发现无法通过OpenAI等国外大模型厂商的插件访问其API。这主要是因为Docker容器内的网络环境与宿主机不同,导致无…...
【ROS】代价地图
【ROS】代价地图 前言代价地图(Costmap)概述代价地图的参数costmap_common_params.yaml 参数说明costmap_common_params.yaml 示例说明global_costmap.yaml 参数说明global_costmap.yaml 示例说明local_costmap.yaml 参数说明local_costmap.yaml 示例说明…...
Deno 统一 Node 和 npm,既是 JS 运行时,又是包管理器
Deno 是一个现代的、一体化的、零配置的 JavaScript 运行时、工具链,专为 JavaScript 和 TypeScript 开发设计。目前已有数十万开发者在使用 Deno,其代码仓库是 GitHub 上 star 数第二高的 Rust 项目。 Stars 数102620Forks 数5553 主要特点 内置安全性…...
把城市变成智能生命体,智慧城市的神奇进化
智能交通系统的建立与优化 智能交通系统(ITS)是智慧城市建设的核心部分之一,旨在提升交通管理效率和安全性。该系统利用传感器网络、GPS定位技术以及实时数据分析来监控和管理城市中的所有交通流动。例如,通过部署于道路两侧或交…...
青少年编程与数学 02-016 Python数据结构与算法 23课题、分布式算法
青少年编程与数学 02-016 Python数据结构与算法 23课题、分布式算法 课题摘要:一、一致性算法Paxos 算法 二、领导者选举算法Bully 算法 三、分布式锁算法基于 ZooKeeper 的分布式锁 四、分布式事务处理算法两阶段提交(2PC) 五、负载均衡算法最少连接法 …...
Windows10系统RabbitMQ无法访问Web端界面
项目场景: 提示:这里简述项目相关背景: 项目场景: 在一个基于 .NET 的分布式项目中,团队使用 RabbitMQ 作为消息队列中间件,负责模块间的异步通信。开发环境为 Windows 10 系统,开发人员按照官…...
人工智能之数学基础:特征值分解与奇异值分解的区别分析
本文重点 矩阵分解是线性代数的核心工具,广泛应用于数据分析、信号处理、机器学习等领域。特征值分解与奇异值分解在数学定义、适用范围、几何意义、计算方法、应用场景及稳定性方面存在显著差异。EVD 适用于方阵,强调矩阵的固有属性;SVD 适用于任意矩阵,揭示矩阵的内在结…...
UDP概念特点+编程流程
UDP概念编程流程 目录 一、UDP基本概念 1.1 概念 1.2 特点 1.2.1 无连接性: 1.2.2 不可靠性 1.2.3 面向报文 二、UDP编程流程 2.1 客户端 cli.c 2.2 服务端ser.c 一、UDP基本概念 1.1 概念 UDP 即用户数据报协议(User Datagram Protocol &…...
Go语言实现OAuth 2.0认证服务器
文章目录 1. 项目概述1.1 OAuth2 流程 2. OAuth 2.0 Storage接口解析2.1 基础方法2.2 客户端管理相关方法2.3 授权码相关方法2.4 访问令牌相关方法2.5 刷新令牌相关方法 2.6 方法调用时序2.7 关键注意点3. MySQL存储实现原理3.1 数据库设计3.2 核心实现 4. OAuth 2.0授权码流程…...
【版本控制】idea中使用git
大家好,我是jstart千语。接下来继续对git的内容进行讲解。也是在开发中最常使用,最重要的部分,在idea中操作git。目录在右侧哦。 如果需要git命令的详解: 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先关闭项目…...
永磁同步电机控制中,滑模观测器是基于反电动势观测转子速度和角度的?扩展卡尔曼滤波观测器是基于什么观测的?扩展卡尔曼滤波观测器也是基于反电动势吗?
滑模观测器在PMSM中的应用: 滑模观测器是一种非线性观测器,利用切换函数设计,使得状态估计误差迅速趋近于零,实现快速响应和对外部干扰的鲁棒性。 在永磁同步电机(PMSM)无传感器控制中,滑模观测…...
十倍开发效率 - IDEA 插件之RestfulBox - API
提高效率不是为了完成更多的任务,而是有充足的时间摸鱼。 快速体验 RestfulBox - API 是 IDEA 的插件,适合本地测试接口,完全不需要对项目进行任何以来。 接口管理:支持接口扫描、浏览、搜索、跳转、导入和导出。支持接口请求&a…...
HTML、CSS 和 JavaScript 常见用法及使用规范
一、HTML 深度剖析 1. 文档类型声明 HTML 文档开头的 <!DOCTYPE html> 声明告知浏览器当前文档使用的是 HTML5 标准。它是文档的重要元信息,能确保浏览器以标准模式渲染页面,避免怪异模式下的兼容性问题。 2. 元数据标签 <meta> 标签&am…...
人工智能概念股投资:10大潜力标的深度研究
人工智能概念股投资:10大潜力标的深度研究 一、人工智能概念股投资的基本概念 人工智能(Artificial Intelligence,AI)是指利用计算机程序模拟人类智能的一种技术,通过对数据的分析和学习,实现类似人类思维和…...
centos部署的openstack发布windows虚拟机
CentOS上部署的OpenStack可以发布Windows虚拟机。在CentOS上部署OpenStack后,可以通过OpenStack平台创建和管理Windows虚拟机。以下是具体的步骤和注意事项: 安装和配置OpenStack: 首先,确保系统满足OpenStack的最低硬件…...
Fortran 中使用 C_LOC 和 C_F_POINTER 结合的方法来实现不同类型指针指向同一块内存区域
在 Fortran 中,可以使用 C_LOC 和 C_F_POINTER 结合的方法来实现不同类型指针指向同一块内存区域。以下是具体方法和示例: 关键步骤: 获取内存地址:用 C_LOC 获取原始数组的 C 地址。类型转换:用 C_F_POINTER 将地址转…...
两个 STM32G0 I2C 通信异常的案例分析
1. 案例一问题描述 客户反馈其产品在使用 STM32G0C1NEY6TR 和一个充电管理 IC 通信时,速率为100KHz 时通信正常,但工作在 400KHz 时,有时会产生 I2C 错误。 把 I2C GPIO 配置为推挽输出后产生错误的概率会下降。 2. 案例一问题确认 针对客…...
尚硅谷-react[1-6集]
目录 步骤 1. devlopment.js 2. react-dom.devopment.js 3. babel.min.js // 将jsx转为js体验 // 这个虚拟dom的内容不能够写引号,单引号双引号 const VDOM <h1>nihao react</h1> // 可以使用括号进行编写 const VDOM1 (<h1>nihao react</h1> )…...
树状数组简单介绍
树状数组简单介绍 前言树状数组(Binary Indexed Tree)JavaScript 详细指南一、什么是树状数组?二、核心概念(前置知识):lowbit 函数三、树状数组的实现1. 初始化树状数组2. 使用示例 四、详细原理解释1. 树…...
使用Redis实现分布式限流
一、限流场景与算法选择 1.1 为什么需要分布式限流 在高并发系统中,API接口的突发流量可能导致服务雪崩。传统的单机限流方案在分布式环境下存在局限,需要借助Redis等中间件实现集群级流量控制。 1.2 令牌桶算法优势 允许突发流量:稳定速…...
【MySQL学习】存储过程
目录 一、定义 二、基本语法 1.创建存储过程 2.删除存储过程 3.查看存储过程 三、控制语句 1.变量声明与赋值 四、游标(Cursor) (1)声明游标 (2)处理游标结束 (3)打开游标 …...
Bp靶场 - Jwt
你知道JWT漏洞如何进行攻击利用吗?快来看一看如何利用JWT漏洞进行攻击利用把!https://mp.weixin.qq.com/s/2iBIEGnkiliprsuHyY5Udg...
手机上的APN是什么,该怎么设置
网上说改个APN就可以让网速快几倍,那到底APN是个什么东西,真的能让网速快几倍吗? APN的作用 网络连接基础:APN(接入点名称)是手机连接移动网络的“桥梁”,负责识别运营商网络类型(…...
[bug]langchain agent报错Invalid Format: Missing ‘Action Input:‘ after ‘Action:‘
在学习langchain的agent时候,采用ollama调用本地的deepseek-r1:32b来做一个agent,代码如下: def create_custom_agent():llm ChatOllama(model"deepseek-r1:32b", temperature0.5)memory ConversationBufferWindowMemory(memory…...
blender关联复制与Three.js网格和材质共享验证
blender和three.js小白的学习之路。 最近看到Three.js官网上说,模型合并是一个很好的优化性能的方式,因为渲染2000个物体总要比一次性渲染一个模型要来的慢。很有道理! 但此时就不禁思考一个问题,现有的模型进行合并通过blender…...
Spark宽窄依赖与Join优化:协同划分与非协同划分的底层逻辑
在大数据领域,Spark的性能优化始终是开发者关注的焦点。理解宽依赖(Wide Dependency)和窄依赖(Narrow Dependency)的底层原理,能够帮助我们从根本上优化Join操作的性能。本文将通过这两个核心概念ÿ…...
每日算法-250416
今天我们来探讨两道可以通过贪心算法解决的 LeetCode 题目。 什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最…...
python爬虫降低IP封禁,python爬虫除了使用代理IP和降低请求频率,还有哪些方法可以应对IP封禁?
文章目录 前言1. 利用 CDN 节点2. 模拟真实用户行为3. 使用 IP 池轮换策略4. 处理 Cookie 和会话信息5. 分布式爬虫 前言 除了使用代理 IP 和降低请求频率,以下这些方法也能应对 IP 封禁: Python 3.13.2安装教程(附安装包)Python…...
NLP高频面试题(四十五)——PPO 算法在 RLHF 中的原理与实现详解
近端策略优化(Proximal Policy Optimization, PPO)算法是强化学习领域的一种新颖且高效的策略优化方法,在近年大规模语言模型的人类反馈强化学习(Reinforcement Learning with Human Feedback, RLHF)中发挥了关键作用。本文将以学术严谨的风格,详细阐述 PPO 算法的原理及…...
bert项目解析
读取csv def read_file(file_path):data []label []with open(file_path, "r", encoding"utf-8") as file:reader csv.reader(file)next(reader) # 跳过标题行for row in reader:if len(row) < 2:print(f"跳过不完整行: {row}")continue…...
ubuntu20.04 Android14编译环境配置
ubuntu 更新和必要安装 sudo apt update sudo apt install git sudo apt install python2-minimal sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2 sudo upda…...
lombok requires enabled annotation processing
这个错误信息表明你在使用 Lombok 时,编译器无法正常工作,因为 注解处理器(Annotation Processing) 没有被启用。Lombok 是一个 Java 库,它通过注解处理器在编译时自动生成代码(例如 Getter、Setter、NoArg…...
应用系统中的报表开发成本知多少?
应用系统的开发过程中,报表的业务虽然不算太难,但投入的开发成本可不一定小,因为总会有没完没了的报表要去做,成本的投入不容小觑 下面我们就来分析一下报表开发成本的构成,看看它是多是少 报表的开发成本,…...
STM32F103ZET6移植FATFS文件系统教程(W25Q32)
一、FATFS核心特性 跨平台支持 支持FAT12/FAT16/FAT32格式,兼容Windows文件系统; 采用标准C语言编写,代码量小且支持RTOS。 配置灵活性 通过宏定义实现功能裁剪,例如: FF_FS_READONLY:设为1时禁…...
数据泄露防护系统:全面保护企业信息安全的功能解析
随着信息技术的快速发展,数据泄露事件频发,给企业带来了巨大的经济损失和声誉损害。为了有效应对这一挑战,越来越多的企业开始部署专业的数据泄露防护(DLP)系统。安固软件作为一款领先的数据防泄漏解决方案,…...
【野火模型】利用深度神经网络替代 ELMv1 野火参数化:机制、实现与性能评估
目录 一、ELMv1 野火过程表示法(BASE-Fire)关键机制野火模拟的核心过程 二、采用神经网络模拟野火过程三、总结参考 一、ELMv1 野火过程表示法(BASE-Fire) ELMv1 中的野火模型(称为 BASE-Fire)源自 Commun…...
【WPF】 在WebView2使用echart显示数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、NuGet安装WebView2二、代码部分1.xaml中引入webview22.编写html3.在WebView2中加载html4.调用js方法为Echarts赋值 总结 前言 为了实现数据的三维效果&…...
java实现二叉树的前序、中序、后序遍历(递归和非递归方式)以及层级遍历
java实现二叉树的前序、中序、后序遍历以及层级遍历 一、二叉树节点定义二、递归方式1.前序遍历2.中序遍历3.后序遍历 三、非递归方式1.前序遍历2.中序遍历3.后序遍历4.层级遍历5.分层打印 四、测试用例 一、二叉树节点定义 class TreeNode {int val;TreeNode left;TreeNode r…...
学习笔记十三—— 理解 Rust 闭包:从语法到 impl Fn vs Box<dyn Fn>
🧠 理解 Rust 闭包:从语法到 impl Fn vs Box 📚 目录 闭包是什么?和普通函数有什么不同?闭包的语法长什么样?闭包“捕获变量”是什么意思?闭包和所有权的关系Fn、FnMut、FnOnce 三种闭包类型的…...
Linux虚拟机filezilla总是连不上
刚好有两个虚拟机,测试了一下问题所在 从第一个到第二个需要设置什么 image PNG 68.59KB image PNG 134.39KB ChatGLM 从第一个到第二个需要设置开启ssh服务,具体步骤如下: 输入以下命令来启动SSH服务: bash 复制 sud…...
NO.94十六届蓝桥杯备战|图论基础-单源最短路|常规dijkstra|堆优化dijkstra|bellman-ford|spfa(C++)
在图G中,假设 v i v_{i} vi和 v j v_{j} vj为图中的两个顶点,那么 v i v_{i} vi到 v j v_{j} vj路径上所经过边的权值之和就称为带权路径⻓度。 由于 v i v_{i} vi到 v j v_{j} vj的路径可能有多条,将带权路径⻓度最短的那条路径…...
DISCO:利用大型语言模型提取反事实
DISCO: Distilling Counterfactuals with Large Language Models - ACL Anthologyhttps://aclanthology.org/2023.acl-long.302/ 1. 概述 尽管在自然语言处理(NLP)领域针对各种推理任务取得了巨大进展(Wang 等, 2018, 2019a;Xu 等, 2020),但数据集偏差仍然是构建鲁棒模型…...
若依微服务版启动小程序后端
目录标题 本地启动,dev对应 nacos里的 xxx-xxx-dev配置文件 本地启动,dev对应 nacos里的 xxx-xxx-dev配置文件...
C语言 - 深拷贝与浅拷贝详解
深拷贝与浅拷贝详解 在 C 语言编程中,处理指针和动态内存是常见任务。在涉及数据拷贝操作时,我们经常会听到“深拷贝”和“浅拷贝”这两个术语。理解它们之间的区别对于避免程序中的内存错误和数据覆盖问题至关重要。 本文将全面讲解 C 语言中的深拷贝与…...
Serverless集群搭建:Knative
文章目录 Knative搭建1.准备工作安装Kubernetes安装 Istio 2.部署Knative Knative搭建 搭建流程图: 1.准备工作 准备工作 ● 本安装操作中的步骤 bash 适用于 MacOS 或 Linux 环境。对于 Windows,某些命令可能需要调整。 ● 本安装操作假定您具有现有…...
今日行情明日机会——20250416
指数在区间震荡,还需要等突破下跌趋势企稳 2025年4月16日涨停的主要行业方向分析 1. 外贸(9家涨停) 细分领域:跨境物流、纺织出口、供应链服务。代表个股: 五板:泰慕士(纺织服装出口龙头&…...