跳至主要内容

161 篇文章 含有標籤「微信公眾號」

從個人微信公眾號整理到博客的文章

檢視所有標籤

Robinhood 的蜕变:金融科技与加密货币领域战略扩张分析

· 閱讀時間約 41 分鐘
w0x7ce
MySelf

发布于 2025-06-26 23:14:25(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 21784 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

original we×x7ce EI V1ajero 2825年6月26日 23:14 美国

本报告对Rob1nhood近年来的战略转型进行了详感分析,揭示了其如何从一个以零佣金股 票交易为核心的应用程序,积极演变为一家业务多元化、布局全球的金融科技公司。分析表 明,Robinhood的所有行动都围绕着一个清晰的长期愿景展开,该原景由三大战略弧线构 成:主导活跃交易市场、抢占下一代投资者的钱包份额,以及构建全球化的金融生态系统。 为实现这一宏伟蓝图,Robinhood采用了双管齐下的执行策略。一方面,通过一系列量大 并购,迅速切入关键市场并获取核心能力:以2亿美元收购Bitstamp,为其加密货币业 务带来了全球牌照和机构级服务能力:以约1.79亿美元收购WonderFi,强势进入加掌 大加密市场:以9500万美元收购X1,为其进军信贷领域铺平了道路。另一方面,公司通 过高速的内生产品创新,不断拓展服务边界。其中,Robinhood Strategies(财富管 理)、Robinhood Banking(私人银行业务)、Cortex AI(人工智能投资工具)以及 极具吸引力的IRA退休账户匹配计划,旨在深座绑定用户,提升其终身价值。 本报告认为,Rob1nhood的战略核心在于,将加密货币不仅视为一种可交易资产,更是其 实现收入增长和国际化扩张的关键链化剂,乃至未来金融基础设施的技术基石。公司正利用 其在技术和成本结构上的优势,对传统金融服务(如财富管理、私人银行)的高利润领域发 起冲击。尽管面临着监管不确定性和激烈的市场竞争等风险,但Rob1nhood的多元化布局 本身就是对这些核心风险的长期对冲。综合来看,Robinhood不再仅仅是一个券商,它正 在坚定地朝着成为下一代投资者首选的全栈式金融超级应用迈进。

第一部分:战略蓝图--Robinhood的三大增长弧线

Robinhood的领导层为其未来十年制定了一个雄心转勃的愿景,该愿景旨在充分利用重大 的代际和技术变革1。这一愿景被清晰地划分为三个相互关联的战略“弧线”,构成了公司所 有近期行动的指导框架。其2025年的产品路线图也明确围绕这三大弧线展开布局2,揭示 了公司从核心业务的深化到未来生态的构建的演进路径。

1.1.弧线一:在活跃交易领域取得主导地位

此弧线的核心目标是成为技术拥熟、高度参与的活跃交易者首选的第一平台。Robinhood 管理层将此策略比作特斯拉的“Roadster"战略:首先服务于要求最苛刻的精英用户群体, 以此推动技术创新并产生现金流,从而为更广泛的市场扩张提供资金支持3。这一战略体现 在公司持续推出为高级用户量身定制的先进工具上。

  • Robinhood Legend:这是一个专为活跃交易者设计的、可完全定制的浏览器桌面交

易平台。它首先在美国推出,并于2825年5月扩展至英国市场‘。为了提供无缝 的跨平台体验,其接心功能(如高级图表)正逐步被移植到移动端4.

  • 高级图表与期权工具:公司在移动端推出了Legend图表功能,并为期权交易者引入

了交易前模拟回报工具。这些功能直接满足了资深用户的精细化分析需求,使他们无论 身在何处都能进行复杂的策路分析和实时操作。

  • 拓展新资产类别:2025年第一季度,Robinhood推出了期货和预测市场交易“。

这些新产品迅速获得了市场的积极响应,仅2025年4月,期货合约交易量就达到 了458万份,超过了第一季度的总和,显示出强劲的增长势头。这些新业务已经开 始产生可观的年化收入,成为新的增长点“。 “活跃交易者”弧线不仅是用户获取策路,更是驱动整个商业模式运转的“飞轮”。首先,活跃 交易者贡款了显高的交易量,从而为公司带来了大量的交易返佣(PFOF)和加密货币交易费 收入。这一点在2025年第一季度的财报中得到了印证,该季度基于交易的收人同比调升了 77%”。其次,正如管理层的“Roadster"类比所提示的,这些收入为更具野心、投资周期 更长的“钱包份额”和“全球生态”弧线提供了关键的资金支持。最后,为这些“超级用户”开 发的高级功能(如高级图表、更快的执行遗度)最终会下沉并优化整个平台,提升所有用户 的体验,从而构筑起一道坚实的竞争护河。因此,该弧线既是公司的经济引擎,也是其保 持行业领先地位的研发实验室。

1.2.弧线二:扩大下一代投资者的钱包份额

此弧线的战略目标是超越单纯的学商角色,成为千德一代和乙世代用户的棱心金融中心,提 供一整套全面的金融服务。Robinhood预计,这一弧线将在大约五年内“达到高潮”,届 财富的增长,持续满足他们日益复杂的金融需求,从而深度绑定用户资产1。

  • RobinhoodRetirement(IRA):于2022年12月推出的退休账户产品1,

实现了爆炸性增长。截至2025年第一季度,其资产管理规模(AUC)达到创纪录的 144亿美元,同比增长超过208%。其极具竞争力的IRA匹配计划是增长的关键 驱动力。

  • RobinhoodGold与信用卡:2023 年以9569 万美元收购X1,是Rob1nhood

进军信贷市场的明确信号。由此证生的RobinhoodGold Card成为其高级订 阅服务Gold的核心权益之一。Gold订阅本身也是一个强劲的增长引举,其用户数 在2025年第一季度几乎翻倍,达到320万”。

  • Robinhood Strategies 与Banking:在2025 年3月.Robinhcod 宣布

推出Robinhood Strategies(财富管理)和Robinhood Banking(为 Gold会员提供的私人银行股务),这标志着公司向传统财富管理行业发起了直接挑 战,旨在将“历史上专为超级富豪保留的"服务普及化。 Robinhood正在利用其低成本的技术平台,对传统金融机构利润丰厚的核心业务(如财富 管理和私人银行)发起一场“降维打击”。传统财富管理行业普遍收取1-2%的资产管理费, 而Robinhood Strategies 的年费仅为0.25%,且对Gold会员设有每年 250美 元的上限,这意味着超过10万美元的资产即可享受免费管理5。传统银行业务依赖净息 差,而RobinhoodBanking 则提供高达 4.e8%的年化收益率(APY)和最高250 万 美元的FDIC保险,利用其技术优势为用户提供远超市场平均水平的回报。这并非简单 的功能叠加,面是一场基于商业模式优势的战略性价格战。Robinhood押注其技术优先、 低运营成本的模式能够通过提供“物美价廉“的优质服务,从传统金融巨头手中吸引大规模的 资产流入。

1.3.弧线三:构建全球化的金融生态系统

这是Robinhood最具雄心、最为长远的战略弧线,其核心是实现国际化扩张,并充分利用 加密货币和资产代币化等新兴技术。公司的2825年路线图明确包括了在英国的券商业务 扩张、在亚太地区的启动计划,以及在更多市场获取牌照的目标。 MiCA(加密资产市场法规)监管框架,在欧洲多国逐步推出加密货币交易服务1”。

  • 加密货币作为先锋:加密货币被明确定义为其国际化战略的关键组成部分29。对

B1tstamp(全球)和WonderF1(加拿大)的收购,是实现这一扩张的主要载体。

  • 未来愿景:资产代币化:Robinhood正在积极探索利用区块链技术,在欧洲市场为

投资者提供代币化的美国证券交易2。据报道,公司可能与Arbitrum或Solana 等领先的区块链网络合作。公司首席执行官VladTenev曾公开表示,与繁锁的传 统IPO流程相比,代币发行的效率和力量是惊人的,这预示着公司对此方向的坚定 看好2 球金融系统的基础技术,即“金融轨道”,公司的兴趣点已不止于销售比特币,而是深人探索 将股票等传统金融资产进行代币化。资产代币化所带来的成本降低、结算加速和24/7 全天候交易等优势2,与Robinhood“金融民主化“的核心使命完美买合。对Bitstamp 的收购,则为这一宏大构想提供了必要的机构级基础设施(如托管、执行和清算)”,因此, “全球金融生态系统”弧线是其战略的终极体现:利用加密技术重构传统金融的基础设施,使 其无国界、更普惠。这远比成为一个滴单的国际脸票经纪商更为深刻和宏大。

第二部分:外延式增长--一场精心策划的战略收购

本部分将深入剖析Robinhood的并购策路,分析每一次收胸如何为其宏大的战略蓝图添砖 加瓦。公司正清晰地利用其充裕的理金储备“,在关键战略领域选择“购买”百非“自建”,以 加速其发展进程。 表1:Robinhood近年关键战略收购汇总 获得的核心能力 日标公司 宣布/完成日 收购价格 支持的战 期 略弧线 源 Bitstasp 机构圾加密美币交易所、全球牌 24 2825 年6月2 约2亿 全球生态 原、机构客户基础 系线 日完成 美元 加率大合规加密平台、市场领导 2825年5月1

2.5

MonderFi 全球生态 约 亿加元 系统 地位 3日直布 系线 9500万 12 无年费信用卡技术,消费致据酒 X1 领包份晨 2823年6月收 钱包份额 17 美元 察 购 2824年3月收 末按雷 12 Marex FCM 美国期货执行经纪商牌照 活跃交易 购 者 12 Chartr 2823年12月 末按雷 金融数据可视化内容 平台增强 收购 Say Techno 2821年8月收

1.4 亿美

股东代泽控票与沟通平台 平台增疆 logies 元 Cove Marke 2821年12月 平台增强 12 末按塞 加密货币交易平台技术 皮胸 ts

2.1.全球加密赌注:收购Bitstamp以获取机构与国际业务

于2025年6月2日完成的、以2亿美元全现金收购B1tstamp的交易,是 Robinhood发展史上的一个里程碑事件2。 布欧盟、英国、美国和亚洲2。这次收购极大地加速了Robinhood的国际化进程 (支持弧线三)。

  • 切入机构业务银域:这是Robinhood首次涉足机构业务,直接获得了Bitstamp

超过5069家的机构客户24。公司由此获得了机构级的服务能力,包括可靠的交易 执行、深度的订单缝、行业领先的API连接、加密即服务(crypto-as-a service)、机构借贷和质押等

  • 财务考量:在截至2025年4月38日的12个月里,Bitstamp的收入约为

9586万美元。Rob1nhood预计该交易在完成后12个月内将实现调整后EBITDA (税息折旧及摊销前利润)的增值29. 收购Bitstamp堪称一次战略耐心与机遇把經的杰作,它在一夜之间将Rob1nhood的加 密货币业务从一个仅限美国零售用户的单一产品线,转变为一个业务多元、覆盖全球、具备 机构服务能力的强大业务板块。从零开始建立一个机构级加密业务既耗时又昂贵,需要数年 时间来建立信任、获取牌照和开发稳健的基础设施。同时,美国的加密货币监管环境充满了 不确定性。通过收购 Bitstamp-这个成立于2011年、全球运营时间最长、最受信任的 交易所之一23_-Robinhood成功绕过了这些碍。它不仅获得了技术和牌照,更重要的 是,获得了 Bitstamp 在过去14 年间穿越多个市场周期所建立起来的合规声和业务韧 性25。此举使Robinhood 的加密业务收入来源得以多元化,摆脱了对波动性大且面临监 管风险的美国零售交易的过度依赖,增加了更稳定的、基于费用的机构收入流。这是对其整 体加密战略的一次重大风险对冲。

2.2.征服北方:收购WonderFi并进军加章大市场

在2025年5月13日,Robinhood宣布同意以约2.5亿加元(约合1.79亿美 元)的全现金交易收购WonderFi24

  • 市场领导者地位:WonderF1运营着加享大两家规模最大、历史最悠久的合规加密货

币平台(Bitbuy和Coinsquare),托管资产超过21亿加元26。

  • 战略意图:此次交易为Robinhood进军加拿大市场提供了一个强大而直接的跳板。

Robinhood认为加拿大是全球增长最快的加密市场之一,此举完全符合其构建“全球 金融生态系统“的第三弧线战略26

  • 团队整合:WonderFi的领导图队和员工将加入Robinhood。在此之前,

在不到一个月的时间里相继宣布收购 WonderF1和 B1tstamp,揭示了 Robinhood 一 种清晰的“收购领导者”式国际扩张策路。公司没有选择缓慢、有机的逐国扩张模式,而是利 用其资本优势,在关键目标市场直接收购占主导地位且合规的参与者。在加拿大,他们选择 了WonderF1;在全球和欧盟市场,他们选择了Bitstamp.这种策略速度更快、风险更 低,并能立即带来市场份额、合规牌照和本地化专业知识。这标志着Robinhood的扩张模 式正从初创企业“快速行动、打破陈规”的风格,转变为一种更为成熟的、由其美国核心业务 利润驱动的“收钩并整合”的全球化playbook。

2.3.超越交易:收购X1进入信贷市场

2023 年6月,Rob1nhood以9508 万美元现金收购了信用卡初创公司X112.

  • X1的创新之处:X1提供一张无年费的精钢信用卡,其独特之处在于运用现代技术提

供创新功能,例如基于收入而非传统信用分来设定信用额度、一键取消订阅支付、以及 为一次性购物生成自动过期的虚拟卡等。

  • 战略价值:此次收购是Robinhood实现收入来源多元化、满足客户“全部关键金融

需求“的枢纽性举措,直接服务于其“钱包份额“第二弧线战略13。在当时, Robinhood正面临用户数量和交易收入下滑的挑战1。 收购X1的深层意义远不止于发行一张信用卡,其核心在于获取一个与客户关系和效据相关 的关键层面。一个券商账户能反映客户的投资行为,一个银行账户能显示其现金流,而一张 信用卡则能揭示其消费行为。通过增加信用卡业务,Robinhood得以构理起客户金融生活 的360度全景视图。这些数据对于交叉销售其他金融产品(如贷款、财富管理)和建立更 复杂的用户面像具有不可估量的价值。更重要的是,它将客户与Robinhood的关系从一种 低频的交易关系(投资时才使用)转变为一和高频的日常关系(消费时即使用),从而极大 地增强了用户粘性和应用的活跃度。这是将经典的“先置陆,再扩张”(Landand expand)策略成功应用于个人金融领域的典范。

2.4.强化核心:一系列战术性补强收购

除了上述大型并胸,Robinhood还进行了一系列规模较小但具有高度战路性的“补强型*收 购,以增强其特定平台能力1。

  • SayTechnologies(2021年8月,1.4亿美元):一个股东代理投票和管理层沟通

平台。

  • CoveMarkets(2021年12月):一家加密货币交易平台开发商。

  • Chartr(2023年12月):一家以数据可视化见长的金融新闻通讯社,现已并入

Sherwood Media 23

  • Marex FCM(2024年3月):一家英国期货执行经纪商,此次收购为Rob1nhood

推出期货交易铺平了道路12

  • TradePHR(2025年第一学度完成):一个为注册投资题问(RIA)提供服务的平

台,为Robinhood的平台带来了41θ亿美元的额外资产2。 这些规模较小的收购起到了”功能购买“和”人才吸纳“的作用,极大地加速了公司核心的“活 跃交易者”和“钱包份额”战略弧线的产品路线图。与其从零开始构建一个期赁清算系统,不如 直接收购MarexFCM并在几个月内上线该功能。与其自己开发代理投票工具,不如收购 Say TechnoLogies 并进行整合。与其耗费数年自建一个RIA 平台,不如收购 TradePMR并立即进入该市场。这体现了Robinhood在“自建“与“购买“之间务实的权 衡。公司不仅利用并购进行引人注目的版图扩张,更通过精准的外科手术式收购来填补能力 缺口,从而显著提升其产品开发的速度和效率。

第三部分:内生式创新--构建全栈式金融超级应用

本部分将详细梳理并分析Robinhood内部的主要产品开发项目,并将它们与公司的三大战 略弧线联系起来,展示其内生增长的动力。

3.1.财富与银行业务的民主化

在2025年3月27 日的第二届年度Gold主题活动上,Robinhood发布了一系列旨 在覆高端金融服务市场的产品1。

  • Robinhood Strategies:这并非一个签单的机器人顾问,而是一个主动管理的投

资组合服务。它根据客户情况配置由ETF和个股组成的混合投资组合(账户金领超 过500美元),提供节税策路,并由一个拥有超过50年华尔街经验的专业团队进 行管理L。其年管理费率为@.25%,但对Gold会员设有每年250美元的上限, 这使得超过16万美元的资产可以享受免费管理服务15.

  • Robinhood Banking:这是一项专为Gold会员设计的、计划于2025 年晚些时

候推出的高级银行服务。它提供高达4.80%的储蓄年化收益率(APY)、遗产规划 和专业税务咨询等私人银行级别的服务,以及高达250万美元的FDIC存款保 险15. 这些新产品的推出,是Rob1nhood 对其接心用户群体“成长“的直接回应。Rob1nhood 的早期用户大多是年轻、资产规模较小的首次投资者。十年后的今天,这些用户正步入 26多岁末和30多岁,他们的资产在增加,财富在积累,金融需求也变得日益复杂(例如 退休规划、税务筹划、遗产安排)。如果Robinhood无法提供这些高级服务,其客户最终 将“毕业“并把他们更大规模的资产转移到Charles Schwab 或Fidelity 等传统金融 机构。因此, Strategies和Banking既是防御性举措,也是进攻性举措。防御在于防止高价值客户 的流失;进攻在于腊准并捕获这一代人将要继承和积累的数万亿美元财富,从而实现其“扩大 下一代投资者钱包份额”的第二战略弧线。

3.2.抢占退休金市场:激进的IRA匹配计划

于 2822 年 12月推出的 RobinhoodIRA退休账户,以其顾覆行业的匹配计划迅速占 领市场11

  • 匹配率:所有客户的年度供款和账户转移均可获得1%的匹配。对于Robinhood

Gold订阅用户,年度供款的匹配率更是高达3%35。

  • 核心条款:该匹配金额不计人美国国税局(IRS)设定的年度个人供款上限。但该计划

附带了关键条款:获得匹配的资金必须在账户中保留至少5年,而要获得完整的3% 匹配,用户必须在首次获得Gold匹配后,持续订阅Gold服务至少一年35。

  • 市场反响:该计划取得了巨大成功。截至2025年第一季度,Robinhood的退休账

户资产管理规模(AUC)同比增长超过200%,达到144亿美元,并在随后增长至 超过160亿美元 IRA匹配计划是一项经过精密计算的、高成本的客户获取策略,其目标是锁定市场上“粘性 最高”的资产。退休金是典型的长期资本,与可以随时提取的交易资金不同,IRA资产通常 会在账户中存放数十年。通过提供远高于任何竞争对手的匹配率,Robinhood实际上是在 “付费”吸引用户将这些宝责的长期资产转移到其平台。其中,5年的资金保留期是该重略的 关键。它确保了这些资产能在平台上留存足够长的时间,以便 Robinhood 通过其他方式 (如睡取净利息收入、引导用户使用其他Gold服务等)将其赁币化,从而收回前期投入的 匹配成本。这是一项高明但昂责的博奔,旨在迅造扩大其长期托管资产规模,这是街量平台 价值的关键指标,也是实现“钱包份额“弧线的直接体现。

3.3.服务超级用户:24小时市场与高级交易工具

为了实现第一线(主导活跃交易市场)的目标,Robinhood不新突破市场准入的界限。

  • 24小时市场:于2023年推出,使Robinhood成为美国唯一一家提供个股

5x24小时交易的零售芬商,交易时间从美东时间周日晚上8点持续到周五晚上 8点。

  • 功能与限制:该市场支持对整股进行限价单交易,可交易的证党名单不断扩大,截至

2024年2月已达到922支“”。但隔夜交易也伴殖着独特的风险,如流动性较低 和买卖价差扩大等。 24小时市场是一项战略性举措,旨在模期加密货币和股票交易之间的界限,从而培养用户对 未来全天候连续市场的习惯。加密市场永不休市,这对全球活跃交易者具有巨大吸引力。而 传统段票市场的交易时间则显得陈旧和受限。通过提供5x24小时的股票交易, Robinhood将一种类似加密货币的交易体验带入了股票市场,这直接吸引l了那些希望对赐 夜突发新闻做出即时反应的活跃交易者。此举也为公司未案实现资产代币化(第三弧线的目 标)后的24/7交易莫定了基础。这是一种面向未来的平台和用户预期管理策略。

3.4.智能层:集成人工智能的 Robinhood Cortex

Robinhood正在人工智能领域进行重大投入,并充分利用其与亚马逊云股务(AWS)的合 作关系“

  • RobinhoodCortex:于2025年3月发布,Cortex是一歌人工智能投资工

具,旨在提供实时市场分析、发据投资机会并提供深度洞察1。其功能包括“股票摘 要”(StockDigests),可以快速总结某支股票当天价格波动的原因5。

  • 交易构建器(Trade Builder):这是一个由Cortex驱动的工具,旨在帮助用户

  • 后端人工智能:公司正在探索使用AWS的生成式AI解决方案,如Amazon

Nova,以实现更具成本效益的规模化运营,例如用于款诈调查和创建自主决策的AI 代理 人工智能是Robinhood将“私人财富管理”服务规模化、并以接近零的边际成本提供给数

百万用户的核心战略。传统的财富管理依赖于昂贵且难以规模化的人类顾问。机器人顾问是

第一步,但往往被认为肤乏个性化。Cortex代表了下一个演进方向:由人工智能驱动的、

个性化的深度洞察。它能够提供传统投顾所能提供的分析(例如,“为什么我的股票今天跌 了?”),但能以即时、在应用内的方式,同时触达数百万用户。这使得Robinhood能够 在不雇佣数干名私人银行家的情况下,提供其所宣称的“私人银行体验”15。这是一种以技术 驱动,旨在实现市场准入和市场智慧双重民主化的策路。

3.5.内容护城河:Sherwood Media 计划

2023 年1月,Robinhood宣布成立一个独立的媒体子公司--Sherwood Media, LLC 1

  • 领导层与愿景:该媒体由科技媒体TheVerge的创始人JoshuaTopolsky领

导,旨在成为一个为“下一代“提供关于市场、商业、科技和金钱文化新阅的权威机 构

  • 运营策略:它建立在广受欢迎的“Snacks”新闻通讯(每周拥有数干万读者)的成功基

础之上,并正在扩展到原创报道、社交优先内容和线下活动等领域4。该媒体由广告 支持,不设付费理,这与Robinhood"金融民主化"的使命保持一致"。 SherwoodMedia实际上是一个伪装成媒体公司的、高度复杂的营销漏斗顶端和用户留存 引擎。Robinhood的目标用户是年轻、精明且高度“在线”的群体2,他们获取信息的方式 与前几代人截然不同。通过创建一个高质量、编辑独立但理念一致的媒体品牌,Robinhood 能够以目标受众习惯的方式与他们互动,在他们考虚开立券商账户之前就建立起信任和品牌 亲和力。对于现有用户,它提供了有价值的内容,使他们能够每日与Robinhood生态系统 保持互动,从面降低用户流失率。这是一项长期战略,旨在主导整整一代人关于金转和投资 的话语权,从而建立起一个强大的、仅专注于交易功能的竟争对手难以复制的防御性护城 河。

第四部分:加密货币攻势--从零售交易到全球基础设施

本部分将整合所有与加密货币相关的举措,清晰地展示Rob1nhood在该领域的多方面战 略。加密货币已从一个简单的附加功能,演变为其核心业务支柱之一。在2025年第一重 度,加密贷币收入同比翻倍,成为推动交易总收入同比增长77%的主要动力。

4.1.欧洲桥头堡:在MiCA框架下逐国推进

Robinhood一直在战略性地向欧洲扩张其加密货币服务,充分利用了欧盟《加密资产市场 法规)(M1CA)所提供的监管清晰度”

  • 多国上线:截至2025年1月,公司已在意大利、波兰、立陶宛和西班牙等国推出

了本地化的加密交易应用17。

  • 获取牌照:公司于2025年4月在立陶宛获得了券商牌照,这使其能够在整个欧盟

范围内提供投资服务21。

  • 激励措施:为了推动用户增长,Robinhood在欧洲市场推出了激励计划,例如为新

用户的加密货币存款提供1%的匹配奖励2"。 Robinhood正在将欧盟的监管确定性作为其相对于不确定的美国市场的竞争优势。美国证 券交易委员会(SEC)对加密行业采取了以执法为导向的强硬立场,为Robinhood等公司 带来了巨大的蓝管不确定性。相比之下,欧盟的M1CA法规为加密服务提供商提供了一套清 晰、全面的规则手册。通过积极拥抱 MiCA 并在欧洲大举扩张,Robinhood 可以在一个更 可预测的环境中发展其加密业务。这使其能够测试和推广在美国可能难以推出的新产品(例 如通过 Bitstamp 提供的质押和借贷服务)。欧洲实际上正在成为其全球加密货币创新的 试验场。

4.2.双钱包战略:平衡托管的便捷性与Web3的自主性

Robinhood采取了双轨并行的策略,为不同需求的用户提供两种截然不同的加密货币产 品。 表2:Robinhood加密产品对比(托管平台vs.自托管钱包) Robinhood Crypto(主应 特性 Robinhood WalLet (独立应用) 来 用内) 49 产品名称 Robinhood Crypto Robinhocd wallet 49 白托管式(Self-Custody) 托管模型 托管式(Custodial) 49 私铜控制 由用户自己控制 由Robinhood 控制 权 Web3 用户,DeF1 夏好者 初学者、交易者 3 目标用户 54 兑换、连接dAPP、存储 NFT 主要用例 购买、出售、持有加密货币 安全费任 主要由 Robinhood 负贵 主要由用户自己负责 精选的主流网络 支持多条区块牺网络(以太坊、比特T、Solan 支持网络 a等) Robinhood Crypto(托管式):这是集成在Robinhood主应用内的核心加密交 易功能。它提供简单的购买、出售和持有服务。私钥由Robinhood 管理,公司负责 经过管选的、包含主流币种的名单5"。

  • RobinhoodWallet(自托管式):这是一个独立的Web3钱包应用,于2023

年面向10S用户推出,2624 年登陆Andro1d5,在此应用中,用户完全控制自 已的私钥和助记词49。它支持包括以太坊、比特币、Solana、Polygon在内的多个 区块链网络,并允许用户连接去中心化应用(dApps)和管理NFT(尽管目前尚不支 持发送NFT) 双钱包战略是一种精妙的用户分层策略,它使Robinhood能够覆盖从加密赁币新手到资深 爱好者的整个用户光谐,同时又不损害其核心平台的简洁性。绝大多效潜在的加密货币用户 对自托管的复杂性(如管理私钥、助记词)感到畏惧。简单、安全的托管式Robinhood Crypto平台正是为他们设计的,它最大限度地减少了使用门榴和用户的安全顾虑。与此同 时,一个规模虽小但参与度高、影响力大的用户群体则渴望完全的控制权和进入更广阔的 Web3 世界(DeFi、NFTs)。独立的 Robinhood Wallet 应用满足了他们的需求。通 过将两者作为独立应用,Robinhood成功地避免了Web3钱包的复杂性“污染”核心平台 的简洁用户体验。这使其能够同时满足大众市场和加密核心用户的需求,从而最大化其潜在 市场规模

4.3,下一个前沿:探索面向全球市场的资产代币化

作为其第三战略弧线的一部分,Robinhood正在积极规划利用区块链技术来代币化传统金 融资产1

  • 计划内容:开发一个区块链网络,使欧溯的零售投资者能够交易代币化的美国证

券1

  • 潜在合作伙伴:据报道,Arbitrum和Solana基金会是该计划底层区块链技术的

有力竞争者71。

  • CEO的惠景:公司CEDVLadTenev普公开将创建代币的高效性与传统IPO流

程的”繁琐”进行对比,这强烈地表明了他对这一方向的信心21。 资产代币化计划是Robinhood三大战略弧线的最线交汇点。对于第一弧线(活跃交易 者),它提供了一种全新的、极具创新性的谈产英别,供活跃交易者进行全天候交易。对于

第二弧线(钱包份额),它使Robinhood能够提供传统机构无法提供的独特投资产品,进

一步巩固其作为下一代金融中心的地位。对于第三弧线(全球生态系统),它正是构湿全球

金融生态系统的字面体现一利用区块链技术打破历史上分制资本市场的地理屋碍。这并非一 个边缘项目,而是Robinhood战略的终局。其所有的收购、产品发布和国际扩张,都是在 为这个未来状态铺路--一个在其平台上,“加密金融”与“传统金融”之间界限完全消失的末 来。

第五部分:综合分析与战略展望

本部分将综合前述分析,对Robinhood的战略进行全面评估并提供前瞻性理点。

5.1.串联全局:并购与创新如何驱动三大战略弧线

Robinhood的所有行动都服务于一个连贯的、多层次的战路。公司并非在现立地推出产品 或进行收购,而是将这些行动作为实现其三大战略弧线的有机组成部分。例如,对 供了关键的全球牌照和机构级基础设施,而后者正是其“全球生态系统"弧线(第一部分1.3 节)的终极目标。同样,极具吸引I力的IRA匹配计划(第三部分3.2节)和对X1的收 深度锁定用户的长期资产和日常消费。而24小时市场和高级交易工具的推出(第三部分 ) 的收入又为另外两个更长期的弧线提供了资金支持。这种环环相扣的布局显示了其战略的高 度协同性。

5.2.财务影响分析

Robinhood的战略转型已在财务和运营数据上取得了是著成果。 表3:Robinhood关键业绩指标(KPI)(2025年第一季度及同比) 2025年第一季度数据 指标类别 同比变化 具体指标 来源

9.27亿美元

  • 59%

收入 总净收人 交易收人

5.83亿美元

  • 77%

加密质币收入

  • 180%

2.52亿美元

2.49亿美元

  • 56%

期权收入 股累收入 5688万美元

  • 44%

净利息较入

2.99亿美元

  • 14%

盈利能力

3.36亿美元

净利润

  • 114%

4.78亿美元

调整后 EBITDA

  • 98%

  • 106%

释后每股收(EPS)

0.37美元

用户指标 人金客户数 2589万

  • 8

Robinhood Gold 订间数 328万

  • 99%

资产指标 平台总资产(AUC) 2210亿美元

  • 70%

(创纪录) 188亿美元(季度) 144亿美元 返休账户 AUC

  • 286%

145美元

  • 39%

单用户指标 每用户平均级入(ARPU) 数据清晰地表明,公司的战略正在奏效。2025年第一季座的业绩异常强劲:收入同比增长 58%,净利润增长114%,净存款和Gold订阅用户数均创下历史新高 ”。尤其是加密货币 收入同比翻倍,成为交易收入增长的最主要动力”。这证明了公司聚焦活跃交易者和拓展新 产品的策略,成功地驱动了收入和盈利能力的双重增长。同时,净存款和总托管资产的巨额 增长,也表明其旨在扩大“钱包份额”的第二弧线战路正获得巨大的市场牵引力。

5.3.关风险与挑战:应对监管审查与市场竞争

尽管取得了成功,Robinhood 依然面临着重大风险。

  • 监管风险(美国):对“订单流支付”(PFOF)的依载仍然是其主要骄点。这种商业模

式一直受到监管机构的批评,并在某些国家被禁止1。美国证券交易委员会(SEC) 过去曾因此对Robinhood处以罚款12。此外,美国对加密货币的监管环境持续不 明朗,这对Robinhood的核心业务构成了长期威胁。

  • 执行风险:公司正在同时推进一个极其宏大的议程,包括多项大规模的收购整合

(Bitstamp、WonderF1)和新产品发布(Banking、Strateg1es).成功整合 这些业务并实现预期的协同效应,是一项巨大的运营挑战。收购所带来的成本也相当可 现,例如 Bitstamp 在2025 年剩余时间预计将产生6508万美元的运营成本, 而TradePMR全年相关成本预计为8500万美元2。

  • 市场波动性:公司收入的很大一部分仍然依赖于交易量7,这使其业务对零售交易情结

和加密市场周期的下行高度敏感。 Robinhood的整个多元化战略(第二和第三弧线)可以被视为一个大规模的、长期的对 冲,旨在抵御其核心业务(第一弧线)所固有的监管和周期性风险。其核心的美国零售交易 业务虽然利润丰厚,但极易受到PFOF监管变化和市场情绪低递的冲击。通过拓展订阅收入 (Gold)、利息收入(Banking、现金管理)和财富管理费(Strategies),公司正在创 造更稳定、更具可预测性的经常性收入流,同时,通过向拥有更清晰加密法规的地区(如欧 盟)进行国际扩张,公司正在对冲其加密业务面临的美国监管风险。因此,每一个与美国股 票交易非直接相关的战略举措,都是为了构建一个更具韧性、更多元化、波动性更低的长期 商业模式。

5.4,结论性评估:Robinhood 的发展轨迹与未来定位

Robinhood已经成功地度过了其上市后和“Meme 股“时代后的挑战期,通过制定并积极扶 行一个活晰的三叉就式战略愿景,从一个单一业务的交易应用,转变为一个迅速多元化的金 融科技集团。 展望未来,Robinhood的竞争对手已不再仅仅是其他券商。凭借其银行、信贷和财富管理 产品,它正与 Charles Schwab、F1delity 等传统金融巨头以及大型银行展开正面交 鐘。而凭借其全球化的加密货币和资产代币化雄心,它正将自已定位为未来金融领域的基石 性参与者。 总而言之,Rob1nhood的战路宏大且充满执行风险,但它同样逻输连贸且资金充裕。如果 公司能够成功整合其收胸的业务,井规模化其新推出的产品,它完全有能力实现其愿景一—成 为全球下一代投资者首选的、一站式的金融超级应用。未来发展的关键,将在于其能否在应 对复杂的全球监管环境的同时,有效管理其主动承担的巨大运营复杂性。 Works cited Boboev, accessed June 26, https://www.f1nextra.com/blogpost1ng/28485/deep-d1ve- 2025, robinhoods-futl-stack-fintech-transformation 2. Robinhood Markets, Inc. Earnings Presentation F1rst Quarter accessed June '9 2025, https://investors.robinhood.com/static-files/eeb93474- ee4f - 47f1-93c3 -8d0b33b584e1

3.Robinhood's

investing for beg1nners accessed June TheStreet, ‘9 2025, https://www.thestreet.com/crypto/innovation/robinhoods- strategy-to-simplify-crypto-investing-for-beginners Robinhood Adds New Toots for Active Traders on Mobile 4. PYMNTS . coM, passasoe June 26, https://www.pynnts.com/f1nanc1al-apps/2025/rob1nhood- 2025, adds-new-tools-for-active-traders-on-mobile/

5.US FinTech Robinhood to taunch Legend platform in UK

5.US FinTech Robinhood

1nUK launch Legendplatform to June Business Cloud, accessed 26, '97 https://businesscloud.co.uk/news/us -fintech-robinhood- 2025, to-launch-tegend-platform-in-uk/

6.Robinhood Markets,

30, Q12025 Earnings Apr11

6.Robinhood Markets, Inc. Q1 2025 Earnings April 30, 2025

2025 Inc.. Corporate Tenev, Speakers Vladim1r accessed June 26, Corporate Speakers Vladimir Tenev,accessed June26, https://investors.robinhood.con/static-files/cb828f9b- 2025, gf3e -4c0f-9495-b8f20f7e32ed 2025 Results Wed, Robinhood First Quarter 7. Reports accessed June 16:05 https://investors.robinhood.com/news-releases/news- 2025, release-detaits/robimhood-reports-first-quarter-2025-results/ accessed June 8. https://investors.robinhood.con/static- 2025, 26, files/751d013e -a623-4ca8 -a8ce -32a57@ac9539 .GlobeNewswire,

9.Robinhood Reports First Quarter 2025 Results

accessed June 26,2025. https://waw.globenewswire.com/news- relea5e/2025/04/30/3071835/0/en/Rob1nh0od -Reports-F1rst- Quarter-2025-Results.html Form for Rob1nhood Markets f1led 02/18/2025, 10. 18-K INC accessed June 26, https://investors.robinhood.com/static-files/66a82ca3- 2025, 83b5 -418e-bde7-bab3c223004 EBSCO Research accessed June 26, Starters, 11. Robinhood 一 2025, https://www. ebsco . com/research- starters/technology/robinhood Robinhood June 26, Markets W1k1ped1a, accessed 12. 2025, https://en.wik1ped1a.org/w1k1/Rob1nhood_Markets Buys Credit Card Provider X1 for

13. Robinhood

$95 Million, accessed June 26, https://www.investopedia.con/robinhood-buys-credit- 2025, card-prov1der x1-7551724 14. X1 FinTech Global, accessed June 26, into-credit-sector-with-95n-acquisition-of-x1/ Banking. Introducing Robinhood Strategies, Robinhood 15 . pue Robinhood Cortex Robinhood Newsroom, accessed June 26, 2025, https://newsroom,aboutrobinhood.con/introducing- strategies-banking and cortex/ Robinhood Strategies |This Is More Than a “Robo Advisor", 16. accessed June 26, 2025, https://robinhood.com/us/en/strategies/ Robinhood Launches crypto trading in Spain l Digital Watch 17. observatory, 26, accessed June https://dig .watch/updates/robinhood- Launches-crypto- 2025, trading-in-spain Robinhood Expands Across Europe, Launching Crypto Services in 18. accessed Spain, June 26, https://www. financemagnates. com/forex/robinhood- 2025, Robinhood Crypto is now available to users in Spain 19 . The Paypers, accessed June 26, https ://thepaypers.con/cryptocurrencies/robinhood- 2625, crypto-is-now-avaitabte-to-users-in-spain--1271945 20. News FX Group, accessed aune 26, https://fxnewsgroup.com/forex-news/retail- 2025, forex/robinhood-touts-biggest-crypto-announcements-of-the- year/ Robinhood plans blockchain for US asset trading in Europe: 21. 26, Report Cointelegraph, accessed June https://cointelegraph.com/news/robinhood-blockchain-us- 2025, asset-trading-tokenization-europe Robinhood Is Bringing US Securities On-Chain in Europe 22. Boost for Altcoins Mitrade, accessed June '9 https://www.mitrade.com/insights/news/live- 2025, news/article-3-808807-28258508

23.Robinhood Expands Global

Crypto Ambitions with Bitstamp Acquisition FinTech Weekly, accessed June 26, https://ww.fintechweekly.com/magazine/articles/robinho 2025, od-acquires-bitstamp-global-crypto-expansion Robinhood $208Macquisitionof crypto exchange completes 24. Bitstamp Cointelegraph, passasse June 26, https://cointelegraph.com/news/robinhood-200-mill1on- 2625, acquisition-bitstamp Acquisition of Bitstamp, accessed June Robinhood Completes 25. https://blog.bitstamp.net/post/robinhood-completes- 26, 2025, Robinhood To Acquire WonderF1

  • Robinhood Newsroom, accessed

June 26, 2025, https://news room.aboutrob1nhood.com/rob1nhood- to-acquire-wonderfi/ WonderF1 Enters 1nto Def1nitive Agreement To Be Acquired by 27. Robinhood Markets, accessed June 26, https : //waw.wonder. f1/press-release/wonderf1-enters- 2025, Trading platform bets on ad-funded business journalism with 26. Sherwood News Press Gazette, accessed June 26, 2025, https://pressgazette.co.uk/north-america/sherwood-mews- rob1nhood-joshua-topolsky/ Acquisition of Bitstamp, accessed June 26, Robinhood Closes 29 . https://investors.robinhood.con/static-files/4183f04d- 2025, 6658-438d-9845-64ffa8e7402d

30. Robinhood to Acquire Bitstamp

  • GlobeNewswire, accessed June

https://waw.globenewsw1re.com/news= 2025, 26, relea5e/2024/06/06/2894548/0/en/Robinhood-to-Acquire- Bitstanp.htnt Summaryof Bitstamp Acquisition of Pending Rob1nhood 31. accessed Investors, June 26, https://investors.robinhood.com/stat1c-files/be03a25a- 2025, 29c4-4e31-ae6f-227efbdae196 Robinhood Acquires Credit Card Fintech X1 for $95 Million 32. accessed Finance Council, June World 26, https://worldfinancecouncil.org/news/robinhood- 2025, acquires-credit-card-fintech-x1-for 95-mittion/ Robinhood Acquires FinTech Firm X1 to Offer No-Fee Credit Card PYMNTS.con, accessed June 26, 2025, https://wwr.pymnts.com/acquisitions/2023/robinhood- acquires-fintech-firm-xl-to-offer-no-fee-credit-card/ Robinhood Launched A New Robo-Advisor. Here's How It Stacks 34. June26. UpAgainst The Bankrate, Competition accessed 2025, https://waw.bankrate,com/investing/robinhood- strategies/ IRA June 26, overview Robinhood, accessed 35 . 2025, https://robinhood.com/support/articles/ira-overview/ 26, IRA match FAQ Robinhood, accessed June 36. https://robinhood.com/support/articles/ira-match-faq/ 2025, Claim enuue Robinhood Retirenent $210 37. on dn contributions, accessed June 26, 2025, https://robinhood.com/us/en/about/retirenent/ June IRA FAQ accessed 26, Robinhood, 38. https://robinhood.com/us/en/support/articles/ira-natch- 2025, faq/ 3% Robinhood Gola IRA Contribution Match Terms & Conditions, 39 . accessed June 26, 2025, https://cdn.robinhood.com/assets/robinhood/legal/Golak2 Just In: New Symbols on the Robinhood 24 Hour Market 48 . accessed June 26, https://newsroom.aboutrobinhood.com/just-in-new- 2025, symbols=on-the-robinhood-24-hour-market/ 41. ETFS, accessed June 26, https://f1f.com/1ndex.php? 2025, opt1on=com_content&v1ew=art1cle&1d=23869scat1d=/8s1ten1d=1749 passasse 26, Robinhood Hour Market, June 42. 24 https ://rob1nhood.com/us/en/support/art1cles/24hour- 2025, market/ Extended-hours trading Rob1nhood, accessed https://robinhood.com/support/articles/extendedhours- 2025, An innovative financial services leader finds the right AI solution: Robinhood and Amazon Nova |Artificial Intelligence Learning. and Mach1ne accessed June 26, https://aws,anazon.com/blogs/machine-learning/an- 2025, innovative-financial-services·Leader-finds-the-right-ai- solution-robinhood and-amazon-nova/ YouTube, accessed aun 26,

2025. https://wr.youtube.com/watch?v-d5-wn39u_ TE

46. Robinhood Announces Sherwood Media, LLC, accessed June 26,

https://news room.about robinhood.com/robinhood- 2025, announces - sherwood-media-llc/ GlobeNewswire, RobinhoodAnnouncesSherwood Media, LLC accessed June 26, https://waw.globenewswire.com/news- 2025, release/2023/61/17/2599135/0/en/Robinhood-Announces-Sherwood Media-LLC.html

48. US Giant Robinhood is Coming to Europe

  • Connecting the dots

FinTech, June in accessed 26, 2025, https://vww.connectingthedotsinfin. tech/us -giant- robinhood-1s-coming to-europe/ acrypto wallet? accessed June 26, What Robinhood, 49. https://robinhood.com/us/en/learn/articles/what-is-a- 2625, crypto-waltet/ Robinhood Web3 Wallet Review - Forbes Advisor, accessed June 50. 26, https://www.forbes,com/advisor/investing/cryptocurrency 2025, /robinhood-wallet-review/ Robinhood accessed 51. June 26, 2025, https://robinhood.com/support/articles/robinhood- wallet/ 26, accessed

52.Robinhood

June 52. Crypto, 2025,https://robinhood.com/us/en/about/crypto/ June 26, Robinhood, 53.

53.Crypto

transfers accessed 2025, https://robinhood.com/support/articles/crypto- transfers/ Market:目录三 下一篇·2025年F0MC票委立场分析>

原始排版图

原始导出图超过单张 WebP 的尺寸上限,以下图片按从上到下的顺序连续保存。 Robinhood 的蜕变:金融科技与加密货币领域战略扩张分析:微信公众号导出原始排版图(第 1 段,共 2 段) Robinhood 的蜕变:金融科技与加密货币领域战略扩张分析:微信公众号导出原始排版图(第 2 段,共 2 段)

TinyML MCU 等级开源推理引擎列表

· 閱讀時間約 5 分鐘
w0x7ce
MySelf

发布于 2025-06-11 23:45:06(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 3065 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

开源推理引l擎(open-SourceInferenceEngines) 目前主流且活跃的开源 TinyML 推理引掌Github 1k stars+的项目,它们为在 MCU上 实现神经网络模型推理提供了核心支持。

  • Arm CMSIS-NN/DSP (CMSIS-6)

  • 专为ArmCortex-M核心设计的函数库,提供高效能的神经网络(NN)与数字信号处

理(DSP)核心函数

  • https://github. com/ARM-software/CMSIS_6

  • Google LiteRT (TensorFLow Lite)

  • Google 推出的轻量级运行时,是TensorFLow Lite 的重要组成部分。

https://g1thub.com/google-a1-edge/Litert

  • Google TensorFlow Lite for Microcontrollers (TFLite-Micro)

  • 官方出品,专为 MCU 设计的 TensorFLow Lite 版本,是TinyML 领域的标杆。

https://github.com/tensorflow/tflite-micro

  • PyTorch ExecuTorch

  • PyTorch官方推出的新一代边螺设备推理解决方案,具备高度可移植性。

  • https://github.com/pytorch/executorch

  • PyTorch QNNPack

  • 专为量化神经网络设计的高性能函数库,常与PyTorch Mobile整合。

https://github.com/pytorch/qnnpack

https://github.com/Tencent/TNN

■一个极度轻量级的机器学习推理框架,专为MCU设计。

https://github.com/Fraunhofer-IMS/AIfES_for_Arduino

■小米开源的移动端深度学习预测框架,强调异构计算加造。 https://github.com/XiaoMi/mace

  • PaddlePaddle Paddle-Lite

  • 百度飞浆推出的轻量化推理引擎,支持包括ArmCortex-M在内的多种硬件。

  • https://github.com/PaddlePaddle/Paddle-Lite

  • ELoquent EloquentMicroML

  • 一个对Arduino开发者非常友好的机器学习函数库。

  • https ://g1thub. com/eloquentarduino/EloquentM1croML

  • Kraiskit ONNX2C

■一个能将ONNX模型直接转换为C语言代码的实用工具。 https://github.com/kraiskil/onnx2c

■商汤科技开源的高性能AI推理计算函数库。 = https://g1thub.com/0penPPL/ppl .nn

  • Open AI Lab Tengine

■由OPEN AILAB开源的AIoT应用推理框架,专为边缴计算设计。

AI 相关编译器(AI-RelatedCompilers) 编译器在将高阶AI模型转换为MCU可执行代码的过程中扮演关键角色,能极大化硬件性 能。

  • MicroTVM

  • ApacheTVM的微型版本,可将模型编译到无操作系统的裸机环境。

  • https://tvn.hyper a1/docs/topic/microtvm/

  • Skymizer ONNC

■一个开源的神经网络编详器,致力于将ONNX模型转换到各种AI加速器。 = https://github.com/ONNC/onnc

  • Arm Ethos-U Vela Conpiler

  • 专为ArmEthos-U系列NPU设计的离线编译器,用于优化神经网络模型

  • https://pypi. org/project/ethos-u-vela/

MCU专用工具与平台(Mcu-SpecificTools&Platforms) 各大MCU厂商也推出了自家的AI开发套件与工具,以简化在其硬件平台上的开发流程。

  • Edge Inpulse

一个领先的在线TinyML开发平台,提供从数据收案、模型训练到部署的完整工作流

程。

  • https://docs.edge1mput se. con/docs

  • STM32CubeAI (X-CUBE-AI)

  • 意法半导体(ST)官方工具,可将预训练好的模型转换为适用于STM32微控制器的优

化代码。 https://stm32ai.st.com/stm32-cube-ai/

■恩智浦(NXP)的AI开发环境,提供软件、工具与推理引擎,支持旗下多款处理器。 ■ https://www.nxp.com/design/design-center/software/eiq-ai- development-environment:EIQ

intelligence/e-ai/e-ai-development-environment-microcontrollers

NOTE·目录三 <上一篇·EDAPCB布线中的寻路智慧:深入探索Lee算法的可视化之旅

原始排版图

TinyML MCU 等级开源推理引擎列表:微信公众号导出原始排版图

EDA PCB布线中的寻路智慧:深入探索Lee算法的可视化之旅

· 閱讀時間約 18 分鐘
w0x7ce
MySelf

发布于 2025-05-28 18:43:55(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 13902 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

在现代电子产品设计的复杂世界中,EDA(电子设计自动化)工具扮演着至关重要的角 色。其中,PCB(印刷电路板)的设计是连接各个电子元器件、实现电路功能的物理载 体。一个常见的问题是:EDA工具是如何在密集的元器件之间,自动规划出那些婉蜓曲 折却又互不干扰的铜箔走线的呢?这青后其实隐着精妙的算法。本文将以PCB自动布 线中的一个基础且经典的寻路算法—-Lee算法(迷宫算法)为例,带你一起探索其工作 原理,并通过Python代码和可视化来直观感受其魅力。 从原理图到PCB:寻路的起点 在EDA工具中绘制PCB时,通常会先绘制电踏原理图(Schematic)。原理图定义了元器件之间的逻辑 连接关系,但并不关心它们的物理布局。当原理图转换为PCB布局时,EDA工具会根据元器件的物理封 装(Footprint)和原理至中的连接信息(通常通过网络表Netlist传递),在PCB板上放置元器 件,并在需要连报的引脚之间显示飞线(FLyLines/Ratsnest)。 这些飞线仅仅是逻辑连接的提示,它们相互交叉,杂乱无意。真正的挑战在于如何将这些飞线转换为实 际的、遵循各种设计规则(如最小问距、线宽,层限制等)的铜结走线。这就是自动布线器 (Autorouter)的用武之地,而寻路算法则是自动布线器的核心。 Lee算法(迷宫算法):如水波般探索 Lee算法,因其发明者C.Y。Lee而得名,也常被称为递宫算法或洪水填充算法、它是一种基于广度 优先接察(BFS)的网格寻路算法,以其完备性(只要路径存在就能找到)和最优性(在单位成本一 致时找到最短路径)而著称。 首先套一下效果 MP4: Drawing Path (Point 16/19)

1.核心思想

想象一下,在一个迷宫中,从起点滴人一滴水。水波会向所有可通行的方向均速扩敬。第一波到达的地 方距离起点为1,第二波到达的地方距惠为2,以此类推。当水波“滩没“终点时,我们就可以从终点沿 着水波退回的方向(即效字减小的方向)找到一条回到起点的最短路径。这就是Lee算法的直观理解。

2.算法步骤

:胃格化(Gridding):

  • 可通过单元(Traversable Cells)

:标记为例如或一个特殊的“末访问“值(如-1)。 障碍物单元(Obstacles) :如元器件焊盘、已布好的其他走线、过孔、禁止布线区等,标记为例如1或一个特炼的 “险物”值(如-2)。

  • 起点(Start Node)S

:路径的开始引脚。

  • 线点(End Node)E

:路径的目标引脚。

  • 将PCB的布线层(或多层空间)象成一个巨大的横盘或网格。每个小格子代表一个潜在的布

线单元。

  • 标记网格

  • 波前扩展(wave Expansion/ Propagation):

  • 从队列头蕴取出一个单元格P(当前处理的单元格)。

■检查P是否为终点E。如果是,则路径已找到,可以结束扩展,进入回潮阶段。

  • 对于P的所有有效邻居M(通常是上、下、左、右四个方向):

  • 有效性判断

:邻居N必须在网格边界内、不能是障物、并且之前末被访问过(即其在 distance_grid 中的值仍为 - 1)。

  • 标记与入队

:如果N 有效,美消其在 distancc_grid 中的距惠值设为 distancc_grid [P] +1 ,并记录P是N的父节点(用于后续路径回湖)。然后将N加入队列尾部。

  • 初始化队列

:创建一个队列(通常便用collections。dcquc),并将起点5故人队列。在记票距 施的网格(我们称之为distance_grid)中,将起点5 的距离标记为0。

  • 循环扩展

:只要队列不为空: 路径国测(Path Retracing):

  • 从终点E开始。

■根据父节点记录,反向查找:找到E的父节点,再找到该父节点的父节点,依此类推。

  • 将这条反向路径上的所有节点收集起果。

  • 将收集到的节点顺序反转,即得到从起点5到终点E的最短路径。

  • 如果成功找到终点E:

  • 无路径:

  • 如果队列变为空,但终点E仍未被访问到,则说明从5到E之间不存在可通行的路径。

3.可视化Lee算法的魅力曾

通过编程(例如使用Python和MatpLotLib库),我们可以将Lee算法的每一步执行过程都可视化出 采,这对于理解算法非常有帮助。 首先引入相关的头文件 inport nurpy as np 1nport matplotlib.pyplot as plt inport matplatlib.patheffects # For text stroke 1nport collections Inport time # For optional celays between steps # This line can be helpful in Jupyter Notebook for interactive plots, 8# but might require Installing loympl or enabling a specific backend. 9# For Colab, the defauIt Inline backend will show pTots after cell exe # or murltiple plots if plt.pause{) is used extensiveTy in a single ce] 11# amatplotlib notebook 12#atpotlIb Lpyapt 然后实现核心的lee_algorithm_visual_detailed

  • -- I. Lee Algorithe Core Inplementation

def lec_algorithn_visual_detailed(grid, start, end, visualize_steps=Fa Lee Algorithn inplementation with step-by-step visualization of w8 cxpansion and path backtracking. Parameters: grid (np.array): 20 numpy array, for traversable, 1 for obstacle start (tuple): (row, col) coordinates of the start point. visualize_steps (bool): If True, visualizes after each expansion 5 fig_live (natplotlib.figure.Figure, optional): Figure object for 1. Returns: (path, distance_grid, wave_front_history) path (list): List of {row, col) coordinates for the path, or None. distance_grid (np.array): The final grid shoving distances fron th wave_front_history (list): List of grid states during wavefront ex) (if visualize_steps=False) . If True, th. night be inconplete as visualization is rows, cols = grid.shape Input validatfon 1f not (θ <= start[θ] < rows and e <= start[1] < cols and θ <= enc[θ] < rows and e <= end[1] < cols): print(fError: 5tart {start} or End {end} is out of grid bound return None, None, None if grid[start[θ], start[1]] == 1: print(fError: 5tart {start} is an an obstacle.") return None, grid, None if grid[end[0], end[1]] == 1: print(fError: End (end) is on an obstacle.") return None, grid, None fistance_grid = np.full((rous, cols], -1。 dtype=int) x -1l: unvisit; parent_grid = () Using a dictionary for porent tracking: ((r, c) wave_front_history - [] distance_grid[grid == 1] = -2 Mark obstacles queue = collections.deque() queue,append(start) distance_grid[start[0] . start[1]] = β if not visualize_steps: wave_front_history append (distance_grid.copy()) elif ax_live and fig_live: visualize_grid_live{ax_live, distance_grid, "Wave Step: Initia fig_live.canvas draw() plt.pause(1. 0) noves = [(-1, D), [1, @), (θ, -1), {θ, 1)] # Up, Down, Left, Righ path_found = Falsc step_count = 0 while queue: step_count += 1 curr_r, curr_c = queue-popleft(1 5 1. if (curr_r, curr_c) == end: path_found = Truc If visualize_steps and ax_live and fig_live: visualize_grid_live(ax_live, distance_grid, fWave 5te] fig_live,canvas.draw() plt. pause(0.5) break made_changc_in_this_cxpansion = Falsc for dr, dc in moves: next_r, next_c = curr_r + dr, curr_c + dc if e <= next_r < rous and e c= next_c < cos and distance_grid[next_r, next_c] = distance_grid[curr_r, parent_grid[(next_r, next_c)] = (curr_r, curr_c) queue.append((next_r, next_c)) made_change_in_this_expansion = True if visualizc_steps and ax_live and fig_live and made_changc_in. visualize_grid_live(ax_Llive, distance_grid, f"Wave Step [5 fig_live.canvas dras() plt-pause(&,1) Adjust pousc tinc to control aninotion sp el1f not visualize_steps and made_change_in_this_expansion: if not vave_front _history ur not np.array_equal (wave_fron wave_front_history.append(distancc_grid,copy()) aUON = 44ed 1eut↓ if path_found: [1 = q4edeu pua = Jn while curr != start: final_path.append(curr) If curr not In parent_grid: Safety check 8 1 print(f"Backtracking Error: Node fcurr} has no parent return None, distance_grid, wave_front_history curr = parent_grid[curr] final_path.append{start) final_path.reverse() 1f visualize_steps and ax_live and fig_live: visualize_grid_live(ax_live, distance_grid, "Final Path Fa fig_live,canvas drau() plt.pause (2.0) elif visualize_steps and ax_Live and fig_live: visualize_grid_live(ax_live, distance_grid, "No Path Found to f1g_live.canvas draw() plt.pause(2.0) return final_path, distance_grid, wave_front_history 接着实现可视化函数visualize_grid_live

2. Visuallzotfon Function (for Live updates or snapshots)

def visualize_grid_llve(ax, grid_data, titte, start_node=None, end_ned. visualizes the grid state live on the given Axes object. Clears the Axes and redraws everything. ax,clear() rows, cols = grld_data.shape Deterwine max distance for colonmap scaling valid_distances = grid_data[grid_data >= θ] 1f len(valid_distances) == 0: clsc: max_dist_int = 1nt(np.fLoor(np,max(valid_distances))) Colormap and Norwalization Selup -- Sasc colors: 0bstacle (-2), Unvisited (-1) f1nal_cmap_colors = [{0.2,0.2,0.21, 0bstacie - dark_grey Unvisited - white (1,1,1)1 Sasc boundorics for normalization final_bounds = [-2.5, -1.5, -0.5] Add colors and bounds for distances (o, 1, max_dfist_int) if max_dist_int >= θ: num_dist_colors = max_dist_1nt + 1 Use pll.gel cmap() to avoid MatplotlibDeprecationwarning dist_cnap = plt,get_cnap( *Blues', nun_dist_colors if nun_dist_ for 1 in range (num_dist_colors): if nun dist colors == 1: Only distance 9 (start point) color_val = θ,3 # A light bluc :8510 color val = i / (num dist colors - 1) α Nornalize i fc final_cnap_colors.append(dist_cnap(color_val)) final_bounds.append(1 + @,5] Upper bound for olstance I 3 2 custom cmap = ncolors .ListedColormap(final_cnap_colors) norm = mcolors,BoundaryNorm(final_bounds, custom_cmap.N) ax.Imshow(grid_data, cmap=custom_cmap, norn=norm, Interpolation=n Grid Lines and Text Annotations for r_idx in range(rows): # Thin grid Lines 4 1 ax-plot([c_idx - @.5, c_idx - @.5]. [r_idx - @.5, r_idx + 43 val = grid_data[r_idx, c_1dx] text_color = hlack # Default text color If val >= B: # If it’s a distance valve If val <= max_dist_int : # Check if val is a valid ind If color_idx_for_dist < len(final_cmap_colors): bg_cotor = final_cnap_colors[color_idx_for_dis' brightness = sum(bg_color[:3]) / 3.θ # Sinpie 1f brightness < B,45: # If background is dark text_color = 'white ax.text(c_idx, r_idx, Str(int(val)), va=′center, ha= obstacles are visually distinct by color, so x is opti ellf va[ == -2: ax.text(c_idx, r_idx, 'X', va='center', ha=*center Start/End, Current Wode, ond Path Markers pe = [matptotllb. patheffects.withstroke(Linevlath=2, foreground= b if start_node: ax.text(start_node[1], start_node[θ].“S', va=′center",ha='cc 1f end_node: ax.text(end_node[1]. end _node[θ]. E, va=′center', ha=*center r, c = current_processing_node rect = plt.Rectangle((c - B.5, r - @.5), 1, 1, linewidth=2, ed ax,add_patch(rect) 1f path_coords: If a path is provided, drav It path_c = [p[1] for p in path_coords] ax.plot(path_c, path_r, color=′orange , Linewidth=2.5, linesty Gptionally。 mark points on the path ax.scatter(path_c, path_r, color=*yellov', s=25, cdgecolor='bl.

  • -- Final Axes Adjustiwents

ax.set_xticks(np.arange(cols)) Sel intermel lick positions ax,sct_yticks(np,arange(rows)) ax.set_yticklabels{[1) ax,tick_parans(axis=*both’, which=both’, length=B) Hidc tick mo ax.set_title(title, fontsize=10, welght= bold′) ax.set_aspect('equal', adjustable=bux) 然后实现仿真环境的迷宫构建与起点终点设定 Define the Grlo, Start, and End Nodes exanple_grid = np.array{ [ [, 8, 8, 0. 1, 0, 8, o, 0, e], [0, 1. 1. 0, 1. 0, 1, 1, 1, 0], [8, 8, 6, 0, 1, 0, 1, e], [1, 1, 6, 1, [0, 8. 0.0. 0. 0. 1. 0, 0. 0], [0, 1, 1, 1, 1, 0, 1, 1, 1, , [, 8, 8, 0. 1, 0, 8, o, 1, e], [0, 1. 1, 0, 0, 0, 1. 0, 1. 0], [θ, 1, 8. 0, 1, 0, 1, 3, 8, , [8, 8, 8, 1, 1, 0, 0, 0, 1, 0] start_node = (θ, 6) {row, col.) [row, col) cnd_node = (9, 9) # You can try different grids and start/end points here! # For t example: # sinplc_grid = np.orray( [ [0,0,0] , [0,8,0] W # star'[ node sinple = (θ,9] # cnd_nodc_sinplc = (2,2) 最后实现算法的快照回顾 Mode 2: Post-Execution Snapshot Visualization # This mode runs the algoriths first to collect atL Intermedlate state. # then displays key snapshots. This is generally more robust in Coiab/ print("\nExecuting Mode 2: Post-Execution Snapshot visualization...") # Run the algorithn vithout live visualization to collect history path_snapshot, final_dist_grid_snapshot, wave_history_snapshot = lee_a example_grid. copy() , start_node, end_node, visualize_steps=False Disable live steps to collect full vave_hf. # Smapshot I: InitiaT Grid fig_initial_snap, ax_initial_snap = plt,subplots(figsize=(7, 7)) Initial_display_grld_snap = np-full(example_grid.shape, -1, dtype=1nt) 14 if start_node: initial_display_grid_snap[start_node[θ] , start_node[1]] sdeus, deusptu6Ae1dstp1etatut deus1etatutxe)aAtiptu6aztlen5A fig_initial_snap-tight_layout() plt show() # Snapshots 2: Wave Expansion (selected steps) if wave_histary_snapshot: num_wave_steps_total = len(wave_history_snapshot) Select a fev representative snapshots to disptay if mum_wave_steps_total > 5: Shov first, a few in middlc, and last Indices_to_show = np.unique(np.Linspace(0, num_wave_steps_tota if nun_mave_steps_total -1 mot in indices_to_show: # ensure Ia. indiccs_to_show.append(num_wavc_stcps_total -1) Indices_to_show = sorted( List(set(indices_to_show))) else: indices_to_show = rangc(nun_wave_steps_total) for 1, step_idx 1n enumerate(indices_to_show): [xp da1s] 1oysdeus fuo1stq axen = 1ousdeus pJ6 #Aex fig_wave_snop, ax_wave_snap = plt, subplots(figsize=(7,7)) title_str = f"snapshot: 2.[1+l} Wave Expansion [Record (step_1 Check if largel is reached in this specific snapshot is_targct_rcached_in_this_snap = (path_snapshot and wavc_grid_ More accurately. check If this Is the first snapshot where if is_target_reached_in_this_snap: if stcp_idx == @ or (step_idx > 0 and vave_history_snapsho title_str += '- Target Reached in this step!" 4 1 elif wave_history_snapshot[step_idx-1][end_node[@]. end_no Target Previously Rcached title_str 4= *. visualize_grid_live(ax_wave_snap, wave_grid_snapshot, title_st fig wave snap.tight_Layout(1 plt,show() Snapshot 3: Flnal Path or No Patih If path snapshot: fig_final_snap, ax_final_snap = plt,subplots(figsize={7, 7)) v1sualize_grid_live(ax_final_snap, final_dist_grid_snapshot, Snap fig_final_snap.tight_Layout() plt show() print(f"\nPath found (snapshot model: ({path_snapshot]") print(f"Path length: {len(path_snapshat) -1} steps") elif final_dist_grid_snapshot is not None: # Even if no path, shov the shov the f1g_no_path_snap, ax_no_path_snap = plt.subplots (figs1ze=(7,7)) visualize_grid_live{ax_no_path_snap, fina1_dist_grid_snapshot, fig_no_path_snap. tight_layout() plt show() print("nNo path found (snapshot mode).) "ynError during snapshot mode exe e1dstp o1 ptu6 ou Snapshot: 1. Initial Grid

Snapshot: 2.1 Wave Expansion (Record 1/40)

Snapshot: 2.2 Wave Expansion (Record 10/40)

hapshot: 2.3 Wave Expansion (Record 20/40)

Snapshot: 2.4 Wave Expansion (Record 30/40)

shot: 2.5 Wave Expansion (Record 40/40) - Target Previously Reached Snap

Snapshot:3. Final Path Found

4.算法特性分析

优点:

  • 完备性

:只要物理上存在路径。Lee算法一定能找到。

  • 最优性

:在所有“步”的成本都相同的情况下(例如,在网格中移动一格的成本为1),Lee算法保证 找到的是几何上最短的路径(如经过最少单元格的路径)。

  • 概念简单

:相对于一些更复杂的启发式算法,Lee算法的逐辑直观易懂。 缺点:

  • 内存消耗

:需要一个与布线区域同样大小的数组来存储距离信息,对于大规机、高精度的PCB,内存开 销巨大。 计算时间 :当起点和终点距离很远,或速宫非常复杂时,波前需要扩展到几乎所有可达区域,计算耗 时较长。

  • 路径形态

:倾向于产生曼哈顿式的直角转弯路径,可能不是电气性能最优的(例如,45度转角通常更 好)。 Lee算法的拓展:现代EDA工具中的复杂策略1 尽管基础的Lee算法存在局限,但它是许多更高级布线算法和黄略的基石。现代EDA工具为了高效、高 质量地完成PCB自动布线,采用了远比基础Lee算法复杂的机制:

1.成本加权(Cost-based Routing)与A*算法:

:不仅仅是步数 :实际布线中,不同操作的“代价“不同。例如,打一个过孔(Via)到另一层通常比在同层 是线成本高得多;一个弯折(Bend)也可能引人不希望的电气特性。 = Dijkstra与A* :当每一步的成本可变时,Lee算法的BFS形式就演变成了Dijkstra算法,它能找到总成 本最低的路径。更进一步,A*(A-star)算法在D1jkstra的基础上引入了启发式函数 (HeuristicFunction),该函数会估计从当前点到目标点的“未来成本”,从而引导提索 优先朝向目标,大大减少不必要的探索区域,显若提高效率。这使得算法在寻找“综合最优” 路径(如长度短、过孔少、高折少)时更为智能。

2.分展与多阶段繁路(Hierarchical & Hulti-Pass Approach):

  • 全局布线(GLobal Routing)

:先进行宏观规划,将PCB划分为大区域或通道,大致确定网络(或网络束)应穿过哪些区 域,而不立即决定精确定线。这有助于早期评估布线密座和拥塞点。 :详细布线(Detailed Routing) :在全局规划的招导下,在小区域内便用Lee算法的变体、通道布线器或区域布线器等精细算 法,为每条网络连接具体的、符合DRC的路径。

3.基于形状的布线器(Shape-based/Gridless Routers):

  • 摆脱固定网格的束绒,直接处理实际的几何形状(焊盘、已布线等),可以实理任意角度布

线。从而产生更短,更灵活的路径,尤其有利于高速信号。

4.特定横式布线(Pattern Routers}:

对于如差分对、存储器总线等具有特定拓扑和电气要求的常见连接模式,布线器会应用预定义 的优化布线模板,而事从头提蒙。

5.选代与优化策略:

  • 撕裂重布(Rip-up and Reroute)

:当布线遇到拥霆或失败时,智能地移除部分已布好的、遗成阻塞的走线,为失败或更重要 的网络腾出空间,然后重新尝试布线。这是一种重要的“纠错”和选代优化机制。

  • 推挤布线(PushandShove)

:在为新走线布局时,动态地、小范围地“推开"或“挪动"已存在的、轻微阻挡的走线(前提 是满足DRC),以更有效地利用空间,提高布线密度。

6.网络排序与优先级(NetOrdering&Prioritization):

■并非所有网络都一视同仁。关键网络(如时钟、高速数据线、电源/地)会被赋予高优先级, 优先布线,并采用更严格的规则和可能更耗时的算法来确保其性能。 结语 从PCB上看似神奇的自动布线,到其背后坚实的算法基础,Lee算法为我们提供了一个绝佳的切入点, 让我们得以一窥EDA工具内部的“智能”。通过可视化,我们不仅能理解算法的逻辑,更能欣赏到其如水 波般扩散、最终精准定位目标的优雅过程。 虽然现代EDA工具的布线引擎远比单纯的Lee算法复杂得多,它是一个集成了上述多种高级算法和复杂 策略的综合系统,但Lee算法所蕴含的广度优先搜索、成本累积和路径回溯等基本思想,依然是构建这 些更高级、更智能设计工具的重要基石。

NOTE·目录三 <上一篇 下一篇> 从助记词到以太坊地址--钱包创建全解析 TinyMLMCU等级开源推理引擎列表

原始排版图

原始导出图超过单张 WebP 的尺寸上限,以下图片按从上到下的顺序连续保存。 EDA PCB布线中的寻路智慧:深入探索Lee算法的可视化之旅:微信公众号导出原始排版图(第 1 段,共 2 段) EDA PCB布线中的寻路智慧:深入探索Lee算法的可视化之旅:微信公众号导出原始排版图(第 2 段,共 2 段)

从助记词到以太坊地址——钱包创建全解析

· 閱讀時間約 17 分鐘
w0x7ce
MySelf

发布于 2025-05-26 20:27:09(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 9207 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

最终可用地址的完整密码学流程。其核心在于一系列标准化协议(如BIP-39,BIP。 32,BIP-44)和密码学算法的应用。 bips https://github.com/bitcoin/bips/blob/master/bip -8039/ 核心环节包括: 与助记词生成(BIP-39) .助记词到种子(BIP-39,PBKDF2) .种子到主密钥对(BIP-32) .密钥派生路径与特定私钥(BIP-32,BIP-44) .私钥到公钥(ECC-secp256k1) .公钥到地址(Keccak-256) 核心概念定义 为确保理解一致性,首先定义关键术语:

  • (Entropy)

一串具有足够长度的随机二进制数据,是所有后续密钥生成的起点。其质量(随机

性)直接影响钱包的安全性。通常由密码学安全伪随机数生成器(CSPRNG)产生。

  • 助记词(Mnemonic Phrase)

一组有序的人类可读单词,是简的一种便于记录和恢复的表示形式。BIP-39标准定

义了其生成规则和词库。

  • 种子(Seed)

从助记词(及可选的密码短语)通过密钥派生函数(如PBKDF2)生成的固定长度 (通常512位)的二进制数据。是派生所有后续密钥的根。

  • 私钥(Private Key)

一个保密的、随机生成的数字(通常256位)。持有者拥有对应地址上资产的控制

权。其保密性是资产安全的根本。

  • 公钥(Public Key)

通过椭圆曲线加密算法从私钥单向计算得出。可公开,用于验证签名和派生地址。

  • 地址(Address)

通常由公钥派生出的唯一标识符,用于接收加密资产。以太坊地址是一个160位的十

六进制字符串。

  • BIP (Bitcoin Improvement Proposal)

比特币社区提出的技术规范文档,许多标准被广泛应用于多种加密货币。 BIP-39 规范助记词的生成及到种子的转换方法。 BIP-32 定义分层确定性钱包(HDWallet)的结构,允许从单一种子派生出树状结构的 密钥层级。 BIP-44 在BIP-32基础上,为多币种、多账户钱包定义了标准的派生路径结构。

  • 分层确定性钱包(HD Wallet-Hierarchical Deterministic Wallet)

一种能从单个主种子确定性地派生出大量密钥对的钱包结构。密钥以树状结构组织,

便于管理和备份。

  • 椭圆曲线加密(ECC-Elliptic Curve Cryptography)

基于橘圆曲线数学的公钥加密方法。核心在于从私钥计算公钥容易,反之则计算上不 可行。以太坊和比特币使用secp256k1 椭圆曲线。

  • Keccak-256

以太坊中使用的密码学哈希函数(SHA-3标准的前身版本),用于从公钥生成地址 等。 ”详细步黑解析:从焰到地址 步骤θ:初始与助记词的生成(依据BIP-39) 此阶段的目标是从高质量的随机源生成人类可读的助记词。 .生成初始熵(Initial Entropy) 。由CSPRNG产生一串特定长度的随机二进制位。 。简长度(ENT)通常为128至256位,且为32的倍数(例如:128,160,192, 224,256位)。 。简长度决定助记词数量:128位->12个助记词;256位痛->24个助记词。 步骤8:加载 BIP-39 词库 def load wordlist(filepath"english.txt): print(r*---步景:加载BIP-39 词库--) print(f尝试从“(fitepath)加载词库..") 6 with opentfilepath. *r", encoding-utf-s") as f: words = [line.stript) for line in f if line.strip(1] print(f成功加载[len(words)] 个单词。“) 1f len(vords)2048: print(词库包含2848个单词符合BIP-39标准。“) return words clsc: print(f销词应因包含2048个单国口实际加期了(1en[Mords)] 个。“) “english.txt”文件正纳且完情。“ xccept FileNotFoundError: print(f谢误:提不到词库文件(fAlepath)}s) print”请请保“ongl1sh,txt文件与此解本在同一日录下。“} return None ept Exception as e: print(f加载词库时发生错误:[e}) return None

[入]:离费生点[ENTRPY_LENH BIS)位[(ENTROPY_LENOTH_BYTES]字节)的题机痛“) rint(f" 特出 (base) wxreX7ce:/oumloads/BIPLEAR$ pythn Interactive bip39.py 调库包含2848个单词,符合BIP-39标准。 BIP-39助记词生成步驿演示(128位情-12个单词) 步辑1:生成初始焙 【输入]:贯要生成128位(16字节)的随机。 输出培(二进制):8119111891188 011111918919111111111111119 61801010110111010101010801110101010110111011810100011111891061 【验证】纳的位数:128 :计算校验和(Checksum) 。128位煸(ENT=128)->校验和长度(CS)=4位。 。为实现错误检测(例如抄写错误),需对初始滴进行SHA-256哈希运算。 。取该哈希结果的前CS位作为校验和。CS-ENT/32。 ...-梦2:计算校验和(Checksu) s26 hhtsstr-t bsnh6 hhdt 步罪2:计算校验和- [人填(进制:01100110110660011110110106010010111010110111101011600 011100100101011011101010101000111010101011011101101010001111100101 9930cf61ba8 SH-256哈希结果(二进制,前一部分):011011111111111111191 11198110186

818919101...

计算过程:校验和长度消长度(12位)/32=4位。 计算过程:取SHA-256哈希结果的前4位作为校验和。 [输出]权验和(二进制):8811 :合并简与校验和 。128位+4位校验和=132位序列。 。将计算出的校验和附加到初始焕的末尾,形成一个新的二进制序列。 制序列。 付 3: dired bits str = antrepy bsts str + checkum bits str prlstl1* orintit* orinslf. :c omum公余号iajero ter_te_contimell 步骤3:附加校验和到滴 (:011001110110060000111011010001001011101011011101011600

二进制):01100111001100

COOTTOTOTTTTOTTOTOTTTOTOOTOOOTOTTOTTTTOO [输入]境 【入】校验和【二进制】:0011 [输入】校验和 【验任】合并后的总位数:132(应为132) 映射到助记词单词 。264位序列/11位/段=24段->24个助记词。 。将合并后的二进制序列分割成多个11位的小段。 。BIP-39提供了一个包含2048个单词的官方词库。由于$2^{11}=2048$,每

一个11位的二进制段都唯一对应词库中的一个单词。

。按11位段的顺序,从词库中查找对应单词,组合成助记词短语。

6811 步骤4:将序列分刮成11位的小段 校验和(进制:01001110011000000001110110100010010111919110111 输入】填 B111081501010110111010191010891111910101101110110101000111110018018811 计算过程:将上过二进制序列分割成每段11位的小段。 [输出]分副后的小段(共12段): 01100111001 3: 11110110100 61681611181 5: 01101111018 18818101181 7: 8: 10: 10100001111 11: [验证】单询数量:12(内为12] 按Enter键起续下一步... 步解5:持每个11位小段映时到单词 计算过程:将每个11位二进制小段转换为十进创整数,作为词库的索引。 射结果 1:01180111891十进制引:825 'walk" 1972 系引: > entry' 01101111010 5: 1564 011108 6: 116 16010101101 单词: 'noble* 1197 sten* 9841 20111010101 单词: 01101116118 1295 单词:“mystery 段12:10010010011->

十进制案引:1171>

[输出)最终生成的助记词(12个单词); hsrnlesten deyter

  • 助记词安全性

词库大小(2848)和单词数量(12-24)确保了巨大的组合空间(如 s2048~{12}\approx2~{132}s),使得暴力破解在计算上不可行。 步骤1:从助记词到种子(依据BIP-39&PBKDF2) 此阶段将助记词转换为固定长度的二进制种子,作为密钥派生的根。 步骤1:从助记词到种子(BIP-39,PBKDF2) [第入] 2848(BIP-30推荐) 输入] d十六讲市:64字节):9x4ed8d4b17698dde01f559f5287b5d 4721725 18876 测试向量对内的种子是:8x5b56c417303faa3fcba7e57400e120a0ca6358a9095526afd3604b6 41797cb85439) 按 Enter健继续下一步...

  • 输入(Input)

1.助记词短语(UTF-8NFKD标准化编码)。

2.可选的密码短语(Passphrase/Salt Extension)(UTF-8 NFKD标准化

编码)。

  • 过程(Process):PBKDF2 (Password-Based Key Derivation Function

。内部哈希函数 : HMAC-SHA512。 。选代次数 :BIP-39推荐2048次。多次选代增加计算成本,抵抗暴力破解。 。盐(Salt) :由字符串“mnemonic”与用户提供的密码短语(若为空,则密码短语视为空 串)串联构成。 。密钥派生 :以助记词为“密码”,上述盐值为“盐”,执行PBKDF2运算。

  • 输出(Output)

。一个512位(64字节)的二进制种子(Seed)。

  • 密码短语的作用

。密码短语为助记词提供额外安全层。即使助记词泄露,没有正确的密码短语也无法 生成正确的种子。 恢复时必须使用完全相同的密码短语:任何差异都会导致生成不同的种子。 此阶段从512位种子生成HD钱包层级结构的根节点:主私钥和主链码。 步挥2:从种子到主私仍和主链码(DIP-32) [输入1种子(Seed 十六进制]:x4erd8d4b17698ddeaa1f1559f152f87b5d472f725ca86d34 1bd9276f1b61197e21dd5a391f9f5ed7340ff4d4513aab9cce44f9497a5e7ed85fd818876b6eb402e [输入]DIP-32客钥常量:bDitcoin seed [镇出]主私钥[Master PrivateKcy十六进制,32字节】:6x2f93ce519f4f763167e2345 0bd667567bf7aa8a31b9763ea4c6a57401d370583 测试向量对应的主私钥是:8x8c7454c78740b2f58096a68899f0137247[7808a28988a879214 478fdeaf1zb) 试向量对应的主链码定:0x879c85418c415031e9d0e1a2504c3798b8916f12813167352702f 3a938f7e92c) 搜Enter提频下一步..

  • 输入(Input)

。512位种子(Seed)。

  • 过程(Process):HHAC-SHA512

。使用HMAC-SHA512算法处理种子。 。密钥(Key) :固定的字节串“Bitcoin seed”(即使为其他币种生成密钥,此初始步骤通常 遵循该规范)。

  • 数据(Data)

:输入的512位种子。 。HMAC-SHA512输出一个512位的哈希值($I$)。

  • 输出(Output)

。主私钥(Master Private Key,$km$):SI$ 的左256位(32字节)。 。主链码(Master Chain Code,$cm$) SI$的右256位(32字节)。链码用于子密钥派生时引入确定性随机性。 步墨3:派生以太坊专用私钥(依据BIP-32&BIP-44) 此阶段根据BIP-44定义的派生路径,从主节点派生出特定于以太坊账户的私钥。 步辑3:派生以太坊专用私钥[BIP-32/BIP-44] [输入] 主私书: Bx2f93c8519f4f763167c23458bd667567bf7aa8a31b9763ca4c6a57481d37858 [输入1 主链码 :: Bx9523ed4388df2d528989bf11h6a85abe8d4b239778eBef69b87ed666bab19ad [输入1以太坊源生路径:m/44′/68/8/8/8 解释: BIP-32定叉了如何从父密钥流生子密钥。BIP-44在此基础上规定了标准路径结构: :代委主节点(Moster) (haed):代表DIP-44搜药。表示增强派生。 (hardned):代表账户案引(通常从开第 .0. (al:代表用造:8表示外包[按收联基]。 {nomaL]:代表用途,表示外部道【接收地址]。 ‘日 (nomali:代表地址索引(该账户下的第o个地址)。 增强诉生[Hardered Derivatien,indicated by: dex) 普通派生INomal Derivation): 可以使用交公销、父链码和案引号派生子公钥和子镇码。 计算方式:AC SHS12(Kcy-ParenthainCode,Data-ParentublicKeyBytes|| Index) 由于完是坐现即P-32源生(特别是多个增蛋派生步程)代码较为复杂且易出错, 通幸依预于经过产格测试的客码学库。 在本次演示中,我们将直接使用测试向量中预先计算好的,对应上述路径的专用私钥。 [概念输出]对内路径m/44/60/0°/0/0的以太坊专用私钥(来自测试向量1: 按Enter误维族下一..

  • 输入(Input)

。父密钥的私钥(Parent Private Key)或公钥(Parent Public Key, 仅用于普通派生子公钥)。 。父密钥的链码(Parent Chain Code)。 。目标子密钥的索引(Index)。

  • 派生路径(Derivation Path)for Ethereum

BIP-44标准路径格式:n/purpose′/coin_type'/ account’/ change /address_index以太坊第一个账户的第一个地址的典型路 径:m/44*/60*/0*/8/0 o II :主节点。 purpose′(44′) 表示增强派生。 :表明遵循BIP-44。 o coin_type′ (69′) :以太坊的币种代码为60。增强派生。 account′(8′) :账户索引,从0开始。增强派生。 o change (θ) :外部链(0)或找零链(1)。以太坊通常只用8。普通派生, o address_index (8) :地址索引,从0开始。普通派生。

  • 派生过程(CKD-Child Key Derivation)

:逐级应用BIP-32子密钥派生函数。 o输入数据:ser1al1ze[parent_publ1c_key)l| 1ndex I = HMAC-SHA512(Key= parent_chain_code,Data= data) 子私: (parse 256(I L)+ parent_private key) mod n 。子链码:I_R 。可以从父公钥和父链码派生出子公 钥: ch1ld_publ1c_key = po1nt(parse_256(I_L))+ parent_publ1c_ke y。 o输入数据:6xo6l|parent_private_key 11index I = HMAC-SHA512(Key= parent_chain_code,Data= data) 。子私钥:(parse_256(I_L)+ parent_private_key) mod n (n为曲线的阶) 。子链码:I_R 。无法从父公钥派生子公银。安全性更高。 。普通派生(Normal Derivation)(索引值 S<2^{31}$): ,输出(output) 。路径m/44/66/0′/0/0对应的256位以太坊专用私钥。 步骤4:从私销到公销(ECC-secp256k1) 此阶段通过椭圆曲线点乘运算从私钥生成公钥。 步骤4:从以太坊专用私钥到公钥[ECC5ccp256k1]7 输人]以太坊专用私钥(自测试向量):8X245412038577C19F8BB4384D7274D235676A554A 8C8F98A32641198F28849838 解释: 这一步使用圆曲线加密算法(ECC)中的5FEp256k1自找。 这个运受单向的从私销计算公销很容品,但风公销反推私在计算上不可行。

一个格回曲线上的点(X,Y1对于以太功,通常使用木压请公街

结果是 即64字节,由x全标【32字节】和y生标(32学节】置接串联面成[去除了8x84前级] 由于ECC运算实现复杂,我们同样使用测试向量中对应的公钥。 [最念输由]对应的未压站公钥[来自利试向量,64字节,无8x84前]: D4A5491839862990905E7BAC7001135996E0907E01E0D20FA77314008317A657E1838605906069A5 87543018039048063875956883204936475223787 按Enter候滋续下一步..

  • 输入(Input)

。256位专用私钥($ks)。

  • 过程(Process):椭国曲线乘法(secp256k1)

。以太坊使用secp256k1椭圆曲线。 。私钥$k$是一个256位整数。 o secp256k1 有一个标准的生成点$G$。 。公钥$K$计算公式:$K=k\cdot G$(点乘运算)。 。结果 $K$ 是椭圆曲线上的一个点 $(×,y)s。

  • 输出(output)

。未压缩格式 8x0411X(32 bytes)11Y(32 bytes) (总65字节)。 压缩格式θx921|X(32bytes) (若Y为偶数)或θx0311×(32bytes)(若Y为奇数)(总33字节)。 。公钥 $K=(x,y)$。 。后续生成以太坊地址时,使用未压缩公钥的X和Y坐标(除去8x04前缀的64字 节)。

  • ECC安全基础

从私钥$k$和生成点SGS计算公钥$K$容易:但从$K$和$G$反推$k$ (ECDLP问题)在计算上不可行。 步骤5:从公钥到以太坊地址 此阶段将公钥转换为最终的以太坊地址。 步辑5:从公钥到以太坊地址 8787 解1:

1.特64字节的公钥(不含6x84前题)进行Kccak-256哈希运算。

Keccak-256,它导最终的SHA-3标准路有不同:但在Python 3.6+的 注意:以太坊使用 hashlib.sha3256 中行为一致

2.Keccak-256哈系的结果足一个32字节(256位)的值。

4.通常以能开头,并以4个十六进制字符表示。

计算过程: Keccak-256哈带(公钥)(十六进制,32字节):Bxc54alc294877833898f81acZce712c9f c86b350b5a541464f2877bb64ct26d7 [输出]计算得到的以太坊地址(十六进制,20字节】:0x2ce712c9fc86b356b5a541464f2877 (测试向量对皮的以太坊地址定:0xfe19211f04483931319f313712168957065b7697) [输出1计算得到的以太坊地址(EIP-55校验和格式):电x2ce712e9Fe86D356b5A541464F287 7Bb64Cf26d7 演示结束。按 Enter键 退出。

  • 输入(Input)

。未压缩公钥的X和Y坐标串联起来的64字节数据(即X11Y)。

  • 过程(Process):Keccak-256 哈希及截取

1.取64字节公钥数据。

2.对其应用Keccak-256哈希算法。

3.Keccak-256输出256位(32字节)的哈希值。

4.取此32字节哈希值的后20字节(160位)。

  • 输出(output)

。该20字节(160位)数据即为以太坊地址。

  • 格式化

。地址通常表示为40个字符的十六进制字符串,前缀为0x。 oEIP-55校验和地址 :一种大小写混合的地址表示法,通过对地址自身哈希来决定字母大小写,提供校 验和功能,防止输入错误。底层的20字节值不变。 安全性考量概要

  • 助记词保密性

:助记词是恢复所有密钥的根源,其泄露等同于资产控制权丧失。物理备份(如手写 在纸上、金属板雕刻)并安全离线存储是推荐做法。避免任何形式的数字存储。

  • 密码短语(Passphrase)

:若使用,其重要性等同于助记词。遗忘或输错密码短语将导致无法访问钱包。

  • 私钥的绝对控制权

:私钥是资产的最终凭证。钱包软件负责管理私钥,一般不直接暴露给用户。

  • 地址的公开性

:以太坊地址可安全分享用于接收资金,不会泄露私钥或助记词。

  • 钱包软件的可信度

:应从官方渠道获取,优先选择开源、经过审计、社区声誉良好的钱包软件。

  • 防范钓鱼与恶意软件

:对任何索取助记词或私钥的请求保持高度警惕。 结论 从随机熵到最终以太坊地址的生成,是一个涉及BIP-39、PBKDF2、BIP-32、BIP-

44、椭圆曲线加密(secp256k1)和Keccak-256哈希等多个密码学组件和标准的精

密过程。每一步都依赖于成熟的密码学原理,特别是单向函数和陷门函数的特性,确保 了从公开信息推导私密信息的计算不可行性,为数字资产安全提供了基础。 NOTE·目录三 <上一篇 下一篇> 走遍西班牙第一册-第十单元《Ymaniana, EDAPCB布线中的寻路智慧:深入探索Lee算 qué?》Ambito2详细笔记 法的可视化之旅

原始排版图

从助记词到以太坊地址——钱包创建全解析:微信公众号导出原始排版图

EFR32 (Simplicity Studio) 开发环境与实践笔记

· 閱讀時間約 15 分鐘
w0x7ce
MySelf

发布于 2025-05-22 18:58:38(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 8119 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

original wex7ce EI V1ajero 2025年5月22日 18:58 中国垂港

引言:EFR32系列无线SoC概览 SiliconLabs的EFR32系列无线片上系统(SoC)是专为现代物联网(IoT)应用设计 的核心处理单元。这些SoC的关键特点在于其高性能、低功耗、以及强大的多协议无线连接能 力。EFR32 系列通常集成了一个强大的ARM Cortex-M 系列微控制器核心(如 Cortex- M33或Cortex-M4),并配备了丰富的片上外设,包括多种通信接口{USART,I2C, SPI)、模拟组件(ADC,DAC)、以及多样化的定时器和脉冲宽度调制(PWM)通道。其突出的 无线性能支持包括蓝牙低功耗(BLE)、蓝牙Mesh、Zigbee、Thread、Wi-SUN以及专有无 线协议等多种标准,部分型号甚至支持多协议并发操作。此外,EFR32系列非常注重能源效 率,提供了多种低功耗模式和快速唤醒机制,使其非常适合电池供电的IoT设备。针对日益增 长的IoT安全需求,较新的 EFR32 系列还集成了先进的硬件安全功能,如 Secure Vault”技术,提供安全启动、加密加速、真随机数生成器和安全调试等特性。正是由于 EFR32SoC这种高度集成、多功能、多协议以及对低功耗和安全性的极致追求,使得其开发需 要一个同样强大且高效的集成开发环境,这侵是SimpLicity Studio存在的必要性一它旨 在简化这种复杂系统的配置和应用开发。 EFR32MG22 Common Specs Loa Power Wrdess 5yitem-n-chp Wide Bdectionof HCU Peripherh Protoee Buppert

Bads Parfernarce slusgupeodo opM 1224s 94y @2* 4p 0F5

  • 11Ve3Yarg*po pp

2dseshb 1Veis u3s 4°Cb 2 Pockogu* : 024405 IsErhur : TOFN24mm *4mm 1.30mm Seerity Feetures 282Ginter Loa 5yatem Errgy Cenanpthn podins ergn2 4iu ive UM) M022 36mARxoueK(1MpsGFS) 19nA FX we (2M ap1 0-0PSH D089) an Rot elTuat adi Sw g/nve2 1-s 22nATX czment g dcnx4 powr 25 gAMHs inAdivw Msds (EV0) xi34VHtc

1.44 pA.EV2 Doap

yyerpou payedeg ECOH vienden endRTC urshg fen UWCOy

0.17 μAEM sEM

DSSS ARIMS AE512925, 1 E021 tb24-1, E003A,rd x (TRNO)

一、SimplicityStudioIDE与开发方式概览

Silicon Labs(Silabs)为其EFR32 系列无线SoC提供的主要集成开发环境 是SimplicityStudio,这是一个基于Eclipse 的多功能平台,其核心设计理念在于高度 集成、组件化管理以及配置驱动开发。目标是简化日益复杂的物联网(IoT)应用开发,使开发 者能够通过图形化工具快速搭建和配置项目,同时保持对底层硬件的控制能力。 与一些传统嵌入式开发流程不同,Simplicity Studio强调以一个中心化的项目配置文件 (通需是.sLcp文件)来驱动整个项目的构建。这个文件记录了项目所依赖的SDK版本、 目标芯片、已安装的软件组件(Software Companents)、引脚分配、外设参数配置等关键 信息。当开发者通过图形界面修改这些配置并保存时,IDE会自动生成或更新相关的底层配置 文件和初始化代码,开发者则在这些自动生成的基础上编写应用逻辑。 主要特点:

1.软件组件(Software Components):提供大量预制验的驱动、协议栈模块、服务和第三方

库,开发者可以按需“安装“到项目中。IDE会处理组件间的依赖关系。

@

@

2.引即工具(Pin Tool):图形化界面,用于将芯片的物理引脚分配给特定的外设功能(如

USART TX/RX,PWM 输出,I2C SCL/SDA,GPI0 中断等),并能检查引脚冲突。

3.外设配置器:针对已选用的外设(如TIMER,USART,ADC,I2C)进行详细参数配置

(如时钟源、波特率、PWM频率、ADC分辨率等)。

Ifedl

1.代码生成:基于上述配置,自动生成初始化代强、配置文件头(如sl_conponent_catalo

g.h,定义项目中包含的组件)以及外设实例文件(如sL_pMm_Instances.h)。

5.集成工具糙:内置编译器(GCCARM)、调试卷(GDB 和 Silabs J-Link/STK 调试接

口)、功耗分析器(Energy Prof1ler)和网络分析器(Network Analyzer)。

二、与其他平台开发方式的对比

理解SinplicityStudio的开发方式,可以通过与其他流行平台的对比来加深:

  • 对比 STM32 (STM32CubeMX / STM32CubeIDE):

  • 配置起点与流程:STM32CubeMX通常是项目开始的第一步,用于图形化配置MCU的

时钟、外设、引脚和中间件,然后生成一个包含初始化代码的项目框架。开发者基于此框 架漆加应用逐辑。其流程更偏向于“先配置,后编码,配置基本一次性生成”。

  • SimpLicity Studio的.slcp文件则在项目的整个生命周期中都扮演着核心角

色。开发者可以随时通过它调整组件和配置,IDE会动态更新相关代码。启动项目时, 通常会基于一个示例或模板,然后在其上进行修改和配置。

  • IDE集成:STM32CubeIDE 将CubeMX 的功能集成到了Eclipse 环境中,体验上

与 Simplicity Studio 有相似之处,但CubeMX 本身也可以作为独立工具配合其 他IDE(如 Keil,IAR)使用。Simplicity Studio 则是—个更为封闭和统一的 生态系统。

  • HAL/驱动层: STM32 提供 HAL (Hardware Abstraction Layer) 和 LL (Low-

Layer)驱动.S1labs 提供sl_系列高层 API 和 enlib底层库,概念上类 似,但具体实现和API风格不同

  • 对比 Texas Instruments (TI - 如 Code Composer Studio+ SysConfig):

  • TI 的 SysConfig 工具与 Simplicity Studio 的配置理念有诸多相似之处,它也

是一个图形化配置工具,用于配置驱动程序、外设、引脚和软件栈,并生成相应的C代 码。SysConfig 通需与 TI 的 Code Composer Studio {CCS) IDE 配合使用。

  • 两者都强调通过工具篱化底层配置,让开发者专注于应用,SysConfig的组件化思提也

比较突出。其设计思路在于提供一个清晰的配置层,减少手动编写初始化代码的需要,与 Simpl1city Stud1o通过,slcp文件管理组件和配置的思路有共通之处。

  • 对比 Espressif (ESP32 - ESP-IDF):

  • ESP32 的开发主要依赖 ESP-IDF (Espressif IoT Development

Franework),这是一个基于FreeRTOS 和lwIP 的软件开发框架。

  • 配置方式:ESP-IDF主要使用Kconfig 系统(通过idf-py nenuconfig命令调

出文本菜单界面)进行项目功据、组件和部分驱动参数的配置。这种方式对于熟悉 Linux内核配置的开发者可能比较亲切。

  • 引脚/外设初始化:具体的引脚分配和外设初始化更多地是在C代码中通过调用ESP-

IDF提供的驱动API直接完成,虽然也有配置宏,但其图形化引I脚分配和与IDE集 成的外设配置工具不如前两者突出(VS Code的ESP-IDF 插件提供了一些辅助功 能,但核心配置仍在Kconfig和代码层面)。

  • IDE:官方推荐使用VSCode配合ESP-IDF 插件,或者基于命令行的开发流程。其

设计思路更们重于提供一个灵活的、以代码和构建系统为中心的框架,开发者对构建过程 和组件案成有较高的控制力。 SinplicityStudio的设计思路更倾向于提供一个高度集成的“保娠式"环填,尤其是在管理 复杂的无线协议栈和众多可配置模块时,通过统一的.slcp文件来维护项目的一致性和可配 置性。

一个典型的 EFR32裸机(bare-metal,即不使用RT0S)项目通常包含以下几个关键部分,

如blink_pum_baretetal示例所展示: 职责:初始化系统级服务、协议栈(若有)和用户应用程序。随后进入一个永不退出的 超级循环(super-loop)来调度系统和应用任务。

  • 关键代码分析(nain.c):

1善include“sl_component_catalog.h"//由IDE 生成,定义项目中包含的短件 include st_systen_init.h 1系统初始化函数 #include app-h 1应用层接象头文件 其他条件包含的头文件(知电源管理器) int main(vaid) { 5l_systen_init[):// 初始化 soK 超件、驱动、时钟等 11调用应用层初始化 app_init(); while (1)( slL_system_process_actlon(1:// soK 组件的网期性任务处理 1 1 11应用层的周期性任务处理 app process action(): //... 可熊包含 sl_powcr_sonogcr_slcep(),

  • sl_systen_init():封装了对所有已安装SDK组件的初始化调用,这些姐件和

它们的配置均由.51rp文件定义。

  • app_init[1:将控制权交给应用层进行初始化。

  • sl_systen_process_action()和 app_process_action(]:在超级循环中,前

者确保SDK内部任务(如蓝牙事件处理)得以执行,后者则留给用户执行应用逻 辑。 L.aPp.c·应用层抽象/桥接

  • 职责:作为nin.c和具体业务逻辑模块之间的桥梁,保持main.c的通用性,并

将具体的应用初始化和处理逻辑委托给下一层。

  • 关键代码分析(app.c):

include“bL1nk_pMm_app.h//包含具体业务模块的头文件 )(pTOA)TuT dde PTOA bLink_pwm_init();// 语用业务模块的初始化 1 (PTon)uoTIne ssaooud dde PTOA blink_pwm_pracess_actipn();//调用业务模块的思期处理

  • 这种分层设计使得当应用逻辑变得复杂时,可以通过包含不同的业务模块头文件并在

p.c中调用它们,而无需大幅修改main.c。

  • 职责:实现具体的应用功能。在bLink_pw_barenetal示例中,这里是控制PhM 实

现LED 呼吸灯效果。

  • 关键代码分析(bLink_pM_app.c):

//PMM驱动 APT include "sl_pmm_instances.h* //PM实例(出IDE根遥配置生成) //题既定时据API(用于延时) 5//PMH占空出宣找表(LUT) uinta_t pam_lut[] = { /+ .-. 0-109 的值 ..-*/ }: vold blink_pwm_init(void) { // 使用在 sT_pw_Instances.h 中声原的 sl_phm_lede 实例 sl._pwm_start(6sl_pwm_lede) ; void blink_pwm_process_action(vcid) ( //环改变PMH占空比。实现呼吸效果 for (uinta_t 1 = 0; 1 < 100; 1++) { sl_pwm_set_duty_cycle(6sl_pum_lede, pwm_lut[i]); sl_sleeptimer_delay_millisecond(6): (可能的额外延时) (反向据环)

sl_pwm_instances.h:这个头文件是关键,它通常包含了类似cxtern sl_pan_inst ance_tsl_pmm_Leda:这样的声明。sL_pMm_Lede的具体配置(如关联的 TIMER 外设、输出通道、引脚、PihM疑率、极性等)都是在 S1mpL1c1ty Stud1o 的图形化 配置工具中完成的,井由IDE自动生成到对应的sl_pwm_led3_config.h(或类似名 称)和初始化代码中

  • 设计思路:业务逻辑模块直接使用这些由IDE管理和配置好的外设实例,而无需关心

其底层的具体初始化细节。

假设目标是基于blink_pwm_barcnctal示例的结构,开发一个新的PwM 输出控制(例如, 控制另一个LED或一个小型风扇)。

1.项目创建与准备:

  • 在 Simplicity Studio中,可以基于一个裸机模板创建一个新项目,或者克隆现有

的blink_pn_barenetal 示例

  • 确保选择了正确的目标EFR32芯片或开发板。

2.源加并配置PWN软件组件:

  • PWM Frequency (Hz): 例如 1HGEa (16 kHz).

  • Polarity:通常是 Active High.

  • 打开项目的slcp配置文件。

  • 导航到“SOFTWARECOMPONENTS"标签页。

  • 搜索并安装“PWN”服务(如果尚未安装)。

  • 为新的 PWM 输出创建一个实例,例如命名为custom_Pam(IDE 可能会自动生成

如sl_pwm_custom_pwm 的实例名)。

  • 点击新创建的PMM实例,在右侧的配置面板中设置:

3.引脚配置(Pin Tool):

  • 在custonpum实例的配置界面,找到引脚配置部分,或直接切换到.slcp编辑器

顶部的“PIN TOOL"标签页。

  • 关键步骤:

  • 结果:Pin Tool会自动在后台生成或更新配置,例如在sl_pwm_custcm_pwm_confi

g.h(或类似名称的文件)中定义SL_PWH_CUSTOM_PH_PERIPHERAL,SL_PWH_CUSTO M_PWM OUTPUT_CHANNEL , SL PHM_CUSTON_ PWM_OUTPUT PORT , SL_PAM_CUSTOM PAM _oUTPUT_PIN 等宏。同时 sl_pwm_instanccs.h 中也会出现 sl_pum_custon_pu m实例的而明。

1.在Pin Tool 的外设列表中,找到一个可用的 TIMER外设(如TIMER1,TIMER

2等,避免与SL_pMm_LedO使用的TIMER冲突,除非该TIMER支持多通道独立 PWM且通道未被占用)。

2.选择该TIMER 的一个可用输出通道(CC ChanneL)。

3.在芯片引脚图中,找到一个想要用于PWMM输出的空闲GPI0引脚。

4.将选定的TINER通道功能拖拽或分配到这个GPI0引脚上。

1.添加延时功能(Sleep Tiner):

  • 如果应用需要精确延时,确保“SleepTimer”组件已安装在项目中(通常默认存在于

很多示例中)。 .编写业务逻辑代码:

  • 创建一个新的c文件(例如my_custom_pan_logic.c)和对应的.h文件。

  • 在ny_custon_pun_logic.c 中:

//这量会包含 sL_pwm_ _Custoe_p的声别 #incluie "sl_sleeptiner.h" include"my_custom_pwm_Logic.h" // 自己的头文件 /可以在此定文新的LIT或控别参数 //static uint8_tcustow_duty_cycle =50;// 示例:固定占空比 void ny_custom_pm_init(void) {

51._pwm_start(&sl_pwm_custon_pmm) : // 启t款的 Phmv 实例

//可选:设置初始占空比 // sl_pu_set_duty_cycle{6sT_pa_custo_psm, (=1. fnp aosn: void ny_custom_pum_pracess_action(vaid) { /1在这重实现自定文的PMM控制通辑 11例如:根据某个输人改变占空比,或查实现不同的闪炼模式 // static wint8_± new_duty = B; // ncw_duty = (ncv_duty + 10) 161; // 高单增o-109疆环 // sl_pvm_set_dty_cycLerGst_ou_custon_pwtl, new_duty); // sl_steeptimer_delay_millisecond(100); 11可以漆加其他控别通数,例期: void sct_my_custon_pw_duty(uint8_t duty) ( 5l_phm_set_duty_cycle(&sl_pwm_custom_pwm, duty):

  • 在ny_custon_pum_logic.h 中声明 ny_custon_pum_init() 和 my_custon_pwm_

process_actiont) 等函数 .集成到应用层(app.c):

  • 在 app.c 中 #include my_custon pum_ logic.h.

  • 修改app_init(1:

void app_init(void) { //DLink_pwm_1n1t(); //保留原有示例的初始化(如果需要) my_custon_pmm init):// 须加新模块的初始化

  • 改app_process_action(}:

1(pTon)uotioe ssaoud dde proA //DLink_pwm_process_action();// 保留原有示男的处理(如果离变) my_custan_pmm_proce actian():// 深加所模块的处理

■ ■

7.构建、烧录与调试:

  • 在SimplicityStudio中点击“Build"(锤子图标)。

  • 使用调试器逐步执行代码,观察变量状态。

  • 使用示波器连接到为sl_pwm_custom_pwm配置的GPIO引脚,验证PWM波形是否

符合预期(频率、占空比变化等)。

五、结论

EFR32的开发生态系统通过SimplicityStudio提供了一种高度集成且以配置为驱动的开 发模式。这种方式对于管理包含复杂无线协议栈和众多外设的SoC项目具有优势,能够让开发 者快速搭建原型并选代。其设计思路在于通过工具抽象底层细节,使得开发者能更多地关注应用 层创新。虽然其学习曲线和操作习惯与其他平台(如STM32的CubeMX或ESP32的ESP- IDF)有所不同,但一旦熟悉,其组件化和配置化的特点能显著提升特定类型项目的开发效率。 通过上述以PwM为例的开发流程,可以体会到其“配置优于编码(forhardwaresetup)” 的设计哲学,尤其是在需要快速适配不同硬件或复用已有软件组件的场景下,这种方法的便利性 更为突出。 嵌入式:目录三 <上一篇 下一篇> Hypershell消费级外骨骼:技术、市场与 在两个Linux系统上使用OpenHD搭建无线图 前景深度分析报告 传和数传链路的完整解决方案

原始排版图

EFR32 (Simplicity Studio) 开发环境与实践笔记:微信公众号导出原始排版图

FFmpeg 深度学习笔记 (三):Transcoding (转码) 的艺术与实践 - 3_transcoding.c

· 閱讀時間約 32 分鐘
w0x7ce
MySelf

发布于 2025-05-20 20:37:49(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 22034 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

FFmpeg深度学习笔记(三):Transcoding(转码)的艺术与 实践-3_transcoding.c original wex7ce EI V1ajero 2825年5月20日 28:38美国 本篇笔记将深入探讨 FFmpeg应用中的核心操作--Transcoding(转码)。我们将 聚焦于 的3_transcoding.c示例,详尽解析其核心原理、目标,并对代码实现进行注释风 格的梳理,力求清晰展现转码的完整流程。

一、Transcoding(转码)-核心原理与目标再深化

A.到底什么是Transcoding(转码)? .精确定义与过程分解Transcoding(转码)是指将已经编码(压缩)的音视频数据 流,通过解码(Decoding)还原成原始的未压缩数据(如视频的YUV像素数据,音 频的PCM采样数据),然后(可选地)进行滤镜处理(Filtering),最后再使用目 的(或相同的)容暴中的完整过程。这是一个对媒体内容进行“再加工”的流程。 .与Remuxing(转封装)的根本区别 。Remuxing(转封装):核心在于不改变音视颜流的编码数据本身,仅仅是更换其 外部的容器格式(如MP4转MKV)。它不涉及解码和重新编码,因此速度快且 对音视频质量无损。 。Transcoding(转码):核心在于改变音视流的编码数据,即对原始音视频内 容进行“再加工”。它必须经过”解码->(可选滤镜)->量新编码”的步骤。 B. Transcoding 改变了什么? .音视频流的编码格式(Codec):如H.264->H.265, .编码参数(EncodingParameters):如码率、分辨率、帧率、GOP结构、像 素/采样格式等。 ,文件大小。 :音视频质量(对于有损转码,通常会下降)。 C.Transcoding 没有改变(或不应显署改变)什么? 。核心叙事内容与主要的感知信息。 .总时长(Duration)和相对时间关系、音视频同步。 ,重要的元数据(如果刻意保留和迁移)。 D.为什么需要Transcoding?—核心驱动力 .兼容性(CompatibiLity):适配不同播放设备、操作系统、浏览器及编辑软件对 编码格式和参数的特定支持。 .带宽与存储效率(Bandwidth&StorageEfficiency):使用更高效编码或 适当降低参数,在可接受质量前提下,显著减小文件体积。 .自适应比特率流(Adaptive Bitrate Streaming-ABR):为 HLS、DASH 等流媒体技术准备同一内容的多个不同码率/分辨率的版本。 .特定播放或处理需求(Specific Playback/Processing Needs):如为视频 分析预处理、适配特殊显示设备、或在视频上应用永久性效果如水印、硬字幕(这些 通常伴随重新编码)。

二、FFmpeg Transcoding 的实现基石(API 与流程)-精要概述

FFmpeg通过其核心库协同完成转码,关键阶段和核心API包括: .输入处理(解封装与解码): 。打开 与 探测 avformat_open_input () avformat_find_stream_info()。 解码器准备与打开: avcodec_find_decoder() avcodec_alloc_context3(), avcodec_parameters_to_context(), avcodec_open2()。 。解码:av_read_frame()读取 AVPacket,然后通 过avcodec_send_packet()和avcodec_receive_frame()解码 为AVFrame。 .编码器设置与打开: 。查找与分配:avcodec_find_encoder_by_name() avcodec_alloc_context3()。 。参数配置:为编码器AVCodecContext设置目标码率、分辨率、帧率、像素/ 采样格式、GOP大小、时间基等:可通过av_opt_set()设置私有选项, 。打开编码器:avcodec_open2()。 .输出处理(编码与封装): 。创建输出上下文与流:avformat_alloc_output_context2(), avformat_new_st ream()。 。参数回传:avcodec_parameters_fron_context()将编码器参数更新到输 出流。 。打开输出Io与写头:avio open().avformat_write header()。 。编码:将AVFrame 通过avcodec_send_frame()送入编码器,然后通 过 avcodec_receive_packet()获取编码后的 AVPacket, 。时间调整:对编码后的AVPacket 调用 av_packet_rescale_ts()。 。写数据包:av_interleaved_write_frame()。 。Flush编码器与写尾:发送NULL帧给编码器 (avcodec_send_frame(encoder_ctx,NULL))并持续接收包,最后调 用 av_write_trailer()。 时间管理:在解码、编码、封装的整个链条中,精确处理和转换PTS、DTS及 duration,并确保它们与各阶段正确的 time base 相关联,是保证最终输出音视 频同步和播放正常的关键。 A.3_transcoding.c整体处理流程理 .参数定义与初始化(StreamingParams,StreamingContext):程序首先定义 了两个核心结构体。StreamingParams用于配置转码任务(如是否复制流、目标 编解码器等)。StreamingContext 用于聚合与解码器或编码器相关的 FFmpeg 上下文。main 函数开始时,会初始化一个 StreamingParams 实例(示例中硬 编码了默认转码行为).并为解码器(decoder_sc)和编码器(encoder_sc) 分配 StreamingContext 内存。命令行参数被用来设置输人输出文件名。 .解码端准备: 。open_media():打开输入文件,初始化 decoder_sc- >avfc(AVFormatContext)并获取流信息。 。prepare_decoder():运历输入流,为视频和音频流查找并打开解码器,填 充decoder_sc 中的 AVCodecContext 等成员。 ,编码端与输出准备: 。若 转 码 调 : 用prepare_video_encoder() 或 prepare_audio_encoder()。这些函 数会在encoder_sc->avfc中创建新流,并查找、配置、打开指定的编码器 (encoder_sc->video_avcc 或audio_avcc)。编码参数(如分辨率、码 率、时间基等)在此处设定。 。若需复制流(remux):调用prepare_copy()。此函数也在输 出AVFormatContext中创建新流,但直接从输入流复 制AVCodecParameters, oavformat_alloc_output_context2():根据输出文件名创建输 出 AVFormatContext (encoder_sc->avfc)。 。遍历输入流,并根据StreamingParams 的设置: 。处理AVFMT_GLOBALHEADER 标志(如果输出格式需要)。 。avio_open():打开物理输出文件。 oav_dict_set():设置muxer 选项(如果StreamingParams 中有定 义)。 。avformat_write_header():将文件头信息写入输出文件。 .核心转码/复制循环: 。转码路径:调用 transcode_video()或transcode_audio()。这些函数 >循环接收编码包->调整编码包时间戳->写入输出文件”。 。复制路径:调用remux(),调整包的时间戳并直接写入输出。 使用while (av_read_frame(decoder_sc->avfc,input_packet) >=θ)从输入文件循环读取AVPacket。 。判断包的流类型(视频或音频)。 。根据 StreamingParams 中对应流的copy_标志: av_packet_unref()释放输入包。 .编码器冲洗(Flush): 。主循环结束后,对所有设置为转码的编码器进行flush 操作。这是通过 向encode_video(...,NULL)和encode_audio(...,NULL)传 递NULL帧来实现的,确保编码器内部所有缓冲的数据都被编码并输出。 ,完成与资源清理: 。av_write_trailer():写入输出文件的尾部信息。 。细致地释放所有分配的FFmpeg对象和自定义结构体内存,防止内存泄漏。 B.3_transcoding.c 源代码及注释 //包含增解码相关的楼心数据结构和函数( //包含客器格式处理相关的核心数据结构和退 #include <libavfornat/av format.h> #include <libavutil/timestanp.hx //包含时问载处理相关的工具函数(本示例 //标准输人输出库,用丁printf。fprin #include <stdarg.h> /用于处理可变数函数如本示例中的1 #include cstdlib.h> //标准库,用于内存分配《malloc,call #include <libavutil/opt.hs //FFmpeg 选项设置相关的函数(avopt //字特串处理函数(strcpy,strcat,5 #include <string.ha //用于跨平台打印确定氨底的整数英型(如 #include "video debugging.h* 11款程提供的目定义日志函数头文件(资设 1211括构体:用于定义转码任务的登致,使得主逻辑更属可配置性 typedef struct StreamingParams char copy_video; //标志位:著为1,则音强流被言接复制(remux):若 char +output_extension; //(可造)输出文件的扩展名,如“.ts"。若提供,会 char *muxer_opt_key; //(可进)用于向输出容器的muxer传透特定选项的 char *muxer_opt_value; / /(可选) 与muxer_opt_key 对应的值,如“frag //(著视频转码)目标视频编研暨的各称,如“L1bx26 char *audio_codec; //(老音频转码)目标音须端码整的名称,如“aac"。 //(可选)用于向绩码器传递私有遮项的键名,如“X24 char *codec_priv_key; //(可遮)与 codec_priv_key 对应的值。 } 5treamingParans; 11结构体:币于封装处理一路媒体流(无论是输人解码还是输出编码)所需的FFnpeg上下文 typedef struct Streaningcontext { AVFormatcontext avfc; //指向AVFormatContext(输人时足解封装上下 AVCodec +video_avc; /1指向质AVCodec(解码器或缓码露对象)。 AV5tream video_avs; //指向视强AVStrean(输人流或输出流对象) AVCndecCantextvidea_avcc; // 指向质 AVCodecContext(解码器或编码整剂 AVCodecContextaudio_avcc;// 指向音經AVCodecContext(解码器或缩码器的 int audia_index; //音线流在其 AVFormatContext 的 streass ] char filenane; 11指向与此上下文相关联的爆体文件名(输入或输出 } Streamingcontext; //(微设Logging函致已在video_debugging.h中定义或在本文件其他增方定义) //static void Logging(const char +fet,

  • / 7 (

  • / }

43//函数:为给定的输人流aVS初始化解码器相关的上下文。 A4//成功时,avc将指向规到的解码器。avcc据向配置并打开的解码器上下文。 int fill_strean_info(Avstrean *avs, AVCodec **avc, AVCodecContext **a /11.根需糖入流的编解码梦数(avs->codecpar)中的 codec_id查找对应的已注册

  • avc = (AVCodec*}avcodec_find_decoder(avs->codecpar->codec_id) ;

if (1avc) (logging(“failed to find the codec for strean #ad (id %d //2.为找到的解码器avc分配一个新的AVCodecCantext结构体内存。

  • avcc = avcodec_alloc_context3(*avc):

1f [!avcc) (loggingitalled to altoc menory for codec context for //3.将输入流的编解码致(avs->codccpar)量数到新分配的解码器上下文avcc 这一步为解码翻上下文提供了必要的初始化参数,例如分辨率,像素格式,采样率等。 if [avcodec_paraneters_to_context (*avcc, avs->codecpar) < B) {loggi

114.使用指定的解码器avC打开(初始化)解码群上下文aVcC,使其准無好进行解!

第三个参数AVDictionaryopLions可以传通特定于解码照的进项,此处为!

/7 if (avcodec_opcn2(*avcc, avc, NULL] < θ) {logging("failed to opcn return0;//初始化成功 A//函数:打开指定的输人煤体文件In_f1Lename,并获取其格式和流信息,结果存人avf( int open_media(const char *in_filenane, AVFornatContext *avfc) { //1.分配AVFornotContext 结构体内存。AVFornotContext 用于存储整个赚体文 avfc = avfornat_alloc_context(); if [!+avfc) {logging{"failed to alloc menory for AvFornatContext):

112.打开输入文件。并读取文件头以识别容器格式。

avformat open input 会填充*avfc 中的部分信息。

第三个参数 AVInputFornat* fat 传 NULL,FFnpcg 会容动检测轴入格式。

第四个参政AVDictlonary**optlons传NULL,表示没有给解封容器传递额外

// if [avformat open input(avfc, in filenane。 NULL, NULL) != B) {loggi /13.读取媒体文件的一部分致据包,以获取更洋细的流信息(如精硬能率、编码参数等) 此函数会填充(*avfc)->streans数组及其每个AVStrean 成员的详级信息。 /7 if (avformat_find_strean_info(*avfc, NULL) < B) (logging(failed t0 return8://打开媒体并获取信息成功 82//函政:为StreaningContext sc(解码器础)中的音祝频流准解码器, 日3//它会逾历输人文件中的所有流,并为找到的第一个视频流和第一个音频流初始化解码暨。 int prepare_decoder(Streamingcontext *sc) { //遍历输人 AVFormatContext(sc->avfc)中的所有流(sc->avfc->nb_streams for [int i = 0; 1 < sc->avfc->nb_streams; i++) { AVStrean current_strean = sc->avfc->streans[i];// 获取当前流的剂针 //并断当前流的类型(codecpar->codec_type)。 1f (current_stream->codecpar->codec_type == AVMEDIA_TYPE VIDEO} { //此示例只处理规到的第一个视频流,如果sc->video_avs仍为NULL(初始值) 1f (sc->video_avs -= NULL) { sc->video_avs = current_strean; // 保存祝频流据针到 StreamingC sc->video_index = i; I1保存视频流在其AVFormatConte logging(*Found video strean at index ad", 1); //为此祝频流初始化解码群相关的AVCodec 和 AVCodecContext if (fill_stream_info(sc->videa_avs, &sc->video_avc, 5sc->vi }a51a { logging(*Found another video strean at 1ndex &d, ignoring a } else 1f (current_strean->codecpar->codec_type -= AVMEDIA_TYPE_A) 11类似地,只处理找到的第一个音频源。 if (sc->audio_avs == NULL) { sc->audio_avs-current_strean;//保存音须流指针 /1保存音频流索引 sc->audlo_1ndex = 1; logging(Found audia stream at index %d, i); 11为此音频流初始化解码器 If (fill_stream_info(sc->audio_avs, 6sc->audio_avc, 6sc->au 107 }else { logging(*Found another audio strean at index 4d, ignoring a } 1 1( el5e{//其他类型的流(如字幕、数据)在此示例中被忽略 logging(*skipping strean #ad of type ad (e.g. subtitle, data)." } 11检直是否至少执到了一个视额或音颁流进行处理 If [!sc->vide0_avs 6& !sc->audio_avs] { L I c logging(*No video ar audio streams found in the input file that returne://解码器准备成功 2 2 123// 函数:为输出 StreawingContextsc_encoder(编码整端)创建并配置视频编码器。 124//多数: SC_encoder:指向编码群瑞的 StreaaIngContext,其avfc 成员应已分配 .25// decader_V_avcc:指向输入提频解码器的AVCadecContexl,用于获取源视频的一 input_francrotc:输入提额的能率(AvRationoT类型),用于设置镇码器时何基。 /7 sp: StreamingParans。 包含具标视频编码器名称(sp. video codec) 和私有选及 int prepare_video_encoder{StreamingContext *sc_encoder, AVCodecContex /1.在输出 AVFormatContcxt(sc_cncoder->avfc)中创建—个新的祝频流。 sc_encoder->video_avs = avfornat_new_strean(sc_encoder->avfc, NULL) if (1sc_encoder->video_avs) { logging(*Failed to create ncu video 5" //2.根癌 StreaingParanms 中指定的视频编码器名称(sp.video codec)重找已 1f (!sc_encoder->video_avc) {logging("could not find video encoder: 1/3.为找到的编码器分配 AVCodecContext 内存。 sc_encoder->video_avcc = avcodec_alloc_context3(sc_encoder->video_a if [!sc_encoder->video_avcc) {logging(Could not allocate menory fo

114.核心:设置视额编码器的各项参数。

//使用avopt set设置编码避的私有选项。“preset是x264/x265 等编码器第, /1用于在输码速度和压擅效率之间进行权衡。“fast”是一个较快的预设。 av_opt_set(sc_encoder->video_avcc->priv_data, preset", “fast, ); //如果StreaningParans中定义了其他针对此确码器的私有选项是值对。则也进行设置 if (sp,codec_priv_key 5& sp.codec_priv_value) av_opt_set(sc_encoder->video_avcc->priv_data, sp.codec_priv_key, /1设置输出视频的高度、宽度和采杆宽高比(5AR)。 //通常,如果转码不改变分折率和SAR,这签值直接从输人握频解码器上下文(decoder_V /1如买需要增放或改变SAR,别应在达入编码器的通过滤镜处理。然后这量设置目标值。 sc_encoder->video_avcc->width - decoder_v_avcc->width; 11设置输出橙额的像靠格式(pix_fnt)。 //*关键:此像素格式必额是所透视频编码器(sc_encoder->video_avc)支持的 //可以通过检查sc_encoder->video_avc->pix_fnts数短来确定支持的格式 11示例中简单地取编码器支持的第一个格式,或者在搞码器未码确列出时,坐试使用输入解 11重要:如果解码器输出的额的像素格式与此处设置的境码器陷入像素格式不匹配。 在等航送人端码器(avcodec_send_frane)之前,必须使用 Libswsca 此示的监化了这一环节,履设格式兼容或编码器内部能处理第些常见转换, // 1f[sc_encoder->v1deo_avc->pix_fmts】//却果编码器明确列出了支持的需素格式 sc_encoder->video_avcc->pix_fnt = sc_encoder->video_avc->pix_fmts el.se//否则,营试使用确入祝频的像索格式 Sc_encoder->viceo_avcc->pix_fnt = decoder_v_avcc->pix_fnt; //设置目标视额码率(bit_rate),单位:比特/秒。示例中硬缤码为2 Mbps。 sc_encoder->video_avcc->bit_rate = 2 * 1000 * 1088; //设置码率控慰桐关的缓冲区大小(rc_buffer_size)、最大码率(rc_max_rate)和 /1这些每政影响可壶码率(V8R)编码的行为和输出流的期时码率波动。示例中的值可能素: sc_encoder->video_avcc->rc_buffer_s1ze = 4 * 10ee + 1000; sc_encoder->video_avcc->rc_min_ratc - 1.5 10ee 1089;//(正: 7 //设置编码器的时间基(tine_base),非常量要( 11它定义了编码器内部处理和标记能时间致的单位。 //通常与期塑的出额率(Input_tramerate)相关。av_inv_q(r)计算有理数rB // 例效, 如果 input_framerate 是 {25, 1} (代表 25fps)。 则 tine_base 是 //这意味着编码器期望接收到的AVFranc的pts是以1/25秒为单位的(或者需要转: 11将新的建的编出视频流的时间基也设置为与编码器上下文的时问基一致。 l/这样做可以简化后续对编码后AVPacket 进行时网数调整(av_packet_rescate_ts 11因为编码器输出的包的时间醛单位将直接与输出流期望的单位相可。 sc_cncoder->vidco_avs->timc_base = sc_encoder->vidco_avcc->tinc_bas //5.打开(初始化)祝频编码器上下文,使其准备好接收赖进行编码。 if (avcodec_open2(sc_encoder->vidco_avcc, sc_encoder->vidco_avc, NU 6 //6.*关键步骤:**将配置完成并已打开的编码器上下文sc_encoder->video_avc (这些参致可能在avcodcc_opcn2后被编码器密调或填充了致认值,例如cxtre 复影到确出视流的编解码数 sc_encoder->VIdeo_avs->codecpar 中。 这是为了让Muxer能够获取到正确的流搭述信息,并将其写入输出文件的头部。 avcodec_parancters_from_context(sc_encoder->video_avs->codecpar, 5c return0://祝所编码群准备成功 200//函数:为输出 StreamingContext sc_encoder(端码群瑞)创建并配置音籍端码器。 //逻辑与preparevideo encoder 非常相似。但设置的是音频相关的参数。 int prepare_audio_encoder(Streaningcontext *sc_encoder, int input_sam( I11.在输出AVFormatContext 中创建新的育频流 sc_encoder->audio avs = avformat new strean(sc encoder->avfc, NULL) if (1sc_encodcr->audio_avs) ( logging(Failed to create ncu audic 5 //2.根 StreaingParans 中定的音频编码器名称(sp.audio codec)重找壤 sc_encoder->audio_avc = (AVCodec)avcodec_find_encoder_by_nane(sp,a 113,分图盘频端码器上下文 sc_encoder->audlo_avcc = avcodec_alloc_context3(sc_encoder->aud1o_a if [!sc_encoder->audio _avcc) {logging( could not allocated memory f.

114.设置育频编码器的各项参验

: 1 : intOUTPUT_CHANNELS=2://示例:硬编码输出为双声道(立体声) int OUTPUT_BIT_RATE=196G88;// 示例:硬编玛输出音须到率为196kbps sc_encoder ->audlo_avcc->channel.s = OUTPUT_CHANNELS; /获取双声道的默认声道布局(通常是AV_CHLAYOUT_STEREO) sc_encoder->audio_avcc->channel_1ayout = av_get_default_channel_1lay //设置输出音额的采样率,通常与输人一致(1nput_sample_rate),除非要进行重采样 scC_encoder ->audio_avcc->sample_rate = input_sample_rate; 11设置输出音频的采杆格式。**关提:**必须是所选音频编码器支持的格式之一。 /示例中简单地取编码照支持的第一个采样格式(sc_encoder->audio_avc->samoe_ 11如买解码题输出的音频额的采样格式与此不匹配。在送入编码避前必须使用Libswresas sc_encoder->audio_avcc->sanple_fimt

  • sc_encoder->audio_avc->5.

else { logging(*Audio encader Ns does not list supported sample format5, sc_encoder->aud1o_avcc->sanple_fmt = AV_SAHPLE_FMT_FLTP; // FLTP

  • OUTPUT_BIT_RATE; // 设置目标

sc_encoder->audlo_avcc->bit_rate /1设置音频编码题的时间基,通常是{1,采样率}。表示时网既的单位是1/sanpTe_rat sc_encoder ->audio_avcc ->tine_base = (AvRational){1, sc_encoder /1对于某些编码器(例如 FFapeg内置的实整性AAC编码器),可能震要设置此符合性线 /以允许使用一些可能非严格符合特定标准但能工作的特性。 sC_encoder->audio_avcc->strict_std_conpliance - FF_coMPLIANCE_EXPER 11将所的建的输出音须流的时间基也设置为与喻码器上下文的时间基一致 sc_encoder->audio_avs->time_base = sc_encoder->audio_avcc->tine_bas- //5.打开(初始化)音频响码器上下文 if (avcodec_open2(sc_encoder->audio_avcc, sc_encoder->audio_avc, NU //6.将配置好的响码器警数复制到缩出音频流的cadecpar avcodec_paraneters_from_context (sc_encoder->audio_avs->codecpar, 5c. return0://音频编码群准备成功 52//函数:当流棱设置为直接复剂(remux)时说用。 // 在输出 AVFarnatContext{output_avfc) 中的建—个新流(*output_avs), l/并直接从输人流的缩解码数(dccodcr_input_par)夏影数数。 Int prepare_copy(AvFormatContext *output_avfc, Avstream **output_avs, //1.在输出 AVFormatContext中创建一个新的流。

第二个参致 const AVCodcc*codec 在rcnuxing 时通常为 NULL,因为我们

  • output_avs = avformat_new_strean(output _avfc, NULL):

if (1*output_avs) ( logging(*Failed allocating output strean for col //2.*核心步强:**直接将输人流的缓解码梦数decoder_Input_par完整复制到新的 这是remuxing操作的关键,因为它告诉muxer输出流的数据包真有何种确码特: 1f (avcodec_paraneters_copy((output_avs) ->codecpar, decoder_input_ logging(Failed to copy codec parameters for remuxing strean.): returnAVERROR(EINVAL);// EINVAL通常表示无效参数或硬作 //对于renuxing,通常将输出流的 codec tag 设为θ。 //这会让muxer根据codcc_id和目标输出容器格式自动选择或生成合通的FourCC/ 11如果不设为9,muxer可能会曾试使用从输人复制过来的旧的codec_tag,这可能与新 [output avs) ->codecpar->codec_ tag = θ; returne;//流复制准备成功 74//函数:封装了直接复别(renmux)一个AVPacket的核心操作,主要是调整时问致, 275//参政: pkt:据向待处理的 AVPacket 指针的指针。函数会您改(pkt)的时问数和 stree output_avfc_ptr:摇向输出 AVFarmatContext 摇针的据针(用 是因为函数 Input_strean_tb:该包原始确入流的时间基。 27877 / / int remux(AVPacket **pkt_ptr, AVFormatCantext **output_avfc_ptr, AVRa AVPacketpkt-*pkt_ptr;//解引用获联 AVPacket 播针 AVFormatCantext *output_avfc = *output_avfc_ptr; // 等5/用获取 AVForn //*谭整时间群:**将包(*pkt)的PTS(显示时间数),DTS(解码时间群),和 /1从其原始输人流的时间基input_streantb 转换为目标输出流的时间基output_st //av_rescale_q_rnd进行有理数(分数)时间基的糖放,并可据定舍入方式。 I/AV_ROUND_NEAR_IMF表示四金五人致最近的整数(超向无穷大方向)。 I/AV_ROUND_PASSMINMAX允许结果超出目标类型的最小/最大值(在某些需要精确保托 av_packet_rescale_ts{pkt, input_strean_tb, output_strean_tb); //(注意:原示例中renux 函数的 encoder_tb参数名可能易误导,它实际应为 outpi //格调整好时间致的包写入输出AVFarmatContext。 I/av_interleaved_write_frane 会负责根据输出容器格式的要求, 11正确地交织来自不同流的数据包(仍如,先写一些视频包。再写一些音频包,以满足穗放器 if [av_interleaved_write_frane(output_avfc, pkt) <B) { logging(*Error muxing packet during renux operation"); return-1://写人先败 //此函政不负责av_packet_unref(*pkt)。调用它的main 循环会在处理完舞个包后 returne;//renux 单个包成功 //函数:授收一个解码后的原始榄质领input_frame,将其发送给encoder_sC->video 然后在一个疆环中诵用avcodec_receive_packet来获取所有可能产生的编码: / / 对这些包进行必要的时间致调整,并量终通过 av_ntericaved_write_frane / / 若1nput_frane 为 NULL,则表示稻人结束(fLush模式)。此函数会向编码 int encode_video (Streamingcontext *decader_sc, StreamingContext *enco //如果是实际的强额额(input_franc 不是 NULL,即非 flush 模式), //有时需要清除其pict_type(图像类型,如I、P.B帧)。 //这是因为解码器输出的赖可能带有原始的pict_type,而端码器有白己的GOP决策逻辑头 I/保留原始 Dict_typc可能会干犹斓码部的决策,将其设为 AV_PICTURE_TYPE_NONE If (input_frane) 1nput_frame->pict_type = AV_PICTURE_TYPE_NoNE; AVPacket *output_packet = av_packet_alloc();I| 分配—个 AVPacket 用 If (!output_packet) {logging(*could not allocate memory for output //1.将原始握频赖(input_franc,如果为NULL则是flush信号)发送給额码& 17 Int response = avcodec_send_frane(encoder_sc->video_avcc, input_fral 18 //检查avcadec_send_frame 的返回值。 //小于o表示错误。AVERROR_EOF 在flush 模式下(input_franc为NULL)是正常 If [response < 0 6& response I= AVERROR_EOF) { logging(*Error sending frame to videa encoder: %s", av_err2str( av_packet_free(&output_packetl;// 释放巴分配的包 return response:// 返回错送码

112.撕环从擦码器接收编码(压擦)后的数摄包。

因为编码器可能有内部缓冲。或者一个编入躺可能不立即产生输出包。 while (responsc >= B){// 只要上—次 send_framc 或receive_packet 没 response = avcodec_receive_packet(encoder_sc->v1deo_avcc, output_ if (responsc == AVERROR(EAGAIN) II responsc == AVERROR_EOF) ( //AVERROR(EAGAIN):接码器当前没有定够的已编码数据来输出一个包。 833 它可能需要更多的输入(期果input_frame 不是iUL // //AVERROR_EOF:输入已结束(之前发送了 NULL就来fLush),且编码器内部所 这是编码/fLush过程正常结束的标志。 break: // 退出当鹏的 receive packet 循环。 I/如果是EAGAIN,上属速细会继统发送下一赖(如黑还有)。 11如果是EOF,表示此流的编码已完成。 }else if(response<9)《//其他编码销误 logging(*Error while receiving packet fron video cncoder: 4s", 4 av_packet_free(&output_packet); // 释成包 return response;// 返回错误码 //如果response >=9,说哥成功获取个编码后的 output packet output_packet->stream_index = encoder_sc->video_index; // 置包的 //计算编码包的持磷时间(duration)。 /示例更辑: duration_in_output_tinebase = (I / output_fps) //output_fps 可以从 encoder_sc->vldeo_avcc->franerate (如果设置了) 851 //encoder_sc->video avs->time_base 通常是 {1, output_fps}。 //decodcr_sc->video_avs->avg_franc_rate 是输人流的平均然率。 //公zC (A.den/A. nuo) / (B. nus/B. den) = (A. den * B. den) / (A.nun * //所以 (output_timebase_ticks_per_sec) / (input_fps) // 更直接:output_packet->duration = av_rescale_q(1, input_fraserat 11此处示例的计算方式是基于输入流的平均额事来估算每个确出包(贷设对应一能)的持! 857 11并将其表示为赔出流时间基的单位数。 二 if (decoder_sc->video_avs S5 decoder_sc->video_avs ->avg_frane_rat output_packet->duration = (1nt64_t)encoder_sc->video_avs ->tim decoder_sc->video_avs->avg_frane_ra // This calculatfon needs review, t // A siapler and often correct vay // output_packet->duration = 1; (If // Or, if input_frame had a duratia. // output_packet->dtrration - av_res //The exanpte's calcutatlon appear // For sinplicity。 if the encoder st //Let's use a siapler approacih If //FFspeg's ovn transcoding CLI oft // Keeping the origina? complex cal }else{ output_packet->duration = 0; 73

11**调整时间数:**将确码器输出的包的时间最从确码器的时间基转换到输出流的时间。 //编码器(encoder_sc->video_avcc)输出的包,其pts 和dts 显以编码器白 //(encoder_sc->VIdeo_avcc->tine_base)为单位的。 11在写入muxer(encoder_sc->avfc)前,这些时间致需要被转换到其对应的输出 //(cncoder_sc->video_avs) 8的ey间基 (encoder_sc->video_avs->tine_b6 l/在prepare_video_encoder 中,这两害通常被设置为相网的否, //*encoder_sc->video_avs->fime_base = encorer_sc=>video_avcc->tii //因此,如要严格遵守过个设置,这量的rescale误用理论上是将时问登从时问基A 11数信不会改变。但这是一个好的实践。以防这两奢在某盛复杂情况下不一致,或为了代 11源时间基应为编码器输出包的原始时问基。 av_packet_rescale_ts(output_packet, encoder_sc->videa_avcc->lime_base。 // 源: 编延 1将编码完成(并调整好时何)的数癌包写入输出AVFormaIConlexl。 6 1/出其内部的muxer负责按格式要求交识和写人文件。 response = av_interleaved_write_frane(encoder_sc->avfc, output_pa 6 if(response = B} { logging(*Error sd while writing vidco packet to output: §s", av_packet_free(&output_packet):// 放包 return-1;// 返回得误 av_packet_unref (output_packet); // 为下—次 avcodec_receive_packet av_packet_frce(6output_packet);//放 AVPackct 结构体本身 I1如果循环是因为AVERROR_EOF(正常fLush结莱)遇出的,则返回O表示成功, //如果是因为AVERROR(EAGAIN)(需要更多输入额)。对于flush接式(input 「re |/但对于非flush 模式,适画o让上层媒统 send_framC。 /1为了简单,这需只要不是负致错误,都视为当前批次的包处理完毕。 return (response == AVERROR EOF) ? : ((response == AVERROR(EAGAIN //函数:编码音频额,逻辑与encodevideo非常相似。 int encode_audio(Streamingcontext *decoder_sc, StreamingContext *enco 4 11 //Input_frane 为 NULL 时表示 fLush 螺码数 //音频领没育pict_type,所以不需雯像视频那样处理input_frame->pict_type AVPacket *output_packet = av_packet_alloc(); If [!output_packet) {logging(*could not allocate memory for output Int response = avcodec_send_frane(encoder_sc->audio_avcc, input_fral 1 7 if (response < E && response != AVERROR EOF) { // AVERRoR EOF 在 f1 logging(*Error sending frane to audia encoder: %s", av_errzstr( av_packet_free (&output_packet); 2@ return response; while (response >= B) { response = avcodec_receive_packet(encoder_sc->audio_avcc, output_ break://需变更多输人或已结束 } else if (response < θ){ logging(*Error while receiving packet fron audio encoder: as", av_packet_free(&output_packet): return1;//输码错误 3 Z 433 11成功获取编码包 34 output_packet->stream_index = encoder_sc->audio_index; // 设置为输 l音频包的 duration 通常由编码群权驾其内部的 frane_size 和 sanpte_rate 136 1/或者可以不设置,让muxe厂或播放器自行推断。 //output_pocket->duration -... 3 139 11调整时间面,从输码器时间基转换到输出流时间基 av_packet_rescale_ts{output_packet, 4 encoder_sc->audio_avcc->time_base, // 源: 音舟 442 response = av_interleaved_write_frame(encoder_sc->avfc, output_pa if {response = B} { logging(*Error sd while writing audio packet to output: ss",

4.47

av_packet_free(&output_packet) : return-1;//写入错误 av_packet_unref(output_packet);// 为下次授收他准盘 二 av_packet_frec(6output_packet);// 放包结构 return (response == AVERROR_EOF) ? e : ((response == AVERROR(EAGAIN //函数:处理单个输人音频包的转码流程:解码->(获取所有解出赖)->编码每-写 int transcode_audio(StreamingContext *decoder_sc, StreamingContext *e //1.招输入的压糖音频包input_pockct 发送给音额解码器dccodcr_5c->audio_6 Int response = avcodec_send_packet(decoder_sc->audlo_avcc, input_pa if [respanse < B) {logging(*Error while sending audio packet to der //2.确环从解码器接收解码后的原始音操帧Input_frane while (response >= B]{ // 只要上—次 send packet 或 receive_frane 没 responsc = avcodec_reccivc_frane(decoder_sc->audio_avcc, input_fr. 1/EAGAII:解码器需要更多输人包才能输出当前额。 //EOF:已到达流末尾(始果之前发送7NULL包fTush),互解码器内部所有缓冲能 break://道出授收婚环,等待下一个输人包或表示解码完成, } else if (response < θ){ logging(*Error while recciving audio frane from decodcr: ss", a return response;//解码错误 47 2 47 5 //如果 response >= 0,说丽成动解码出一能原始育斯数無别input_frame if (response >= B} { //将此解码得到的原始音频额input_fronc送去编码 1f (encode_aud1o(decoder_sc, encoder_sc, Input_frame)) return 478 //**关键:**在处理完(或差试处理)从解码器接收到的input_frane后, 1须诉用av_frane_unref来释放其内部酸据缓冲区的引用。 48 1 l/使得input frane 结构体可以皱下一次avcodec receive frase 调用安全地 av_frane_unref(input_frame); |如买是因为EAGAIN或EOF退出摄环,对于当煎包的解码尝试算是“正常”结束(可能 return 8; /1函数:处理单个输入视须包的转到流程:解到>(获取所有解出触)>期码每航>写 //逻辑与transcode_audio 菲常相似 Int transcode_video(Streamingcontext +decoder_sc, Streamingcontext +e) //1.招输入的压糖视频包input_packet 发送给视频解码器 decodcr_sc->video_a Int response - avcodec_send_packet(decoder_sc->video_avcc, input_pa If [response < e) {logging(*Error while sending video packet to dec:

112.硬环从解码器接收解码后的原始祝额帧Input_frane

while (response >= θ) { response = avcodec_receive_frane(decoder_sc->video_avcc, input_fr. break://需要更多输人包,或已到流末属层解码群已ftush }else if (response < θ){ logging(*Error while receiving video frane from decoder: 4s", a return response;//新码错误 //如果成功解码出一能原始视(response>=9) if (response >= B} { //将止解码得到的原始视频input_frane送去编码 1f (encode_vldeo{decoder_sc, encoder_sc, Input_frame)) return - 11**关键:**释放当的解码的政癌引用 av_frae_unref (1nput_frame) : return θ; 515}

四、3_transcoding.c的学习价值与拓展(精要回顾)

核心学习点:

  • 掌握了Demux->Decode->Encode->Mux的完整媒体处理管线。

  • 理解了解码器和编码器上下文的独立配置与管理。

  • 学会了如何根据参数动态选择转码或复制流。

  • 认识到编码器参数设置对输出的关键影响。

  • 初步接触了复杂流程中时间戳传递与转换的重要性。

  • 理解了编码器Flush操作的必要性。

  • 体会到转码流程中资源管理的复杂性与重要性。

可拓展方向: .集成滤镜(libavfilter):实现缩放、裁剪、水印等常见转码需求。 .精细化编码参数控制:允许用户从外部(如命令行、配置文件)更灵活地控制编码 参数。 :硬件加速转码:利用GPU等硬件加速编解码过程。 通过对3_transcoding.c的深入学习和实践,可以为开发更复杂、更专业的音视频 处理应用打下坚实的基础。 ffmpeg·目录= <上一篇·FFmpeg深度学习笔记(二):Remuxing(转封装)的艺术-2_remuxing.C...

原始排版图

原始导出图超过单张 WebP 的尺寸上限,以下图片按从上到下的顺序连续保存。 FFmpeg 深度学习笔记 (三):Transcoding (转码) 的艺术与实践 - 3_transcoding.c:微信公众号导出原始排版图(第 1 段,共 2 段) FFmpeg 深度学习笔记 (三):Transcoding (转码) 的艺术与实践 - 3_transcoding.c:微信公众号导出原始排版图(第 2 段,共 2 段)

FFmpeg 核心概念与 `0_hello_world.c` 示例深度解析 系列一

· 閱讀時間約 21 分鐘
w0x7ce
MySelf

发布于 2025-05-17 12:42:42(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 14026 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

original we×7ce EI V1ajero 2825年5月17日 12:43 中国垂港 FFmpeg是一个强大的开源多媒体处理工具集,其核心库(libav)允许开发者对音 视却数据进行底层的编解码、格式转换、滤镜处理等操作。本文将通过分 leandromoreira/ffmpeg-libav-tutorial仓库 析 中 的0_hello_world.c示例,深入探讨FFmpeg的核心概念和基本工作流程。 0_hello_world.c的目标是:打开一个煤体文件,解析其结构,解码视频流中的最 初若干数据包,并将解码后的帧保存为PGM(便携式灰度图)图像文件。

一、视频压缩与献类型的核心理论

视频压缩技术旨在减少表示视频内容所需的数据量,其基础在于利用视频数据中存在的 究余信息。 .1.视频数据的冗余性: 。·时间冗余(TemporalRedundancy):视频由连续的图像序列构成,相邻帧 之间通常内容高度相似。 。·空间余(SpatialRedundancy):单顿图像内部,相邻像素也常具有相 关性。 .2.帧类型与压缩: 为了高效去除时间余,视频编码标准(如H.264,H.265)引I入了不同类型的 赖:

  • IDR-帧(Instantaneous Decoder Refresh/即时解码器刷新

帧):IDR帧是一种特殊的I-帧。当解码器遇到IDR帧时,它会清空所有参考帧缓 冲区,意味着IDR帧之后的所有帧都不能参考IDR帧之前的任何赖。IDR帧提供了

一个绝对的解码刷新点。

  • SP-帧(SwitchingP-frames)和SI-帧(SwitchingI-

frames):用于在不同码率或编码参数的视频流之间平滑切换,常见于自适应流 煤体(ABR)技术。 。·视频编码时,帧通常被组织成一个个GOP。一个GOP以一个I-帧开始,后面跟着 若干P-帧和B-帧(例如IBBPBBPBBPBB)。GOP的长度和结构(如B赖数量)会 影哺视频的压缩率、随机访问性能和错误恢复能力。 。·工作原理:利用更充分的时间瓦余,可以同时参考其前面的一个I/P帧和其后 面的一个I/P帧(未来的参考帧)进行双向预测。编码时记录当前帧与这两个参考 帧的差异及相应的运动矢量。 。·特性:解码时需要其前后两个参考帧均已被解码:通常是三种帧中数据量最 小的,压缩效率最高:由于依赖未来的帧,导致视频码流中帧的解码顺序(DTS

  • Decode Time Stamp) 和显示顺序 (PTS·Presentation Time

Stamp)往往不一致,解码器需要进行帧重排:会增加解码器的解码延退。 。·必要性:在对延迟要求不高的场景下(如视频点播、文件存储),可以最大限 度地提高压缩率。 。·工作原理:利用时间瓦余,基于其前面的一个I-帧或P-帧(称为参考帧)进 行预测编码。编码时,主要记录当前帧与参考帧之间的差异信息(残差)以及描述 这种差异的运动矢量。 。·特性:解码时依赖其前面的参考帧:数据量通常远小于I-帧,压缩效率较高。 。·必要性:大幅提高视频的压缩率。 。·工作原理:独立编码,不依赖其他任何帧,仅利用当前帧内部的空间瓦余进行 压缩,类似于一张JPEG图片。 。·特性:可独立解码,是解码的起始点:作为随机访问点(用于播放器的跳转操 作):是后续P-帧和B-帧进行预测的参考基础:通常数据量在三种帧类型中最 大;具有一定的错误恢复能力,解码错误通常不会传播过一个I-帧。 。·必要性:提供解码入口、实现seek功能、同期性剧新图像以抑制误差累积。 。·I-帧(Intra-codedPicture/帧内编码帧)·关键帧 。·P-帧(Predicted Picture/向前预测编码帧) 。·B-帧(Bi-directionally Predicted Picture/双向预测编码帧)

  • 图像组(GOP-Group of Pictures):

。·其他帧类型简介:

二、 FFmpeg 核心组件回原

在深入代码之前,再次明确FFmpeg中几个核心结构体的作用:

  • ·AVFormatContext:代表整个媒体文件(容器)的上下文,用于解封装(读取

文件头、分离流等)。

  • ·AVStream:代表容器中的一个具体的数据流(如视频流、音频流、字幕流)。

  • ·AVCodecParameters:描述一个流的编码参数,例如编解码器类型、分辨率、

帧率、像素格式、采样率、声道数等。

  • ·AVCodec:代表一个具体的编解码器实现(例如H.264解码器、AAC解码器)。

  • ·AVCodecContext:编解码操作的上下文,包含了编解码器实例、运行时参数和

状态信息

  • ·AVPacket:存储从流中读取出来的、已编码(压缩)的数据块,是解码器的输

  • ·AVFrame:存储解码后的、原始的(未压缩)的视频帧(包含像素数据)或音频

采样(包含PCM数据),是解码器的输出。 核心解码流程: .1.使用 avcodec_send_packet(avctx,pkt)将 AVPacket(压缩数据) 发送给解码器上下文avctx .2.在一个循环中调用 avcodec_receive_frame(avctx,frame)来尝试从 解码器获取解码后的AVFrame(原始数据)。此函数可能返回: 。·日:成功获取一帧。 。·AVERROR(EAGAIN):解码器需要更多的输人包才能输出当前帧,或者当前没 有立即可用的赖。 。·AVERROR_EOF:输入流已结束(通过发送NULL包 给avcodec_send_packet来指示),且解码器内部所有缓冲的帧都已成功取 出。

三、o_hello_world.c 代码分析

以下是对θ_hello_world.c核心逻辑的分析: /*

  • Format (Container) - a wrapper, providing sync, metadata and

  • Stream - a continuous stream (audio or video) of data over t

  • and DECoded (from Packet to Frame).

  • Packet · are the data (kind of slices of the stream data) to

  • Frame - a decoded raw frame (to be encoded or filtered).

#include<libavcodec/avcodec.h> #include<stdarg.h> #include<stdlib.h> #include<inttypes.h> //辅助函数:打印日志信息 staticvoidlogging(constchar *fmt, ...); //辅助函数:解码数据包到帧 staticintdecode_packet(AvPacket *pPacket, AVCodecContext *pCode //辅助函数:将灰度帧保存为PGM文件 staticvoidsave_gray_frame(unsignedchar *buf, int wrap, int xsiz intmain(int argc, constchar *argv[]) //1.检查命令行参数,确保指定了媒体文件 if (argc < 2){ printf(*You need to specify a media file.\n"); return-1; logging(*initializing all the containers, codecs and protocol //FFmpeg 在早期版本需要调用av_register_all()来注册所有组件。 //现代版本中,很多组件是自动注册的。 //2.分配AVFormatContext 结构体内存 //AVFormatContext用于存储媒体文件的格式信息(容器信息) AVFormatContext *pFormatContext = avformat_alloc_context(); if (!pFormatContext){ logging(“ERRoR could not allocate memory for Format Context return-1; //3.打开输入文件并读取文件头 //argv[1]是命令行传入的媒体文件名 //第三个参数 AVInputFormat 传NULL,FFmpeg会自动检测输入格式 //第四个参数AVDictionary传NULL,表示没有给解封装器传递额外选项 logging(*opening the input file (%s) and loading format (cont if (avformat_open_input(&pFormatContext, argv[1], NULL, NULL) ! logging(“ERROR could not open the file"); avformat_free_context(pFormatContext):// 打开失败,释放已分配8 return-1; //4.打印容器的基本信息 //pFormatContext->iformat->name:输入格式的名称(如“mov,mp4,m4a, //pFormatContext->duration:文件总时长,单位是 AV_TIME_BASE(通常员 //pFormatContext->bit_rate:平均码率(比特/秒) logging(*format %s, duration %lld us, bit_rate lld”, pFormat //5.查找流信息 //此函数会读取媒体文件的一部分数据包,以获取更详细的流信息, //例如精确的帧率、编码参数等,并填充 pFormatContext->streams数组。 logging(finding stream info from format"); if (avformat_find_stream_info(pFormatContext,NULL) < θ) { logging("ERRoR could not get the stream info"); avformat_close_input(&pFormatContext);// 出错,关闭已打开的输 return-1; //初始化用于存储视频流信息的变量 AVCodecpCodec=NULL;// 指向找到的视频解码器 AVCodecParameters *pCodecParameters=NULL;// 指向视频流的编码 int video_stream_index = -1;// 视频流在 pFormatContext->streams //6.避历文件中的所有流(pFormatContext->nb_streams是流的总数)

pLocalCodecParameters = pFormatContext->streams[i] ->codecpa //打印当前流的一些时问基和帧率信息(解码器打开前) logging("AvStream->r_frame_rate before open coded %d/%d", p logging("AVStream->start_time %* PRId64, pFormatContext->st logging("AVStream->duration %" PRId64, pFormatContext->stre logging(finding the proper decoder (coDEc)"); AVCodec pLocalCodec = NULL; //根据编码参数中的codec_id查找对应的已注册的解码器 pLocalCodec = avcodec_ find_decoder(pLocalCodecParameters->c if (pLocalCodec==NULL){ logging(“ERRoR unsupported codec for stream %d!", i); continue;//如果找不到解码器或不支持该编码,则跳过此流 //判断流的类型,并保存第一个找到的视颜流的相关信息 if (pLocalCodecParameters ->codec_type == AVMEDIA_TYPE_VIDE0 if(video_stream_index ==-1){// 只处理第—个视频流 video_stream_index=i;// 保存视频流的索引 pCodec=pLocalCodec;//保存视频解码器指针 pCodecParameters =pLocalCodecParameters;// 保存视频流的 logging("Video Codec: resolution %d x %d", pLocalCodecPar } elseif (pLocalCodecParameters->codec_type == AVMEDIA_TYPE logging("Audio Codec: %d channels, sample rate %d", pLoca //打印解码器的长名称、ID和流的码率 logging("\tCodec %s ID %d bit_rate %lld", pLocalCodec->name //检查是否找到了视频流 if (video_stream_index == -1) { logging("File %s does not contain a video strean!", argv[1] avformat_close_input(&pFormatContext); // 清理 return-1; //7.为视频流准备解码器上下文(AVCodecContext) //pCodec是上一步找到的视频解码器 AVCodecContext pCodecContext = avcodec_alloc_context3(pCodec if (!pCodecContext){ logging("failed to allocated memory for AVCodecContext"); avformat_close_input(&pFormatContext); // 清理 return-1; //8.从流的编码参数(pCodecParameters)填充解码器上下文 if (avcodec_parameters_to_context(pCodecContext, pCodecParamete logging("failed to copy codec params to codec context"); avcodec_free_context(&pCodecContext);// 清理 avformat_close_input(&pFormatContext) ; return-1; //9.打开解码器 //使用指定的解码器(pCodec)打开/初始化解码器上下文(pCodecContext) //第三个参数可以传递一些解码器特定的选项(AVDictionary) if (avcodec_open2(pCodecContext, pCodec, NULL) < θ) { logging("failed to open codec through avcodec_open2"); avcodec_free_context(&pCodecContext): // 清理 avformat_close_input(&pFormatContext); return-1; // 16.分配 AVFrame 和 AVPacket 结构体内存 AVFramepFrame =av_frame_alloc();//用于存储解码后的原始视频帧姜 if (!pFrame){ logging("failed to allocate memory for AVFrame); avcodec_free_context(&pCodecContext) ; avformat_close_input(&pFormatContext) ; return-1; 上 AVPacketpPacket=av_packet_alloc():// 用于存储从文件中读取的日 if (!pPacket){ logging("failed to allocate memory for AVPacket*); av_frane_free(&pFrame); avcodec_free_context(&pCodecContext); avformat_close_input(SpFormatContext); return-1; int response=0;// 用于存储 FFmpeg API函数的返回值 //这个变量控制了main函数尝试向decode_packet发送多少个属于视频流的数 //初始值为8,但在实验中可以修改此值(例如改为10,20,56)来观察结果 int how_many_packets_to_process = 8; //11,主解码循环:从文件中读取数据包并进行解码 while (av_read_frame(pFormatContext, pPacket) >= 0){ // 从容器叶 //检查这个包是否属于我们之前确定的视频流 if (pPacket->stream_index == video_stream_index) { logging("AVPacket->pts %" PRId64, pPacket->pts); // 打印包 //调用自定义的解码函数来处理这个包 response = decode_packet(pPacket, pCodecContext, pFrame); if(response<B){//如果解码函数返回了不可恢复的错误 break;//终止主循环 //每当一个视類包被发送给decode_packet 函数(无论是否成功解码出额 // how_many_packets_to_process 计数器减—。 //当处理了指定数量的视频包后,停止从文件读取更多包。 if (--how_many_packets_to_process <= 0) { logging("Processed target number of video packets, stop break; ) //**重要:**释放pPacket引用的数据缓冲区,并将其他字段重置为默认促 //每次av_read_frame 准备读取新的包之前,前一个包必须被unref。 av_packet_unref (pPacket) ; //提示(Flush Decoder): //当所有需的包都已发送给解码器后(或av_read_frame返回文件尾), //解码器内部可能仍有一些缓冲的帧(特别是由于B帧依赖)。 //为了获取这些剩余的帧,应该向解码器发送一个NULL的AVPacket, //这会能发解码器的“flush”(冲洗)模式。 // logging("Flushing decoder by sending NULL packet to decode_p // decode_packet(NULL, pCodecContext,pFrame);// 发送 NULL 包以 //12.释放所有已分配的资源 logging(releasing all the resources); avformat_close_input(&pFormatContext):// 关闭输入文件并释放 AVF: //释放AVPacket结构体 av_frame_free(&pFrame); avcodec_free_context(&pCodecContext):// 释放 AVCodecContext ( return6; //日志函数 staticvoidlogging(constchar fmt,...)( va_list args; fprintf( stderr, "L0G: " ); va_start( args, fmt ); vfprintf( stderr, fnt, args ); va_end( args ); fprintf( stderr, "\n ); { //解码数据包函数 staticintdecode_packet(AVPacket *pPacket, AVCodecContext pCode //步骤1:将压缩的数据包(pPacket)发送给解码器(pCodecContext) //如果pPacket 为NULL,则表示输入流结束,要求解码器输出所有内部缓冲的帧 int response = avcodec_send_packet(pCodecContext, pPacket); if (response <0){ //如果是 AVERROR_EOF 并且是在flush 模式(pPacket为NULL),这是I if (response == AVERROR_EOF && pPacket == NULL) { logging("Decoder flushed (send_packet returned EoF)."); //不需要返回错误,因为接收循环仍可能取出缓冲帧。 }else { Logging(“Error sending packet to decoder: %s, av_err2s ) //对于AVERROR_EOF,也返回它,让接收循环知道输入已结束。 //对于其他错误,直接返回。 return response; //步骤2:循环从解码器接收解码后的帧 //因为一个包可能不会立即产生帧,或者解码器有内部缓冲(特别是B帧), //或者在某些特定情况下(主要是音频),一个包可能产生多个帧。 //因此,avcodec_receive_frane 需要在一个循环中被调用。 while (response >= 6){// 只要上—次的 send_packet 或 receive_fre response = avcodec_receive_frame(pCodecContext, pFrame); // if (response == AVERROR(EAGAIN)) { //AVERROR(EAGAIN)表示:解码器当前没有足够的已解码数据来输出一帧。 //它需要你通过 avcodec_send_packet()发送更多的数据包(如果 pP //如果 pPacket 是NULL(flush模式),则理论上不应轻易出现 EAGAI // logging("Decoder needs more input or no frame availabl break;//退出当前receive_frame循环,等待main函数发送下一个 }elseif (response == AVERROR_EOF) { //AVERROR_EOF表示:输入已经结束(之前通过发送NULLpacket 指示 //并且解码器内部所有缓冲的帧都已经成功取出了。没有更多赖可以接收了。 logging("End of stream reached in decoder, no more frames break;// 退出当前 receive_frame 循环 }elseif (response < θ){ //其他不可恢复的解码错误 logging("Error receiving frame from decoder: %s", av_err2 return response;//将错误码返回给调用者(main 函数) //如果response>=9,说明成功解码并获取到了一帧! )6u66o1 “Frame %d (type=sc, size=%d bytes, format=sd) pts %lld pCodecContext->frame_number,//解码器成功输出的的序号(从 av_get_picture_type_char(pFrame ->pict_type), // 帧类型( pFrame->pkt_size,//生成此帧的原始数据包的大小(仅供参考) pFrame->format,//解码后帧的像素格式(例如 AV_PIX_FMT_YU (longlong)pFrame->pts, //**显示时间(Presentation pFrame->key_frame,//是否是关键帧(1表示是,θ表示否) (longlong)pFrame->pkt_dts // **解码时间戳(Decode Timesta ): char frame_filename[1024]; //使用解码器输出的顿序号(pCodecContext->frame_number)来命名P snprintf(frame_filename, sizeof(frame_filename), "%s-d.pgm //示例视频 smal1_bunny_1080p_60fps.mp4是YUV428P 格式。 //save_gray_frame 函数只保存Y(亮度)分量。 if (pFrame->format != AV_PIX_FMT_YUV42oP) { logging("Warning: frame format is not YUV42eP, PGM might 1 //调用函数将解码后帧的亮度分量保存为PGM图像文件 save_gray_frame (pFrane->data[] , pFrame->linesize[9], pFram //处理完一帧后,通常需要调用av_frame_unref(pFrame)来释放pFram //以便pFrame 结构体可以被下一次 avcodec_receive_frame 调用安全 //此示例中pFrame在main函数中分配并在最后统一释放,依赖于avcod //更安全的做法是在这里unref。 //如果是因为EAGAIN退出的循环,说明当前包已发送,但解码器需要更多包。 //如果是因为E0F或其他原因(如正常解码完当前包能出的所有帧),也表示当前包 //返回0表示与当前输入包相关的解码尝试已完成。 //如果想让上层知道是EAGAIN,可以返回response。这里简化处理。 return (response == AVERROR(EAGAIN) 1l response == AVERROR_EOF) //保存灰度帧为PGMP5文件 staticvoidsave_gray_frame(unsignedchar buf, int wrap, int xsiz FILE f; int i; f=fopen(filename,“wb");//“wb表示以二进制写模式打开文件 if (f == NULL) { Logging("ERRoR: Could not open file %s for writing.", f return: //写入PGMP5格式的文件头: //“P5”表示二进制灰度图 //"%d%d”是图像的宽度和高度 //“d”是最大的灰度值(通常是255,表示8位灰度) fprintf(f, "P5\n%d %d\nd\n", xsize, ysize, 255); //逐行写人像素数据 //buf指向帧数据中亮度分量(Yplane)的起始地址 //wrap(也叫Linesize 或stride)是图像数据中一行的实际字节数,可 for (i = θ; i < ysize; i++) { fwrite(buf+iwrap,1,xsize,f);//每次写人一行的实际 fclose(f);//关闭文件

四、how_many_packets_to_process 与PGM 文件数量的深入理解

实验中修改 0_hello_world.c 中how_many_packets_to_process 的初始值 (例如从B改成10、20、58)。并观察到输出PGM文件数量(即pCodecContext- >frame_number 的最大值)大致为设定的包数减去一个小的固定值(例如N-2), 这个现象揭示了视频解码的内在机制。 .1.how_many_packets_to_process 的角色: 。·它在main 函数中,用于限制调用 decode_packet 函数来处理从指定视频 流中读取到的数据包的次数上限。如果设置为N,那么主循环在处理了N个视频 包后就会停止读取。 .2.为何输出帧数通常略少于处理的包数(尤其在视频开头)一解码器启动延迟和B 帧效应 。·实验中“N个包输出N-X帧”的模式,正是这种解码器启动行为和处理B帧依赖 在视频起始部分的体现。这个“X”不是一个固定的FFmpeg规则,而是特定于测 试视频文件(smalL_bunny_1080p_60fps.mp4)的G0P(图像组)结构、起 始部分的B帧数量和位置,以及0_hello_world.c当前解码逻辑(特别是它没 有在最后显式地调用decode_packet(NULL,...)来冲洗解玛器缓冲)共同 作用下的一个经验结果。对于不同的视频文件或视频的不同片段,这个“X”值可 能会不同。 。·B帧依赖性:B帧的解码需要其前面和后面的参考帧(I帧或P额)。这意味着 解码器必须先接收并解码掉B赖所依赖的那个“未来”的P帧(或I帧),然后才能回 头处理这些B帧。在此期间,即使发送了B赖的包, avcodec_receive_frame()也可能因数据不完整而返 回AVERROR(EAGAIN)。导致这一轮 decode_packet 调用没有保存图像。 码上下文”、“满足间依赖关系”,或者解码出了一些由于PTS顺序靠后(因B帧 重排)而暂时不能立即被pCodecContext->frame_number 计的帧。直到 解码器内部的“流水线“被填满并且依赖关系得到满足,后续的包才能更稳定地产出 对应的帧。 。·解码器“预热”/“填补流水线”:视频解码器(特别是处理像H.264这样包含 帧。 。·观察到的"N-X"模式: .3.帧的“身份"与区分(时间的量要性): 。·pCodecContext->frame_number(解码器输出帧的流水号):解码器成功 输出一帧时内部递增的计数器(从1开始)。0_hello_world.c用它来命名 PGM文件。它代表帧从解码器出来的顺序。 。·pFrame->pts(显示时间戳-Presentation Timestamp):这是最重要 的时间,指示该帧应在视频的哪个时间点被显示。单位是流的时间基 (AVStream->time_base)。PTS的顺序决定了视频的视觉播放顺序。 。·pFrame->pkt_dts(解码时间戳-Decode Timestamp):指示包含此赖 (或其主要部分)的数据包应何时被解码。DTS通常是单调递增的,反映了数据在 原始码流中的顺序。解码器严格按DTS顺序处理包。

五、参数修改建议与应用场景(优化与扩展)

基于对IBP帧和解码流程的理解,可以对这个基础程序进行多种修改以适应不同需 求: .1.精确提取指定数量的输出帧: 。·在decode_packet成功保存一帧后,使用一个外部计数器(例如 在main 中定义并传递指针给decode_packet)来记录实际保存的顿数。当 达到目标数量时,终止main函数的循环。 。·关键:在main循环结束后(无论是正常完成还是因达到帧数限制而中 断),务必调用 decode_packet(NULL,pCodecContext,pFrame);来 发送一个NULL包给解码器,以“冲洗”(flush)解码器内部缓冲的所有剩余帧。 这样可以确保得到所有应该输出的赖,特别是视频尾部的帧。 .2.提取指定时间范围/特定时间点的帧(用于缩略图、预览等): o·计算目标时间(如視频总时长的38%)对应的int64_ttarget_pts(注意 从秒转换为流的时问基单位)。 。·使用av_seek_frame(pFormatContext,video_stream_index, target_pts, AVSEEK FLAG BACKWARD); 定位到 target_pts 之前最近 的关键帧。 重要:av_seek_frame之后,必须调 用avcodec_flush_buffers(pCodecContext):来清空解码器内部的陈旧 状态和缓冲数据。 。·然后,循环调用av_read_frame和decode_packet。 在decode_packet 中,当 avcodec_receive_frame 成功获取一后, 比较 pFrame->pts 与target_pts。当找到第-个 pFrame->pts >= target_pts 的帧时,保存它,然后可以停止这个时间点的提取。 。·应用:批量缩略图生成器、视频预览条的帧提取。 .3.保存为彩色图像(PPMP6)或常用格式(JPEG/PNG): 。·彩色PPM(P6格式): 。·JPEG/PNG:需要将解码后的AVFrame 再次通过Libavcodec进行图像 编码(使用MJPEG或PNG编码器),得到包含图像数据的AVPacket,然后将该 包数据写入文件。 。·应用:生成高质量的彩色缩略图。

1.1.将解码后的AVFrame(通常是YUV格式)使用Libswscale 库转换

为AV_PIX_FMT_RGB24 格式。

2.2.修改 save_gray_frame 为 save_rgb_ppm_frame,写入PPM P6头

("P6\n%d%d\n255\n"),然后写入RGB数据。

4.视频内容基础分析:

o·解码视频帧后,访问AVFrame->data(Y,U,V分量的像素数据)进行计 算,如平均亮度、帧间差异等。 。·应用:视频质量自动化检测、内容标记辅助。 通过不断地实践、修改代码、观察结果,并对照FFmpeg官方文档深入理解每个API 函数的行为,就能真正掌握FFmpeg编程的精髓。 ffmpeg·目录三 下一篇·FFmpeg深度学习笔记(二):Remuxing(转封装)的艺术-2_remuxing.C...> 作者提示:个人观点,仅供参考

原始排版图

FFmpeg 核心概念与 0_hello_world.c 示例深度解析 系列一:微信公众号导出原始排版图

FFmpeg 深度学习笔记 (二):Remuxing (转封装) 的艺术 - 2_remuxing.c 详解

· 閱讀時間約 19 分鐘
w0x7ce
MySelf

发布于 2025-05-17 17:17:21(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 11225 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

FFmpeg深度学习笔记(二):Remuxing(转封装)的艺术- 2_remuxing.c详解 original we×x7ce EI V1ajero 2825年5月17日 17:17 日本 在上一篇笔记中,我们通过 e_hello_world.c学习了FFmpegLibav库的基础解码流程和媒体信 息获取。现在,我们将进入下一个重要主题:Remuxing(转封装)。 Remuxing是一种在不重新编码音视频内容的前提下,改变其容器格 式的强大技术,它快速且能保持原始质量。本篇将以Leandromoreira/ffn peg-Libav-tutorial项目中的2_renuxing.c为例,深入探讨其背后的理 论、应用场景、FFmpegAPI的使用方法,并详细解析主流容器格式 的特性及Remuxing的无损本质。

一、Remuxing(转封装)核心理论与原理

要造彻理解Remuxing,首先需要明确媒体文件的基本构成及其与编码、封装的关系。

1.1媒体文件的构成:数据流(ELementaryStreams)与容器(Container

Format) 由两部分组成:

1.数据流(ELementary Streams -ES):

  • 这些是纯粹的、经过特定编解码器(如H.264视频、AAC音)编码(压缩)后的音

视频数据,例如,H.264视频流就是一连电按照H.264标准压缩的图像数据:AAC 音频流就是一连事AAC编码的音频数据。

  • 致据流本身只包含原始的压继信息,通常不包含直接插放所需的全部同步和元数据信息。

?.容器格式(Container Format):

  • 组织与复用(Multiplexing-Huxing):将一个或多个数据流(视频流、一个或多

个音频流、字幕流、章节信息等)按照特定的规则打包、交织进一个单一的文件中。

  • 元数据(Metadata):存储关于整个文件和内部各个流的描述性信息。这可以包括标

题、作者、专辑封面、视频的分辨率、帧率、音频的采样率、声道数、字幕语言、章节标 记等等。

  • 同步(Synchronization):提供精确的时间醛信易,主要是PTS(Presentation

Timestamp-显示时间戳)和 DTS(Decode Timestamp-解码时间戳)。PTS 指示一个数据单元(如一帧视频或一段音频)应该在何时呈现给用户(播放)。DTS指 示一个压缩的数据包应该在何时被解码器解码。对于包含B帧的视频,DTS和PTS的顺 序可能不同。容器格式负责存储这些时间数,握放器则依据它们来确保音视频同步和流畅 推放。

  • 索引(Indexing)(可选):某些容器格式会包含索引信息(例如,关键帧的位置列

表)。这使得播放器能够快速定位(seek}到文件的任意时间点,而不需要从头扫描整 个文件。

  • 可以将其比作媒体文件的“包装盒"或"信封"(例如.np4,.nkV,-t5,fL

V)。容器并不关心里面装的“货物”(音视频数据)具体是什么编码(只要它支持这种编 码类型),它的主要职责是;

1.2到底什么是Remuxing(转封装)?

L.定义:Remuxing是一个过程,它在完全不改变内部数据流(即音视频的编玛数据本身, 例如H.264的比特流、AAC的比特流)的前提下,将这些数据流从一种容器格式中“拆 解”出来,然后再“封装“到另一种新的容器格式中。 ?,改变的是什么:

  • 客器本身的结构和组织方式(例如,MP4的aton/box结构与TS的固定包结构完全

不同)。

  • 元效据的存储和表示方法。

之-).

  • 文件头(Header)和文件尾(Trailer)的特定信息。

  • 可能的索引方式

3.不变的是什么:

  • 视频流的编码格式(如H.264,HEVC,VP9)及其底层的压缩比特流数据。

  • 音频流的编码格式(如AAC,MP3,Opus)及其底层的压缩比特流效据。

  • 字幕流(如果是基于文本的,如SRT,ASS)的内容本是。

  • 核心结论:因此,Renuxing对音视频的画质和音质理论上是完全无损的。

1.3Remuxing vs.Transcoding(转码/压缩)-关键区别十

理解 Remuxing 和 Transcoding 的区别至关重要:

  • Remuxing(转封装):

  • 操作对象:容器格式

  • 音视频数据:不解码,不重新编码。编码数据被原样复制

  • 质量损失:无损(针对音视频编码数据本身)。

  • 速度:非常快,主要受限于磁盘I/0.

  • 目的:改变文件“外壳”以适应不同播放环境或需求,不改变“内容”的编码。

  • Transcoding(转码):

  • 如果目标编码是有损压缩(如H.264,HEVC,AAC,MP3),几乎总是会伴随质量损

失,每次有损压缩都会为了减小体积而牺牲一部分信息。

  • 如果目标编码是无损压缩(如FLAC音频,FFV1视频),则相对于解码后的原始数据

是无损的,但无法恢复源文件在有损压缩时已丢失的信息。

  • 操作对象:音视频流的编码格式或编码参数(如码率、分辨率、躺率)。

  • 音视频数据:通常需要先解码成原始数据,然后用新的编码格式或参数量新编码。

  • 质量损失:

  • 速度:通常非常慢,因为编解码是计算密集型操作。

  • 目的:改变音视频”内容"的编钙方式,以减小体积、提高压缩率、薰容特定设备(该设

备不支持源编码格式)或改变媒体属性。 简单来说:Remuxing是给书换个封皮,书的内容不变;Transcoding(有损压缩时)像是 把书的内容重写一遍并进行删减概括,内容会发生变化(通常是信息量的减少)。

1.4Remuxing的核心操作原理(基于Libavformat)

FFnpeg的Lilbavfornat库处理Remuxing的过程可以概括为以下几个步骤,这正是2 remuxing.c所澳示的: L.解封装(Denuxing)输入端:

  • 通过avfornat open input(1打开输入的媒体文件,FFmpeg 会自动识别其容器格

  • 调用avfornat_find_strcan_info()读取文件头部和一部分数据,以获取文件中所有

流的详细信息。此步骤会填充每个输入流的AVCodecParameters结构体,该结构体描 述了流是如何被编码的。

2.配置输出端:

■调用avfornat_ncw_strean()在输出AVFornatContext中创建一个对应的新流。 【至关量要的一步】调用avcodec_paraneters_copy()将输入流的AVCodecParom eters完整地复制到新创建的输出流的AvCodecParaneters 中。因为 Renuxing 不改变编码,所以这份推述对于输出流来说仍然是准确的。它告诉新的封装器(muxer) 即将写入的数据包具有何种编码特性。

  • 使用avfornat_allac_autput_contextz(1根据用户提供的输出文件名(通过其扩展

名推断)或直接指定的格式名称,来分配并初始化一个用于输出的AVFormatContex t。

  • 遍历输入AVFarnatContext中的每一个流。如果决定要将某个输入流复制到输出文

件:

3.写入输出文件头:

  • 如果输出格式需要一个物理文件(绝大多数情况如此),则调用av1o_openI)来打开

指定的输出文件并准备写入。这会将一个AVICContext(I/O上下文)关联到输出 VFormatContext 的 pb (Packet Buffer)成员。

  • 调用avfornat_write_header》将输出容器的头部信息写入文件。此时,所有流

的AVcodecParaneters必须已经设置完毕。如果需要为 muxer 设置特定选项(例 如,为MP4设置movflag5以生成分段MP4),这些选项会在此函数误用时传递给 nuxer。

1.逐包复制与时间戳调整(核心循环):

  • 一个AVPacket包含PTS(显示时间截),DTS(解码时间戳)和 duration(时

长)等时间信息。这些值是以其所在流的时间基(AVStrean->tine_base,一个分数, 如1/90806表示时间单位是1/9008秒)来表示的。 ■输入流的时间基和输出流的时间基可能不同。

  • 因此,在将包写入输出流之前,必震使用av_rescale_q_rnd(1或av_rescale_q

[)函数,将包的 PTS,DTS 和 duration 从输人流的时间基精确地转换(或“缩 放”)到输出流的时间基。如果忽略这一步,将导致输出文件播故时速度异常、音视颜不 同步等严量问题。

  • 在一个循环中,反复调用av_rcad_franc)从输人AVFommatContcxt中读取一

个AVPacket。这个包包含了某个流的一小段压缩数据及其原始时间戳。

  • 检查这个包所属的流是否是我们需要复制的流,

  • 【极其关键的技术点】时间戳量计算(TinestampRescaling):

  • 通常将packet.pDs(包在源文件中的物理位置信息)设为-1。

  • 调用av_interleaved write_frane)将调整好时间的AVPacket写入输出AV

FormatContcxt。此函数会负责根据输出容器的要求,正确地交织来自不同流的数据 包。

  • 调用av_packet_unref4)释放当前包所引用的数据缓冲区。

5.写入输出文件尾:

  • 当所有数据包都从输入读取并写入辅出后,调用av_uritetrailer(》。这个函数会写

入输出容器格式所要求的任何尾部信息(例如索引表、文件校验和等)。

二、Remuxing的需求与原因:为什么要转封装?何时使用?

A.核心忧势回题:1.速度极快。2.质量无损(针对音视频编码数据)。 B.主要应用场景与原因分析: l.解决播放/编辑盖容性问题(CompatibiLity):

  • 原因:不同设备、软件或服务器对容器格式的支持各异。

  • 场景示例:MKV转MP4(用于移动设备),MTS转MP4(用于编辑软件)。

2.满足特定功能或特性需求(Feature Support):

  • 原因:不同容器对多音轨、多字幕、章节、元数据等特性的支持程度不同。

  • 场景示例:MP4转MKV以添加ASS特效字幕和多语言评论普轨

3.适应流媒体传输协议的要求(Streaming ProtocolRequirements):

  • 原因:HLS、DASH等流媒体技术对媒体段的容器格式有特定要求。

  • 场景示例:将完整MP4 转为 HLS的,t5段或DASH/fMP4 HLS 的分段MP4(

m4s )。2_renuxing.c 中的 fragniented_mp4_options 即为此服务。

1.优化文件结构或修复轻微损坏(Optimization/Repair):

  • 原因:MP4的noavatom在尾部不利于网络流握“快速启动";文件索引可能损

  • 场景示例:Renuxing MP4将moovatom 移到文件头部;尝试通过renuxing

修复损坏的索引。 .去除不需要的流(Strean Stripping/ Selective Copying):

  • 原因:文件中包含多种语言的音轨、字幕等,实际只需一部分。

  • 场景示例:Remuxing时只选择需要的流,减小文件体积。

i.合并或分割媒体文件(Concatenating/SpLitting):

  • 原因:便于管理、分享或后续处理。

  • 场景示例:将多个编码参数相同的视颜片段合并;将长视频分割核心操作仍基于包复

制和时间酸调整。

三、2_remuxing.c代码逻辑详解

以下是对2_reuxing.c核心代码段落的分析和解释: //based on https:/ fapeg-org/doxygen/ Lrunk/remuxing_8c-example.htm #include <libavutil/timestanp.hx include<libavfornat/avtormat.h>// 包含了格式处理的核心API int main(int argc, char **argv) ( AVFormatContext *1nput_fornat_context = NULL, *output_fornat_cont: AVPacket packet; const char *in_filenane, out_filename; int ret, 1; int *streans_list = NULL; 1nt number_of_streams = 0; int fragmented_mp4 options = B; /11.解析命令行餐数 if (argc < 3) { printf(*You need to pass at least tuo pareneters.\nusage: %5 return -1; } else if (argc == 4 && strcnp(argv[3]。 *fragnented") == θ) { fragnented_np4_options = 1; printf(Fragmented MP4 options enabled \n); in_filenane = argv[1];

112.打开轴入文件并获取流信息

1f ((ret = avfornat_open_input(&input_fornat_context, 1n_filename fprintf(stderr, “Could not open input file &s': es\n, in_fi gota end; If({ret = avfornat_find_strean_info(input_format_context, NULL)) fprintf(stderr, "Failed to retrieve input stream infornation: goto end; // av_dunp_format(input_format_context, o, in_filenane, θ); //3.为输出文件分配 AVFormatContext avformat_alloc_output_contextz(5output_fornat_context, NULL, NULL 1f (!output_fornat_context){ fprintf(stderr, “Could not create output contextyn*); ret = AVERDR_UNKNOWN; goto end; 1/4.流的映射与创建 number_of_streans = input_fornat_context->nb_streams; streans_list = av_mallocz_array (nurher_of_streans, sizeof(*streas 1f (1streans_list){ ret = AVERRDR[ENOMEN); goto end; pua p↓6 for (i = θ; i < input_format_context->nb_streans; i++) { AVStrean *out_stream; AVStrean *in_strean = input_format_context->streams[il; AVCodecParancters *in_codecpar = in_stream->codecpar;

In_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) { streans_list[i] = -1; continuc; streans_list[i] = stream_index++: out_strean = avformat_new_stream(output_format_context, NULL) if (!out_stream) { fprintf(stderr, Failed allocating output strean\n); ret = AVERROR_UNKNONN; :pua ojo6

  • 核心:复制编解码参数

ret = avcodec_parameters copy{out _strean->codecpar, in_codecp- if (ret < ){ fprintf(stderr, *Falled to copy codec parameters: as\n", :pua ojo6 out_strean->codecpar->codec_tag = 0; // av_dunp_format(output_formot_context, 0, out_filenane, 1); //5.打开输出文件I0 if (1(output_fornat_context->oformat->flags & AVFMT_NOFILE)) { ret = avio_open(&output_format_context->pb, out_fiLenane, AVI if (ret < ){ fprintf(stderr, *Could not open output file *5s": %s\n", goto end;

116.设置Muxer特定进项并写人输出文件头

AVDictionary* opts = NULL; 1f (fragnented_np4_options) { av_dict_set(sopts, *novflags", "frag_keyframe+empty_moov+defa ret - avfornat_write_header(output_format_context, &opts); if (ret < θ) { fprintf(stderr, "Errar occurred when opening output file or w qoto end; } av_dict_free(&opts) ; //7.Renuxing核心循环:读取包->调整时衍露->写人包 while (1){ AVStrean *in_strean, *out_stream; ret = av_read_frame(input_format_context, &packet); if (ret < B) break; in_strean = input_format_context->streans [packet.strean_inde: if (packet.stream_index >= mumber_of_streams I| streans_1list[ av_packet_unref(6packet); continue; packet.strean_index = streans_list[packet.stream_index]; L 1 : ut_strean = output_fornat_context ->streans [packet ,stream_ind

  • 核心:时问数转换*

packet -pts = av_rescale_q_rnd(packet -pts, in_stream->tine_bas packet.duratlon = av_rescale_q(packet.duration, in_strean->t11 . 2 ] packet.pos = -1; ret = av_lnterleaved_write_frame(output_format_context, &pack if (ret < ){ fprintf(stderr, *Error muxing packet: %s'n", av_errzstr(n break; av_packet_unref (6packet); 写入轴出文件尾 8/ av_write_traller(output_tornat_context); cnd : 1f (input_fornat_context) avformat_close_input(&input_format_cont: avio_closcp(&output_format_context->pb); 1f (output_fornat_context) avfonmat_free_context(output_fornat_co

1.3 9

if (streans_list) av_freep(&streams_list); 1f (ret < 0 66 ret != AVERROR_EOF) { fprintf(stderr, Error occurred: ss\n, av_err2str(ret)); return 1; printf( Renuxing completed successfully-\n); return 8;

四、主流容器格式特性详解

理解各种容器的特性,有助于我们决定何时需要将一种格式RemuX到另一种。 A.MP4(MPEG-4 Part 14)*文件扩展名:m04,.n4a(纯音频),n4v(视频),.mov (QuickTime 格式,MP4 的重要基础)*结构:基于 IS0 Base Media File Format [ISOBMFF),由“aton”或“box”组成(ftyP,moov 存元数据和索引l,mdat 存媒体致 据)。*优点:兼容性极佳、流媒体友好(特别是fMP4和moov在头部的“fast start” MP4)、特性支持良好(章节、字幕、多种编码)、高度标准化。*献点:高级字幕支持不如 MKV:ncov在尾部不利于流播,*典型应用:Web视频、移动设备视频、视频点播、 DASH/HLS fMP4 流媒体、数字发行。 B.TS(MPEG Transport Stream)文件扩展名:ts,-tsv,.tsa,.m2ts(蓝光) 结构:固定长度(188字节)的TS包,每个包有PID区分流。PAT/PMT表描述节目和 流。*优点:强大的错误恢复能力、为流式传输设计(直播/广播)、支持多节目。*缺点:封 装开销较大、文件seek不便、元数据支持有限、*典型应用:数字电视广播、早期HLS、蓝 光 C.MKV(Matroska Video)文件扩展名:.nkv(视频),.nka (纯音疑),.nks(字慕) 结构:基于EBML(类似XML的二进制语言),高度可扩展。主要元素Scgnent(含ScekH d,Info,Tracks,Chapters,Cues,Cluster)。*优点:极致灵活开放(可封装几平任 何流),特性支持强大(多字幕轨、多音轨、章节、刚件、精确时间致、错误检测),开源。 缺点:薰容性不如MP4广泛(尤其非PC设备):直接大规模流媒体应用不如fMP4。*典型 应用:高清电影存储分享(多语言/字幕)、个人媒体库。 (音、视频、脚本数据)。*优点:曾为网络流式传输设计良好(配合RTMP),封装开销较 小。*缺点:技术逐渐过时(Flash淘汰),编码器支持有限,特性支持少。*典型应 用:历史遗留内容、部分仍在使用的RTMP推流场景。

五、关于Remuxing无损转换的进一步探讨

L.音视频编码数据的无损性:正如之前强调的,Remuxing的核心在于不解码也不重新编码 音视频数据流本身。这意味着视频帧的压缩数据(如H.264比特流)和音频样本的压缩数据 (如AAC比特流)被原封不动地从旧容器“搬运"到新容器。因此,就音视频内容的感知质量 和编码精度而言,Remuxing是无损的。 ?.“反复转换不丢失精度”的理解:

  • 基于上述无损原理,理论上,如果目标容器支持源容器中的所有音视频编码格式,那么可

以反复在这些容器之间进行Remuxing(例如MP4<->MKV<->TS),核心音视频 数据不会因为容器的改变而发生质量下降或编码精度丢失。

3.需要注意的细微之处(潜在的“非完全字节等同"):虽然核心音视频数据无损,但在反复转

换或在特性差异较大的容器间转换时,以下方面可能会引入微小变化,导致最终文件与原始 文件在字节层面上不完全相同,尽管播放效果和核心数据质量一致:

  • 元数据(Metadata):不同容器对元数据(标题、作者、章节、封面等)的支持范围

和存储方式不同。从特性丰富的容器转到特性较少的容器时,无法表示的元数据可能会丢 失。即使是相同元数据,在不同容器间的表示也可能需要适配,导致字节差异。丢失的元 数据在转回原格式时无法恢复。

  • 字幕(SubtitLes):文本字幕(SRT,ASS)通常能良好保留。但对于ASS/SSA

特效字幕,MKV支持完美,MP4支持有限,转换可能导致样式信息丢失或改变。

  • 时间戳精度与时间基(TimestampPrecisionandTimebase):FFmpeg会尽力

精确转换时间戳。但如果时间基差异悬殊且进行极多次转换,理论上极微小的浮点舍入误 差可能累积。实际几次转换中,这通常可忽略,不影响同步或感知质量。

  • 容器特定特性(Container-SpecificFeatures):某些容器独有的底层特性或标

志位,在其他容器中无对应物,转换时会丢失。

  • Muxer(封装器)的行为差异:FFmpeg中每种容器格式的muxer在写入文件时,

可能有其默认行为或优化策略(如数据包交织方式、文件头可选字段默认值)。这可能导 致即使核心数据相同,多次往返转换后的文件在字节上也不完全一致。

1.总结与实际建议:

  • 对于音视频内容的质量和编码精度:Remuxing是无损的。

  • 对于文件的“绝对字节同一性”:不能保证。若此为硬性要求,需谨慎。

  • 元数据:依赖特定高级元数据时,转换到支持较弱的容器需注意信息丢失风险。

  • 结论:对于绝大多数为了兼容性或功能需求而改变容器格式的场景,Remuxing都是快

速、安全且在音视频质量上无损的理想选择。

六、2_remuxing.c的学习意义与拓展方向

2_remuxing.c不仅演示了如何改变文件的“外壳”,更重要的是,它揭示了Libavforma t在处理输入(demuxing)和输出(muxing)时的对称性与通用性。通过此示例,可以深 刻理解:

  • AVCodecParameters在不解码情况下描述数据流本质的核心作用。

  • 时间戳处理(特别是时间基转换)在Remuxing中的绝对重要性。

  • 如何通过AVDictionary向Muxer传递特定选项以微调输出容器行为。

基于此示例的拓展方向: L.选择性Remuxing:修改streams_List的逻辑,允许用户通过命令行参数指定要保留 哪些类型的流(例如,只保留视频和英文音轨)。

2.元数据编辑:在avformat_write_header之前,修改output_format_context->met

adata或各个output_stream->metadata来添加、删除或修改文件的全局或流元数据。

3.简单的流剪辑(基于关键帧):结合av_seek_frame定位到起始和结束的关键帧,然后

只复制这两个关键帧之间的包。

1.Remuxing网络流:将输入文件名in_filename替换为网络流地址(如rtm

p://...,http://...),实现网络流的录制或转封装;或将输出out_filename配置 为网络推流地址。 通过对2_remuxing.c的学习和实践,为后续更复杂的FFmpeg操作,如Transcoding (转码)和Filter(滤镜处理),打下了坚实的基础。

ffmpeg·目录三 <上一篇 下一篇> FFmpeg深度学习笔记(三): 示例深度解析系列一 Transcoding(转码)的艺术与实践- 作者提示:个人观点,仅供参考

原始排版图

FFmpeg 深度学习笔记 (二):Remuxing (转封装) 的艺术 - 2_remuxing.c 详解:微信公众号导出原始排版图

走遍西班牙第二册-第三单元《¿Alguna vez has conocido a algún famoso?》Ámbito 1

· 閱讀時間約 29 分鐘
w0x7ce
MySelf

发布于 2025-04-29 23:02:52(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 21885 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

走遍西班牙第二册-第三单元《Algunavezhasconocidoa algun famoso?> Ambito 1 oriqinel v8x7ce EI V1ajero2825年4月29日 23:03美国 Anbito 1: Ha sido un dia estupendo I.核心词汇详解(VocabularioClave Detallado)

1.职业与工作地点(Profesiones y Lugares de Trabajo) @

  • Profesiones (职业):

arquitecto/a (m./f.) -建筑师 (Ej: El arquitecto ha disenado un edificio moderno。(这位理筑师设计了一座现代化的理筑。)) e/opefoqe = (m./f.) - 律师 (Ej: La abogada defendi6 a su cliente ayer. (女律师炸 天为地的客户排护了。)

  • juez/jueza

(m./f.) - 法官 (Ej: El juez dict6 sentencia la semana pasada. (法官上 周宣判了。1)

  • policia

(m./f.) - 警察 (Ej: Un policia me ha puesto una multa esta manana。(一位警景今天早上给我开了一张罚单。)) profesor/a (n./f.)-老师(Ej:El profesor explic6 la leccion ayer. (老师昨天讲解 了课文。)) carpintero/a (m./f.)-木匠 (Ej: El carpintero hizo esta mesa de madera. (木匠做了 这张木桌,1) medico/a (m./f.) - 医生 (Ej: Ayer fui al medico porque no me sentia bien. (r乍 天我去看了医生因为我感觉不舒服。)) enfermero/a (m./f.) - 护士 (Ej: La enfermera ha tenido guardia esta noche. (护士 今晚值过班了。))

  • futbolista

(n./f.)-足球运动员(Ej:Ese futbolista marco tres goles el domingo pasada.(那个足球运动员上周日进了三个球。))

  • periodista

(m./f.) - 记害 (Ej: La periodista ha escrito un articulo sobre el eventa.(女记者写了一赢关于这个事件的文章。)) farmaceutico/a (m./f.)-药剂师(Ej: Compre la medicina que me recet6el farmacéutico.(我买了药剂师给我开的药。)) telefonista (m./f.)- 接线员 (Ej: La telefonista ha atendido muchas llamadas hoy.(接线员今天接了很多电话。))

  • dependiente/a

(m./f.)- 售货员(Ej: El dependiente me ayudo a encontrar mi talla.(售货员帮我找到了我的尺码。))

  • panadero/a

(m./f.) - 面包师 (Ej: El panadero ha hecho pan fresco esta maiana。(面包师今天早上做了新鲜面包。))

  • bombero/a

(m./f.)-消防员(Ej: Los bomberos apagaron elincendio rapidamente。(消防员们迅运扑灭了火灾。))

  • actor/actriz

(m./f.)-演员(Ej:Esa actriz ha ganado muchos premios.(那位女演员赢 得了许多奖项。))

  • pintor(a)

(m./f.) - 面家 (Ej: Picasso fue un pintor espaniol muy fanoso. (毕加案 是一位非常著名的西班牙面家。1》

  • guitarrista

(m./f.) - 吉他手 (Ej: Paco de Lucia fue un guitarrista flamenco genial。(轴科·德卢西亚是一位天才的弗拉门戈吉他手。))

  • personaje (fanoso)

(m.)-(老名)人物(Ej: Has visto alguna vez a un personaje famoso?(你曾经见过名人吗?))

  • Lugares de Trabajo (工作地点):

comisarfa (f.) -黑蔡局 (Ej: Tuvimos que 1r a la comisaria para denunciar el robo.(我们不得不去警察局报失窃案。))

  • hospital

(m.) -医院 [Ej: Mi abuelo estuvo 1ngresado en el hospital la semana pasada。(我答爷上周在医院住院了。))

  • juzgado

(m.)-法院[Ej:Los abogados se reunieron en el juzgado.(津陆们在法 院见了面。1} carpinteria (f.) - 木工房 (Ej: El carpintero pas6 todo el (fa en lacarpinteria.(木匠在木工房里待了一整天。)) escuela (f.) 学校 [Ej: M1 priner trabajo fue en una escuela prinaria. (我 的第一份工作是在一所小学。1) estudio (m.)-工作至,办公室,录吾糖(Ej:EL fot6grafo ha montado un nuevo estudio.(摄影师搭建了一个新工作室。)) estadio {m.)-体育场(Ej:Ayer hubo un conc1erto enel estadio.(昨天体育场有 场音乐会。)) redaccion (f.) - 编辑部 (Ej: Los periodistas trabajaron hasta tarde en laredacci6n.(记者们在编辑部工作到很现。)) farmacia (f.)- 药店 [Ej: Has comprado las mericinas en la farmacia? (你在药 店买药了吗?})

  • despacho (de abogados)

(m.)-办公室(律师事务所)(Ej:La reun16n fue en el despacho del director。(会议在主任的办公室进行。))

  • oficina

(f.)-办公室(Ej:He dejado mis gafas en la oficina.(我肥限镜落在办公 室了。))

  • centralita

(f.)- 总机房 (Ej: La telefonista trabaj6 en la centralita del hotel。(按线员在酒店的总机房工作。)) comercio (m.)-商业;育店(Ej:El comercio electronico ha crecido mucho. (电 子商务发展迅速。)/Hay mucho comercio en esta calle.(这条街上面业很 华1} t1enda (f.)-商店[Ej:Ayer compréropa en esa tienda.(昨天我在邢家商店买了 衣服。))

  • panaderia

(f.) - 面包店 (Ej: Esta mafiana he comprado pan en la panaderia de la esquina。(今天早上我在街角面包店买了面包。)) parque de bonberos (m.) -浙防站 (Ej: El cami6n sali6 del parque de bomberos con la sirena puesta。(消防车鸡着墨笛驶出了消防站。))

  • televis16n

(f.)-电视台;电视(Ej:ELla ha trabajado muchos anos en television.(绝在电视台工作了很多年。)/Qué has visto hoy en la television?(你今天在电视上看了什么?))

  • escenario

(m.)- 台 [Ej: Los actores salieron al escenario para saludar. (滨 员们走上提台谢幂。1}

  • biblioteca

(f.)-图书管(Ej:He devuelto Los Libros a la biblioteca.(我已经把书 还到图书馆了。)

  • hamburgueseria

(f.)—汉堡店(Ej:Comimos en una hanburgueseria cerca del cine.(我 们在电影院附近的一家汉堡店吃了饭。))

  • hipermercado

(m.)- 大型超市 (Ej: Hicimos la compra semanal en el hipermercado.(我们在大型超市进行了每周采购。))

  • auditorio

(m.)-礼堂,會乐厅(Ej:EL concierto fue en elauditorio nacional.(音乐会在国家音乐厅举行。))

2.动作、事件与经历(Acciones,Eventos y Experiencias)s

  • Verbos CLave(核心动词):(注意结合过去时态)

terminar

  • 完成(Ej:Por fin he terminado este proyecto tan largo.(我终于完成

了这个湿长的项目。11

  • tener

  • 有(Ej:Tuve un exanen muy dificil ayer.(昨天我有一个很难的考试。))

Jouod

  • 放;开具;穿上(Ej:Donde pusiste las llaves anoche?(你昨晚肥钥匙放

感儿了?))

  • explicar

(-qu-) - 解释 (Ej: El guia nos explico la historia del monumento.(导游给我们讲解了纪念碑的历史。))

  • hacer

  • ,制作(Ej:Mi madre ha hecho mi comida favorita.(我妈妈做了我最爱

吃的菜。))

  • desayunar / coner / cenar

  • 吃早/午/晚餐(Ej:Hoy he desayunado frutay yogur。(今天我早餐吃了水果

和酸奶。)/Ayer cenanos pizza.(昨天裁们晚饭吃了披萨。))

  • preparar

  • 准备(Ej:He preparado La maleta para el viaje.(我已经为旅行准备好了

行李输。1)

  • ir (a)

  • 去(Ej:Has ido al supermercado esta semana?(这网你去超市了吗?))

  • rec1b1r

收到,摇待(Ej:Recibf tu mensaje ayer。(我咋天收到了你的消息。))

  • leer

  • 阅读(E}:Anoche lef un capftulo el l1bro.(昨晚我误了书的个章

节。>) jugar (a) {-gu-)玩(Ej:De n1no, jugue mucho al fotbol.(小时候,我经常馬足 球1)

  • perder(se)

  • 丢失;谜路(Ej:He perdido el autobis de las ocho.(我错过了八点的公

交车。)/ Se perdi6 volviendo a casa.(他回家时述路了。)) romper

  • 打破(Ej:Quien ha roto La ventana?(追打破了窗户?))

ver

  • 看见(Ej:Visteel partido anoche?(你昨晓看比赛了鸣?})

  • participar (en)

  • 参加 (Ej: Participe en un concurso de cocina el anio pasado. (我去年

参加了一个烹饪比赛。)

  • escribir

  • 写{Ej:He escrito una postalα mis abuelos.(我给祖父母写了—张明信

片。>)

  • ganar

  • 赢得(Ej:Nuestro equipo ganolaliga.(我们的队伍赢得了联赛冠军。))

  • publ1car

{-qu-)-出版(Ej: Este autor ha publicado varias novelas.(这位作愈 已经出版了好几本小说。))

  • p1ntar

给画(Ej:Mi hija pint6 este cuadro en la escuela.(我女儿在学校画了 这幅画。))

  • obtener

获得(Ej:Obtuvo elprimer prenio enel concurso.(他在竞赛中获得了- 等奖。)) esculp1r 刻(Ej:El artista esculpi6 la estatua en marmol.(艺术家用大理石 随刻了这尊难像。)) conocer(se) {-zc-)-认识;相识(Ej:Has conocido a mi hernano?(你认识我哥要吗?) / Nos conocinos en la umiversidad.(我们在大学认识的.)) casarse 结(Ej:Se casaron en una cerenonla muy bonita.(他们在一次非常美好 的仪式上结了婚。1)

  • grabar

录制(Ej:La banda ha grabado un nuevo (1sco,(这个乐队录制了一张新唱 片。}1

  • nacer

{-zc-) 出生(Ej:M1 sobrina naci6 la senana pasada.(我佳文/外然女上 周出生了。11 morir 死亡(Ej:El famoso actor muri6 ayer a los 88 anos.(那位著名须员昨 天去世了,享年89岁。1) trasladarse 短迁(Ej:Nos hemos trasladado a una casa mss grande.(我们已经型到 了一个更大的房子。1)

  • rodar

拍摄(电影) (Ej: El director rod6 su ittima pelfcula en Espaffa. (导 须在西班牙拍摄了他的最后一部电影。1}

  • dirigir

(-j-) - 导茨 (Ej: Pedro Almod6var ha dirigido muchas peliculas exitosas。(佩德罗·阿莫多瓦导演了很多成功的电影。)) estrenar

  • 首肤 (Ej:Ayer se estren6 la pelfcula més esperada del ano. (昨天年

座最受翻待的电影首缺了。1) componer 创作(Ej:Beethoven compuso nueve s1nfonfas.(贝多芬创作了九部交前 曲。1) construir {y)建适 [Ej:Los ronanos construyeron este acueducto.(罗马人建造了 这座引水摄。}} producir (-1-) 生产,制f作 (Ej: Esta fabr1ca ha producido n1les de coches este ano。(这家工厂今年生产了数干辑汽车。)) exponer 展出 (Ej: El musea expuso obras de artistas locales. (w物t馆展出了本 地芝术家的作品。)) introducir (-j-) - 引li (Ej: Los espanoles introdujeron el caballo en América。(西班牙人将马引进了美洲。)) buscar {-qu-) 寻找 (Ej: Busque 1nfornac16n en 1nternet, pero no encontré nada.(我在网上找了信息,但什么也没找到。)) escuchar

  • 昕 (Ej: Esta manana he escuchado un podcast 1nteresante. (今天早上

我听了一个有超的播客。))

  • pasear

  • 款步 (Ej:Ayer paseanos por el parque durante haras. (昨天我们在公园

敏步了好几个小时。11 cortarse (el pelo)

  • 剪(头发)(Ej:Me he cortado el pelo muy corto.[我把头发剪得很短。))

recordar

  • 记得(Ej:No recuerdo donde puse mis gafas.(我不记得我把眼镜放哪儿

了. >) contar

  • 讲述(Ej: Mi abuelo nos cont6 historias de su juventud.(载节爷给载

们讲了他年轻时的故事。))

  • ocurrir

  • 发生(Ej:Que ha ocurrido aqui? Hay mucha policia.(这里发生什么

了?有很多警察。)) realizar {-c-)- 进行, 实现(Ej: La empresa realizo un estudio de mercado.(公 司进行了一项市场调研。)) coincidir

  • —致,吻合(Ej:Nuestras vacaciones coincidieron por

casualidad。(我们的假期硬巧重合了。)) elegir (-j-) - 选择 (Ej: Elegi estudiar espanol porque me gusta La cultura。(我远择学西班牙语因为我喜欢它的文化。1) preguntar 提问 (Ej: Le pregunte La hora a un seflor por la calle. (我在街上间— 位先生时间11 clasificar (-qu-)-分类(Ej:He clasificado los documentos par fecha.(我已经按 日期把文件分类了。1) sentir

  • 感觉(Ej:Ayer me sentf un poco enfenmo.[昨天我感觉有点不舒服。))

  • enterarse (de)

  • 得知(Ej:Me he enterado de que te casas.jEnhorabuena!(我听说你要

结地了。恭喜!))

  • Sustantivos(相关名词):

  • plano

(m.)图纸[Ej:El arquitecto modific6 los planos.(建气师改了图 抵1) multa {f.)-罚款 [Ej:Recibf una multa por exceso de velocidad.(我收到了

一张超速罚单。))

  • guard1a

(f.)值班 [Ej:Esta semana he tenido dos noches de guardia. (这周我 值了两个夜班。))

  • juicio

{m.)审判[Ej:El juicio fue Largo y compl1cado.(鑫审湿长而复系。 )) visita (f.)- 访问, 访客(Ej: Ayer tuvimos una visita inesperada.(昨天我们有 位不速之客。} compra (f.)- 购物 (Ej:He hecho La compra para toda la senmana.(我采购了一周 所肃的东西。1》 ■ exposicion (de pintura) (f.)- (画)展(Ej:La exposici6n ternin6 el domingo pasado.(展览上周 日结乘了。1) inforne (m.)- 报告(Ej: El jefe me pidi6 un informe detallado.(老板让我写— 份详组报告。1)

  • agenda

(f.)-日程本(Ej:Tengo la agenda LLlena esta semana.(我这周日程排满 了. 1) vifieta (f.)-小插面(Ej:Me gustaron Las vinetas de ese comic.(我喜欢那本 画里的小推图。))

  • mentira

(f.)-谎言(Ej:Detecte una mentira en su historia.(我在他的故事里发 现了一个谎言,)) pepjaA = (f.)-真相(Ej:Al final,se supo toda la verdad.(最终,全部真相大白 了. 1)

  • oracion

(f.) - 句子 (Ej: El profesor nos pidi6 escribir cinco oraciones. (老 师让我们写五个句子。1) (aded ap) eJT = (f.)- 纸条(Ej:Apunte su nunero en una tira de papel.(我把他的号码 记在了一张纸条上。1) = bol.sa (f.)-袋子(Ej:Meti las LLaves en la bolsa.(我把钥匙放了包里。))

  • sorpresa

(f.)-惊(Ej:Le he preparado una fiesta sorpresa.(微给他准备了— 个惊喜派对。11

  • poenma

{m.)-(Ej:Este poena fue escrito por Lorca.(这首诗是洛尔卡写 的。>)

  • globo

{m.)-气球 [Ej: El globo se escapo y subi6 al cielo. (气球跳掉了,飞 上了天。))

  • pelicula

(f.)-电影(Ej:Que pelicula viste anoche?(你炸晚看了什么电影?)}

  • frecuenc1a

(f.)频平 [Ej: Con que frecuencia has ido al médico este ano? (你 今年看医生的频率如何?))

  • trabalenguas

(m.invar.)皖令 (E}: Intente decir el trabalenguas, pero n0pude。(我试着说那个烧口令,但没能说出来。))

  • palabra

(f.)单词[Ej:No he entendido la (ltima palabra.(我没听懂显后一个单 词1) cuaderno (m.)-笔记本(Ej:Anota lainformacion en tucuaderno.(把信息记在你 的笔记本上。1) entrevista (f.)-采访 [Ej: Le hicieron una entrevista para el periodico. (他] 为握纸采访了他。))

  • fecha

(f.)-日期[E}:Que fecha fue tu cumpleanos?(你生日是几号?)) aconteciniento (m.) - 事件 (Ej: La llegada del honbre a la Luna fue un gran aconteciniento.(人类登月是一件大事。)) = decada (f.) - +年 (Ej: En La iltina decada, la tecnologfa ha avanzado nucho.(在过去十年里,科技进步了很多。1] 5iglo (m.)-世纪(Ej:Vivinos en elsiglo XXI. (我们生活在21世纪. )) columna (f.)- 列(Ej: Relaciona las palabras de las dos columnas.(把两列的 单词联系起来。1)

  • disco

(m.)- 唱片 (Ej: Este grupo saco un disco nuevo el mes pasado. (这个 乐队上个月出了一张新唱片。1) endn (f.)-宣顶(Ej:Visitanos La cupula de la catedral.(我们参观了大教堂 的弯顶。))

  • premio

(m.)-奖项(Ej:El escritor recibio el premio por su novela.(作家因 其小说获得了奖项。1)

  • biografia

(f.)-传记(Ej:He leido una biografia de Frida Kahlo.(载读过一本弗 里达·卡罗的传记。))

  • novela

(f.) - 小i说 (Ej: Garcia Marquez escribi6 la novela Cien anios de soledad.(加西亚·马尔克斯写了小说《百年孔寂》。)) revista (f.)- 杂志 (Ej: Compre una revista de viajes en el aeropuerto. (我 在机场买了一本旅游杂志。))

  • historia

(f.)-历史;故事(Ej:Me gusta leer Libros de historia.(我欢读历史 书。)/ Elabuelo nosconto una historia increible.(节节给我们讲了一个 不可思议的故事。))

  • cancer

(m.)-癌症(Ej:Desgraciadanente,murio de cancer.(不幸的是,他死于癌 症。1) asuadsns (n.) - 悬 (Ej: Fue una pelicula de suspense muy enocionante. (那是

一部非常意动人心的悬疑电影。)

viaje (al extranjero) Francia。(我的第一次出国旅行是去法国。)) osuadsns = {m.)-不及格(Ej:Estude mucho, pero saque un suspenso.(我学习很努 力,但是考了个不及格。)) aesuau * (m.)-消息,留言(Ej:He recibido un mensaje inportante.(我收到了— 条重要信息。}) contestador (m.)-电话答录机(Ej:Dejé un mensaje enelcontestador.(我在答录机里 留了言。)) ofedut * (m.)-未付款 (Ej: Rec1b16 un aviso por inpago de la factura.(他收到 了一个末付账单的通知。)) =bolso (m.) - 手提包 (Ej: No encuentro m bolso, creo que lo he perdido。(我找不到我的包了,我想我把它弄丢了。)) 1lave (f.)-钥匙[Ej:Has cerrado La puerta con Llave?(你用钥感镇门了 限 ?11

  • grua

(f.)- 拖车 [Ej: La grua se Llev6 el coche mal aparcado.(拖车拖走了违 意停放的汽车。)) inpresion (f.) - E印象, 震惊 (Ej: La noticia me caus6 una gran impresi6n. (这个 消息给我留下了深刻的印象/让我非常震惊。))

3.时间表达(Expresiones de Tiempo)

  • 与现在完成时连用(Con Preterito Perfecto):

  • hoy

今天(Ej:Hoy he aprendido muchas cosas nuevas,(今天我学了很多浙东 西。1)

  • esta mafiana / tarde / noche

今天早/午/晚(Ej:Esta tarde henos visitado a nuestros abuelos.(今 天下午我们拜访了祖父母。))

  • esta senana / nes / aflo

这周/这个月/今年(Ej:Este afio no he tenido vacaclones todavia。(今年我还没有体阀。)) iltimanente 最近(Ej:Uitimamente he dornido muy mal.(最近我胆得器不好。))

  • hace un rato / una hora...

  • 刚才/ —小时前...(Ej:Ha Llegado hace cinco minutos.(他五分钟前到

的。 )) zaA eunfe =

  • 曾经(Ej: Has comido caracoles alguna vez?(你吃过蜗牛玛 ?))

  • 很多次(Ej:He visto esa pelicula muchas veces.(我看过那部电影很多次

了. 1) eUnu

  • 从不(否定经历)(Ej:Nunca he subido a una montana tan alta.(我从没

爬过这么高的山。))

  • ya

  • 已经(Ej:Has terminado ya?(你已经完成了吗?))/ todavia no -还没

(Ej:Todavia no me he duchado.(我还没洗深呢。))

  • 与简单过去时连用(Con Preterito Indefinido):

  • ayer

昨天(Ej:Ayer hizo mucho calor.(昨天天气很热。)) p

  • 昨晚(Ej:Anoche vi un prograna interesante en la tele.(昨既我在电

视上看到一个有题的节目。1) anteayer

  • 前天(Ej:Anteayer fue el cumpleanos de mi madre.(前天是我妈妈的生

日。1) el otro dia

  • 那天 (Ej: El otra dia me encontre con Luis por la calle. (那天我在

街上碰划了路易斯。1) epesed eueuas e1 *

  • 上周(Ej: La semana pasada tuve mucho trabajo. (上周我有很多工作。 ))

opesed sau [e *

  • 上个月 (Ej:El mes pasado hicinos una excursion. (上个月我们进行7

次远足。)) opesed oue 1e *

  • 去年(Ej:El ainio pasado canbie de coche.(去年载换了车,))

  • el lunes / nartes... pasado

  • 上周— / 周二...(Ej:EL jueves pasado Lleg6 mi paquete. (上周四我的

包裹到了。1)

  • el sabado por la tarde

网六下午(指过去的周六)(Ej:El sabado por la tarde fuimos de compras。(网六下午我们去购物了。))

  • en(+年份/月份/季节)

  • 在..,年/月/重(Ej:Mihermanosecas6en julio.(我要哥七月份结的婚。)

/ En invierno nev6 mucho aqui.(冬天这里下了很多雪。))

  • )

.以前[Ej:Me mude a esta ciudad hace cinco anos.(我五年前耀到了 这座城市。1)

4.拼写与发音相关(Ortografiay Pronunciacion)

  • 摊音词对 (Pares para distinguir):

  • acto/apto

(Ej:Fue un acto heroico.(那是一个英雄行为.)/ No es apte para menores。(不适合未成年人。))

  • prado/plato

(Ej:Las vacas pastan en el prado.(牛在单地上吃单。) / Se me cay6 el plato.(我的盘子了。)) cuadro/cuatro (Ej:Colgue un cuadro en la pared.(我在墙上挂了一幅画。) / Tengo cuatro hermanos.(我有四个兄弟姐妹。))

  • habla/abra

(Ej: El habla muy rapido.(他说话很快) / Necesito que abra la puerta.(我需要您打开门。-虚拟式))

  • brazo/plazo

(Ej:Me duele el brazo derecho.(我右脉疼。)/ El plazo termina maniana.(期限明天截止。))

  • plaga/Praga

(Ej:Hubo una plaga de langostas.(发生了—场鲤灾。) / Visitanos Praga el ainio pasado.(我们去年去了布拉格。))

  • aptitud/actitud

(Ej:Tiene buena aptitud para la musica. (他有很好的音乐天赋.) / Su actitud ha cambiado.(他的态度改变了。))

  • sobre/sople

(Ej:Deje la carta en el sobre.(我把信放在信封里了。)/ Espera a que se sople elviento.(等风吹起来。-虚拟式))

  • prisa/brisa

(Ej:Sienpre va con prisa.(他总是很忙。)/ Soplaba una brisa agradable.(吹着宜人的微风。))

  • sabré/sable

(Ej:Manana sabre los resultados.(明天我就会知道结果了。)/ El pirata Llevaba un sable.(海盗带着一把马刀。))

  • 带 g/] 的调:(参见 I.1 和 I.2 部分的例句)

带h/不带h的词:(参见I.1和I.2部分的例句)

5.叙事结构术语(Terminos de Estructura Narrativa)

  • Planteaniento (开强) (Ej: La historia conienza con el planteamiento de la

situac1on 1n1cial,(故事从初始情境的设定开始。)) Trana [傅节发展) (Ej: La trana se complic6 cuando apareci6 un nuevo personaje.(当一个新角色出现时,情节变得复杂了。))

  • Desenlace (结局) (Ej: EL desenlace de la pelicula fue inesperado. [电影的结局出

人料。1)

  • Accion (事件/行动) (Ej: La accion principal ocurri6 durante la noche. (主要事件

发生在夜间。11

  • Espacio-lugar (地束) (Ej: El espacio donc

  • Espacio-lugar (t.点.) (Ej: El espacde donde se desarrolla La novela es una

1slarenota.(小说展开的空间是一个偏远的是屿。)

  • Ticmpo(时间){Ej: El tiempo narrativo fue cl siglo XIX.(叙事时间是19世纪。 ))

Personajes [人物] (E): Los personajes principales fueron muy bien desarrol.lados.(主要人物耀造得很好。)

  • Hechos (事件/事实)(Ej:La narracion se basa en hechos reales. (叙证基于真实事

件。11

  • Primcro, a continuacion, dcspucs, por iltimo, finalncnte, al final (r序/结尾

词) (E) : Prinero, desayunamos. A continuacion, salinos a pasear.Finalnente,volvimos a casa.(首先,我们吃早饭。接着,我们出门敬步。最终,我 们同家了。1) II.核心语法详解(Puntos Gramaticales Esenciales)

1.现在完成时(Preterito Perfecto)

  • 梅成(Forma):haber 的现在时变位(he ,has ,ha , hemos , hab éis , han} +功词过去

分词(-ado / -ido) :不规则过去分词(Participios Irregulares): ahierto(ahrir) , dicho(decir) ,escrito(escribir) ,hecho(hacer) ,pue sto(poner) , roto( ronper),visto(ver),vuclto(volver) ,muerto (morir) ,

  • 用法(Usos):

  • Ej:He terninado ya.(我已经完成了。)

  • Ej:Todavia no he comido.(我还没吃饭呢。)

  • Ej:Has estado alguna vez en China?(你鲁经去过中国吗?)

  • Ej:Mi hernana ha vivido en Londres.(我姐姐在伦数住过。)

  • Ej:Se ha roto una pierma y mo puede andar. (他绎断了一条腺,现在不能走路

7.)

  • Ej:Acabo de coner,he comido demasiado.(我国吃完饭,吃得太多了。)

  • Ej:Hoy he trabajado mucho.(今天我工作了很多。)

  • Ej:Esta senana hemos visto dos peliculas. (这同我们看了两部电影。)

  • 表达与现在相关的、尚末结束的时间段内发生的动作。

  • 表达不久前发生的动作,其影响可能持续到现在。

  • 表达个人经历,不指明具体发生时间。

  • 与 ya / todavia no 连用。

时间标记 (Marcadores): hoy, esta mafiana/Larde/mache, esta semana/nes/ano。 hace poco, hace un rato/una hora, oltinanente, ya, todavia no, alguna vez, nunca, siempre, muchas veces, 等.

  • 强调点:与“现在”时间点的关联性是关键。可以是时间段末结束,动作别发生不久,或是过去的动作对

现在有影响/结果,或是谈论到目前为止的经历。

  • Ej (结果):He perdido mis gafas y ahora no veo bien.(我弄丢了眼镇,现在

看不清。)

  • Ej(经历):Hemos visitado ese museo muchas veces.(我们参艰过部个原物馆

很多次了。1

2.简单过去时(Preterito Indefinido)

  • 构成(Forma}:

  • 规则 -ar:-e,-aste, -o, -anos, -asteis, -aron (Ej: hable, hablaste,

hablo..-)

  • 规则-er/-ir:-f, -iste, -16, -inos, -1steis,-ieron (Ej: conf,

comiste, conio... / vivi, viviste, vivio...) :不规则动词(Verbos Irregulares Comunes):

  • Ej:Fui estudiante de esta universidad.(我兽是这所大学的学生。)

  • Ej:Ayer fuinos al parque.(昨天我们去了公园。)

  • Ej:Ayer estuve en casa todo el dia.(作天我整天在家。)

  • E}:Tuvinos una fiesta el sabado.(我fl周六升了个派对。)

  • Ej:No pude terninar eltrabajo.(我没能完成工作,)

  • Ej:Ella puso el libro sobre la mesa.(她把书故在桌子上了。)

  • Ej:Lo supe denasiado tarde.(我知道得太晚了。)

  • Ej:No quise nolestarte,(我不想打扰你。)

  • Ej: Mis padres vinieron a visitarme。(我父母来看我了。)

  • Ej:Qué hiciste anoche?/ El hizo la cena.(你阶晚做了什么?/他做了晚

饭。)

  • Ej:Ne lo dijo ayer. (他昨天告诉我的。 )

  • Ej:Traje un regalo para ti.(我给你带了个礼物。}

  • Ej:Ella tradujo el texto alinglés.(她把文本翻详成了英语。)

强变化词干: estar (estuv-), tener (tuv-), poder (pud-)。 poner (pus-)。 saber {sup-)。 querer (quls-), venir {vin-), hacer (hic-/hizo), dec1r {dij-), traer (traj-1,-ducir {duj-)+ 特殊词尾(-e,-iste,-0 imos, -isteis, -eron/-ieron)

  • Ser / Ir:

fui, fuiste, fue, fuimos, fuisteis, fueron

  • Dar:

d1, diste, dlo, dimos, diste1s, dieron (Ej: Le df el libro a Juan.(我把书给了胡安。)) Ver: V1, viste, vio, vimos, v1ste1s, vieron (Ej: Visteis la nueva pelicula?(你们增了新电影吗?))

  • 用法(Usos):

  • Ej:Colon descubri6 América en 1492.(吾伦布于1492年发现了美洲。)

Ej:Lleg6a casa,cen6 y se acost6.(他回到家,吃了晚饭然后睡觉了。)

  • Ej:Ayer fui al cine,(昨天我去看了电影。)

  • Ej:El ano pasado viajamos a Italla.(去年我们去了意大利旅行。)

  • 表达过去特定时间点或已结束时间段内发生且已完结的动作。

  • 叙述一系列连硬发生的过去动作。

■用于传记或历史事件的叙述。

  • 时间标记 (Marcaderes): ayer, anoche, anteayer, el otro da, la scnana pasada,

el mes/afo pasado, en (+fecha/afio), hace (+tienpo), el lunes/martes.. 等.

  • 强调点:描述已完暗的过去时间点或时间段内发生的事情。与现在没有直接时间关联,是纯释的过去叙

还。

  • Ej(特定时间点):La reunion enpezo a las nueve en punto.(会议九点整开

  • Ej(系列动作): Se levant6,se duch6, desayun6 y sali6 para el

trabajo.(他起床、洗澡,吃早饭然后出门上班。)

3.现在完成时 vs.简单过去时(Contraste Perfecto/Indefinido)

  • 关键区别:动作发生的时间段是否包含现在或与现在有明显关联。

  • 包含/关联现在(Perfecto):

Esta senana he ido al gimmasio tres veces.(这周还没过完)->(这周我去 了三次健身房。)

  • 不包含/已完结(Indefinido):

La semana pasada fui al gimmasio tres veces.(上周已经结束)->(上周我 去了三次健身房。)

  • 细横差别:有时选择也取决于说话者的主观感受(事件远近/是否视为新闻等),如活动21所示。

  • 对比实例:

  • Que has hecho hoy?

(今天做了什么?·今天末结束->Perfecto)vs.Que hiciste ayer?(昨天做 了什么?-昨天已结束->Indefinido)

  • Este anio he viajado mucho.

(今年我旅行了很多次-今年未结束->Perfecto)vs.EL anio pasade viajé nucho.(去年我旅行了很多次-去年已结束-> Indefin1do)

  • He visto a Maria hace un rato.

(我刚才见到玛丽亚了-离现在近->Perfecto)vs.Via Maria elotro dia.(我那天见到玛丽亚了-指特定的过去某天->Indefinido)

4.存在句 Hay(There is / There are)

  • 用法:表示“有”,无人称和数的变化。

  • 与不定调连用:

Hay algun restaurante cerca? (附近有餐馆吗 ?)-algun/alguno(s)/alguna(s)用于疑问或肯定。 = No, no hay ninguno. / No hay ningun restaurante.(没有。)- ningun/ninguno/ninguna 与否定 词no连用。

  • Ejemplos:

  • Ej 1:En m1 barrio hay tres supermercados,(我住的小区有三家超市。)

  • Ej 2: Hay alguna farmacia abierta ahora?(现在有药店开门吗 ?)

  • Ej 3:No,a esta hora no hay ninguna abierta.(不,这个点儿没有一家开着

门]。}

  • Ej 4:No habia nadle en casa cuando Llegue.(我到家时没人在家。-过去未

完成时 habia)

5.连接词(Conectores)

  • Pero/ Sin enbargo(但是/然而):表对比或转折。

  • Ej:He estud1ado mucho,pero no he aprobado.(我学习很力了,但是我没通

过。)

  • Ej:Estudie mucho;sin enbargo,no aprobe.(我学习很努力了;然而,我没通

过。)

  • Ej:Quise ir a la fiesta,pero tuve que trabajar.(我想去派对,但是我得

工作。)

  • Ej: Ha llovido mucho; sin embargo, hemos salido a pasear. (雨下得很

大;然而,我们还是出去敬步了。)

  • Porque (因为):表原因。

  • Ej:No sali porque Llovia.(我没出门因为下雨了。)

  • Ej:No fui a clase porque estaba enfermo.(我没去上课因为我病了。)

  • Ej:He llegado tarde porque he perdido el autobus.(我迟到了因为我错过

了公交车。)

6.拼写规则(0rtografia:g/j,h/s)

  • 网顾调汇表I.4部分关于9/j和h/&的规则和例子。掌握这些规则对正确书写至关重要。熟记规则

并多加练习是关键。特别注意不规则动词变位中的 G/3变化(如 decir-> dije,dirigir -> dir1jo) 和 H 的随定册法 (如 haber, hacer, hue-, etc.]。

7.叙事结构(Estructura Narrativa)

一个基本的故事包含开端(PLanteaniento)、情节发展(Trama)和结局(DesenLace)。

  • 开油需交代清签事件、地点、时间、人物、

  • 情节发展按时问顺序展开,可用顺序调连接。

  • 结局总结事件结果,可用结尾词引出。

  • 微型故事示例(应用结构):

(Planteaniento) Ayer por la tarde, m1 amigo Juan y yo fuimos al parque El Retiro en Madrid para pasear。(昨天下午,我和我朋友胡安去了马德里的丽池公园步。)

  • (Trama)

Primero, vimos el Palacio de Cristal. Despues, alquilanos una barca y naveganos un rato por el estanque. A continuacion, mentras caminabanos, vimos a un misico callejero que tocaba muy bien la guitarra。(首先,我们参现了水是宫。然后,我们租了一条小船在池塘上划了一会儿。接 着,我们敢步时,看到了一个街头音乐家吉他弹得非常好。}

  • (Desenlace)

Finalmente, empezo a Llover y tuvinos que irnos, pero pasamos una tarde muy agradable。(最终,开始下雨了我们不得不离开,但我们度过了一个非需值 快的下午。} III.常用表达(Expresiones Frecuentes)

  • 询问近期活动:

  • Que has hecho hoy?

(你今天做了什么?) Que has hecho esta semana? (你这周做了什么?) Que has hecho últinamente? (你最近做了什么?)

  • 询问过去活动:

Que hiciste ayer? (你昨天做了什么?)

  • jQue hiciste la senana pasada?

(你上同做了什么?)

  • Que hiciste el afo pasado?

(你去年做了什么?)

  • 询问经历:

  • Ej:Has com1do paella alguna vez?(你吃过西班牙海鲜饭吗?)

  • Ej:Has estado en México alguna vez?(你曾经去过墨西哥吗?)

Has + participio + alguna vez? (你普经..过吗?)

  • 询问频率:

He ido muchas veces. (我去过很多次,)

  • He ido alguna vez / un par de veces.

(我去过几次/一两次。}

  • No he 1do nunca.

/ No he ido ninguna vez。(我从没去过。/我一次也没去过。)

  • E]:Con que frecuencia has ido al cine este mes?(你这个月去电影院的频

率如何?) ■Con que frecuencia + verbo? (你做...的频率如何?) 最回

  • 进行对比:

  • Ej: Yo he terminado mi trabajo, pero m1 compafero todavia no. {我完成

了我的工作。但我同事还没。) Ej: Ayer fui al supermercado, sin embargo, olvide comprar leche. (B作 天我去了超市,然而我忘了买牛奶。) (Yo) hice/hecho A, pero (el/ella) hizo/hecho B. (我做了/做过A,但是他/姓做了/做过B。)

  • 给出原因:

  • Ej: Llegue tarde porque habia mucho trafico.(我退到了因为交通很堵。)

Ej:No hemos podido salir porque ha llovido todo el dia. (我们没能出门 因为下了一整天的雨。》

  • [Accion] porque [Razon] -

([动作]因为[原因]。)

  • 谈论职业与工作:

  • Soy [profesion].

(我是[职业]。)(Ej:Soyestudiante,我是学生。)

  • Trabajo en [lugar] -

(我在[地点]工作。}(Ej:Trabajo en una oficina,我在办公室工作。}

  • A que te dedicas?

(你是做什么工作的?)

  • 指述名人成就:

  • [Nombre] nac16 en [afio/Lugar]-..

([名字]出生于[年/地点]...) ...publico [obra] en [ano] ... (..于[年]出版了[作品]... ..-gan6 el Premio [nombre del premio] en [ano] ... (...于[年]获得了[奖项名称]...) ...muri6 en [anio/Lugar] . [..于[年/地点]去世。) ES·目录 <上一篇 下一幕> 走遍西班牙第一册第+单元(Ymaana, 走遍西班牙22-ambito2-02零般知贴 que?》 Anbito 2详细笔记

原始排版图

原始导出图超过单张 WebP 的尺寸上限,以下图片按从上到下的顺序连续保存。 走遍西班牙第二册-第三单元《¿Alguna vez has conocido a algún famoso?》Ámbito 1:微信公众号导出原始排版图(第 1 段,共 2 段) 走遍西班牙第二册-第三单元《¿Alguna vez has conocido a algún famoso?》Ámbito 1:微信公众号导出原始排版图(第 2 段,共 2 段)

走遍西班牙第一册 - 第十单元《Y mañana, ¿qué?》Ámbito 2详细笔记

· 閱讀時間約 29 分鐘
w0x7ce
MySelf

发布于 2025-04-21 22:36:55(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 21044 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

走遍西班牙第一册-第十单元《Ymaniana,qué?》Ambito2 详细笔记 original wex7ce EI V1ajero 2825年4,月21日 22:37 四1 Anbito 2: Esto se acaba & Maneras de VIVIR: ;Hoy las ciencias adelantan que es una barbaridad! Anbito 2 & Maneras de VIVIR 核心学习目标(Objetivos Clave): 交际能力(Competencia Conunicativa):

  • 准确表达对学习经历的感受(如难度、兴趣)。(Expresar sentinientos scbre la

experiencia de aprendizaje.}

  • 清晰讨论有效的掌习方法和策略。(Discutir métodos y estrategias de aprendizaje

eficaces.)

  • 识别并讨论学习中遇盈的具体国班。(Identificar y discutir dificultades especificas

en el aprendizaje.)

  • 熟炼运用润汇处理策略(推斯词义)。(utilizar estrategias para manejar vocabulario

desconoc1do .)

  • 进行学习风格和态泉的自我评估。(Autpevaluar el estiloy la actitud de

aprendizaje.)

  • 对语言课程进行评价并提供反景。(Evaluar un curso de idionas y dar feedback.)

  • 给出学习建议。 (Dar consejos sobrc el aprendizaje.)

  • 表达末来的计划和打算。 (Expresar planes e intenciones futuras .)

  • (Naneras de VIVIR) 讨论蛋要发明及其影响。(Discutir inventos inportantes y 5u

impacto . )

  • (Maneras de VIVIR) 理能并讨论科技进步。 (Congrender y discutir el progreso

cientifico y tccnol6gico.1

  • (Maneras de VIvIR) 对比不E时代的生活. (Conparar la vida en diferentes épocas.)

词汇与文化(VocabularioyCultura):

  • 掌握与学习评价、方法、策略相关的词汇。

■掌握与课程评估相关的调汇。

  • (Naneras de VIVIR)掌握与科技、发明、历史时排相关的词汇。

(Maneras de VIVIR]了解划利略等科学人物及其贡献 I.核心语法与表达功能解析(AnaLisis Funcionaly Gramatical)

  • 巩固运用表达观点和感受的动词(Verbos para expresar opinionesy sentinientos):这类

动词通常常要与同接宽语代词[nc,tc,lc,nos,os,les)连用,主语往往是引起感受的事物或从

  • :A Pedro le da verg i enza hablar en p i blico .[佩德罗不好意思在公共场合讲

话。)-主语是动词原形短语hablar en pblico。 例:None inporta equivocarne, Lo Linportante es practicar.【我不介意招铺,重 要的是链习。)-主语是动词原形equivocarne。 语是动词原形短语coretererrores....

  • :Mc nolesta quc mc interrunpan para corregirte .(我反感别人打断我来纠正

我)-主语是从句que me interrunpan ....

  • :Me gusta aprender gram a tica jugando .(我喜欢通过游戏学习语法。)·主语是

动词原形短语aprcnder...

  • :Me ha parecido dif I cil el exanen .(我觉得这次考试很难。)·主语是

el exanen, 例:Me parece que va a LLover .(我觉得要下雨了。)-主语是从句 que va a llover,

  • parecer

《觉得,看起来余):表示主观看法或印条。

  • gustar

(便..,喜欢):表达喜好。 molestar 《打扰,使..烦恼}:表达反感或不快。

  • preocupar

《使...担心》:表达担忧。

  • inportar

(要紧,介愈):表达某事是否重要或是否在意。常用于否定noinportar(不介意)。 dar verg i enza (便..害塞/不好意出):表达尬或害着的情绪。 必须做的事或提出建议。

  • :Henmos de terminar este trabajo hoy-(我们今天得完成这项工作。)

  • :Hay quc practicar mucho para hablar bien cspa n ol .(费想西语说得好就得多

习。) ■例:Hay que ser puntual .(应该要准时。) 例:Tengo que estudlar na s para el pr 6 xino exanen .(为了下次考试我必须亚努 力学习。)

  • :Tuvinos quc cancelar el viaje por cl mal ticnpo .(因为天气不好我们不得不

取消了旅行。) tener que + infinitivo [必须/不得不+动词原形):表示主双或客观上的必费性、义务。 hay que + Lnfinitivo 《应该/必须+动词原影):表示泛指的、客观的必要性或普的建议,无人称形式。

  • haber de + 1nfin1tivo

(应该/必须+动词原形):意思与tenerque类似,但更偏向书面语或略显正式。不如 tener que常用,

  • 理解并运用动名词(gerundio)描述方法或进行中的动作{Uso delgerundiopara

describir metodos o acciones en progreso):

  • 例;Ahora misno cstoy leyendo un libro .(我现在正在读一本书。)

  • 例: Aprendenos espa n ol escuchando m i sica y viendo pel I culas (我们通过听

音乐和看电影来学习西班牙语。) 例:Preflero estudLar repasando mls notas,(我更寒玖通过复习笔记来学习。)

  • 构成i: hablar -> hablando ; coner -> comiendo ; vivir -> viviendo

Gerund10 (副动词):西班牙语的一种非人称动词形式。以-ando[原形-ar结尾)或-iendo(原影- er/-1r结尾)结尾。 ■描述方式/方法:可以说明动作是如何进行的。

  • 与estar构成进行时(estar+gerundio):强调助作正在发生。(本单元非重点,但在理

解语境中有用) (注:1Levar+时间段+gerundio用于强调动作从过去持续到现在的时间长度,例如Llevo dosanos aprendiendo espanol·我学西班牙语已经两年了。这个结构在本册书中可 董末系统学习,但与本单元讨论学习时长相关。1

  • 复习并运用多种时志回顾经历和表达观点(Repaso de tienpos verbales para narrar

experiencias y expresar opiniones):

  • 例: Cuando era peque i α , viv i a en el canpo . (我小时候住在乡下。 )

  • ; No sab i a bien cu é ndo hab I a que utilizar cada tienpo verbal . {我 (过

去)不太清楚什么时候该用哪个时态。)

  • :Ayer le i un art i culo intercsante.(昨大我误了一氟有理的文置)

  • 例: Galileo invent 6el tern 6 metro - (伽利略发明了温度计。)

  • :Este curso ha sido nuy til。(这个课程(刚刚结束)一直很有用。)

  • :He aprendido muchas palLabras nuevas esta senana - (这周我学了很多新单词]。)

  • 例;Creo quc la gram a tica es complicada .(我认为语法很复杂。)

  • :Nomalmente estudio por la noche .(通常我院上学习。)

  • 现在时(Presente):

用于表达当前观点、习惯、一般事实。

  • 现在完成时(Preterita Perfecto Compuesto:haber+过去分词):

用于谈论与现在有联系的过去动作(如发生在今天、本周等末结原时间段内;或不确定时间的 个人经历:或结果影响到现在)。

  • 简单过去时(Preterito Indefinido):

用于叙述过去特定时间点完成且结束的动作。 过去未完成时(Preterito Imperfecto): 用于猫述过去的背景、状态、习惯、末完成的动作或同时发生的动作。

  • 运用将来时或ir a+1nfinitivo表达米来计划(Uso del futuro o1r a+ infinitivopara

expresar planes futuros):

  • 例;El a n o que viene viajar é a Espa n a .(明年我会去西既牙旅行。)

:Supango que aprenderé mucho si sigo estudiando .(我趣如果我继续学习。我会 学到很多。) ■例:EL pr 6 xiro fin de semana voy a visitar a mis abuelos .(下周末我打算去看 我的祖父母。)

  • :Qué vas a hacer despué s de clase ?(下误后你打算做什么 ?)

  • ir a + infinitivo

(打算去动词原形):常用于表达近期的、比较确定的计划或意图。 将来陈述时(Futuro Sinple): 可用于表达稍远期、不太确定的计划、预测或承诺。 II.核心词汇详解(Vocabulario Esencial con Significado) (根据p.224-p.231页面内容整理) Pagina 224 含mbito (m.):领域, 范圈 esto:这个 se acaba:束了(acabarse)

  • f6 c1l: 客易的

  • D:或者

  • d1f c1l: 图难的

pues:那么,好吧 hasta aqu 1: 到这里

  • henos 1legado:我到达了 (\legar)

nuestro , tra: 我们的

  • curso (m.):谦程

de:的: 从.. cspafiol:西班牙语;西班牙的;西班牙人

  • ya:已经

  • ha teminado:已经结束了(terminar)

DS:你们(间接/直接实语)

  • parecido:觉得 (parecer的过去分词): 相似的

  • he tenido:我有/管有(tener的规在完成时)

que:(连接词):什么 estudiar:学习 bastante:相当地:足够的 a:到:向;给 mi:我(介词底格) :一个

  • poco:少许,一点

sobre:关于;在...上面 todo:全部;所有(sobre todo:特别是) L.os / l.as:(定冠词复数):他们/地们/它们(直接实语)

  • verbos (n.pl .): 磁词

para:为了:对于

  • el /La/ Lo:(定冠词):他/她/它(直接真酒)

side:是(ser的过去分词) parece:鲁; 安得(parecer) mucha:很,非常:许多 6834 :TU lengua(f.):语言;舌头

  • Y:和

t:你 qué:什么

  • opinas:你认为〔opinar)

:anbuod

  • nuy: 很

es:是 (ser/estar)

  • 0:(中性定冠词):它(直接宾语)

mas:更,更多 te:你(间接/直接宾语) ayudado:智助(ayudar的过去分词) aprender:学习 tados , das: 所有的 estos , tas: 这些 aspectos (m.pl-): 方面

  • son: 是 (ser/estar)

  • inportantes:重要的

conecer:了解:认识

  • una:个(阴性)

ord e nalos : f括它们排序 (ordenar+Los )

  • scg (n: 根据

inpertancia(f-):重要性

  • Les:钟们/地们/您们(同接实语)

atribuyes:你归因于(atribuir)

  • asistir a:出席, 加

clase(f.):课;班级

  • df as (m.pl.): 天

paner atenci6n:集中注意力

  • participar en: 参与

  • hacer deberes:做作业

casa(f.):家;房子 practicar:练习 cualquler [ a 】 : 任何↑

  • ocasi on(f.):场合;机会

con:和..-一起:用

  • nativos(n.pl.):本继人,母语老

leer:阅读

  • ver:看见

Lelevisi6n(f.): 电视

  • escuchar:听

  • mi sica (f.): 音乐

gram a tica (f.): 通法 vocabulario (m.) : 词[ escucha:斯(escuchar) senala:作指出(se fialar) s1de:是(ser的过麦分润) :(1a + op) [ep ▪ para:为了:对于

  • cstudiantes (m./f-pl.): 学生

pronunciaci 6n[f.]: 发育

  • conversaci 6n(f.):对活,会活

  • ahora:现在

  • nunera:你编号(nunerar)

al (a + el): 到; 向 por:为了:通过;因为

  • orden (m.) : 膜序

  • dificultad (f.): 图难

alg n, alguna: 某个,一世

  • conpa ∩ ero , ra : 同学, 同伴

  • coincide:—致(coincidir)

contigo:和行一起 Pagina 225 aprender:学习 gram a tica (f.): 语法 te parece:你宽得(parecer) necesario:必雯的

  • aburrido:无哪的

pr a ctico:买用的

  • 1n til:无用的

interesante:有避的

  • sin:没有

interés(m.]:兴趣;利益

  • c6mo : 怎样

gusta:快...塞欢(gustar) hablas:你说(hablar )

  • espanol:西班牙语

0e : uo3 =

  • reglas (f-pl .):规则

《图:anbuod:epes · lengua[f.): 语言

  • tiene:有(tener)

Su:他的:抛的:它的:您约:他们的:越们的;您们的

  • propia: 己的

  • regla (f .) : 规则)

  • participando: 参与著 (part.cipar的氨动词)

en:在...里;关于

  • explicaci 6 n(f.): 解释

  • eso:那个

puede: 够 (poder] profundizar: 加深 inpres1 6 n(f.): 印象

  • hacicndo:微誉(haccr的爵动词)

ejercicios(n.pl.): 练习

  • jugando:玩着(jugar的副动闻)

palabras (f .pl-) : 单词

  • *:opuen

estudianos:我们学习(estudiar) una:个 al principio:—开始

  • es:是

necesario:必要的 aprender: 学习

  • Largas:长的(阴性复数)

Listas[f-pl.]:清单;列表

  • de:的;从

  • recuerdas:$记得(recordar]

  • cl:(定冠词)

significado (m.):意思, 含义

  • cstas:这些(阴性)

est 6 nago (n.) : 胃

  • resfriado (n.): 最显

banca(m.):银行:长其 odlar: 恒慢 cocina[f.]:厨房:烹饪

  • nevar: 下雪

  • peine(m.): 子

  • plaza(f.): 广

bonbero(n.):消防员 elefante (m.):大象

  • cun ado(m.):(内、外)兄弟

Invento (n.): 发明

  • cxcursi n(f.):远足,郊游

c6no: 怎样

  • consigues:你设法盈到(conseguir)

recordarlas : 记住地fl/E们 ( recordar+las)

  • nunera:你编号(nunerar)

. del ...al ...: ......

  • estos:这些(阳性)

mé todos (m.pl.) : 方法

  • seg (n: 根据

frecuencia(f.): 频率 que:(关系代词/连接词) 1os:(定冠词/代词) utilizas: 伊使用(utilizar)

  • las:(定冠词/代词)

escribo:我写(escribir) cn:在..里 mi: 我的

  • diccionario (m.):词典

particutar:特别的:私人的 junto con:与...一起 :个 elenpLo(n.): 例子 repito:我量复(repetir)

  • muchas:许多(朗性)

veces:次[vez的复数] agrupo: 发分组 (agrupar) asocio:我联系(asociar) por:通过;为了

  • fanilias (f.pl.):家庭;类别

tenas (m.pl.): 主题 :到;肉;给 correspondientes : 相应的

  • lengua:语言

relaciono:我关联(relacionar)

  • con:和;用

Dtras:其他的(阴性)

  • se parecen: 它们相像(parecerse )

alguna:某个(期性)

  • 1dea (f.) : 想法

  • imogen [f.): 图像

concreta:具体的(期性) Pagina 226 cuando:...时候

  • no:不

■conecenos:我们认识/了解(conocer )

  • el significado: 意果

  • dc una palabra:一个单词的

:eqe[ed zun ap

一个单词的

podemos:我们能够(poder)

  • deducirlo:推新它(deducir+lo)

diferentes:不同的 formas:形式:方式 porel contexto:根据上下文 ayer:昨天

  • lei:我续了 (leer)

en el per1 6 dico: 在接纸上 que: (连词)

  • Los estudiantes extranjeros: 外国学生

  • hagan:他们做(hacer的虚拟式现在时)

cursos de verano:夏令营:暑期课程

  • cn la universidad: 在大学里

podran:也们将能够(poder的将来时)

  • usar:使用

todas las:所有的(阴性) clases:溧:班级 「ue:是/去了(ser/ir的简单过去时]

  • eld1a:(那)天

un ram:一束

  • nardos:隐香玉

por la situscion:根据景 te apetece:你烈要(apetecer) m6s:更多 qu é crees que ha preguntado: 伟认为他间了什么

  • me he dejado: 我落下了(dejarse)

el reLoj:于表;时钟

  • cn casa:在家

por la forma:根据形式 hoLa:你打

  • Pedro:佩癌罗(人名)

esta ma ii ana:今天早上

  • he recibido: 我坡到了 (recibir)

gratificante:令人满意的

  • La ha entregado : ft/弹遇交了它(entregar+ La)

el cartero:邮递员

  • en persona: 亲自

esta noche:今晚 celebranos:我们)庆就(celebrar)

  • con una fiesta sorpresa:用一个惊基涨对

  • hacerLe un buen regalo: 送他/炮—个好箱

  • quc piensas:你怎么想

contestar:闻善

  • quc haccs t:你猫什么

cuando no sabes : 当你不知道时

  • Se lo pregunto a : 我间(人)部个 (preguntar)

  • la persona con quien hablo: 我与之交误的人

  • lo busco en el dicclonario:我在字奥星重它(buscar)

  • innediatanente:立剑

me callo:我保持试(callarse) no digo mi hago mada: 我什么也不说也不数 (decir,hacer]

  • Lo deduzco:找推斯它(deducir)

壬甲:000 ya tienes experiencia: 你已经有经验了

  • en aprender:在学习...方面

una Lengua extranjera: —门外语

  • danos:始我们(dar+nos)

  • ahora:现在

  • algunos consejos:一些建议

para aprender:为了学习

  • nuevas palabras : 新单词

hay que ...: ...

  • qu é significan:: 意球着什么 ( significar)

carlero:邮递员 cartera:女邮温员:锤包;抑包 Fugoso:福戈索[人名或形容词:热清的) era:是/兽是(ser的过去木完成时)

  • un nio:一个男孩

distraIdo:注意力不集中的

  • 50ador:爱梦想的

  • todas las ma anas: 每天早上

  • iba alcolegio:(他)去学校(ir的过去未完成时)

al menos: 至少

  • una vez a la semona:一周一次

perd Ia algo:()丢失某物(perder的过去木完成时)

  • su madre:地的妈妈

Le hab I a regalada:(她) 曾送绘他(regalar的这去完成时)

  • para que guardara:为了让钻保存(guardar的虚拟式区去未完成时)

  • libros: 书

  • cuadernos:第记本

:sodg1 *

  • su padre: 他的签管

  • trabajaba:(他)工作(trabajar的过去末完成时)

  • de portero: 作为]

  • en un edificio de lujo:在一栋豪华大楼里

  • en el centro de La ciucad: 在市中心

  • lerepito:我对性重复(repetir)

entrar y salir: 进述出出 tratar con ella:与她打交道 con qu é pal.abrasrelacionas:你将...与明些词联系起来

  • enfcrnero:男护士

enfermer ia:护理学:医务室 y con qué palabrarelacionas:你又将..与嘎个词联系起来 debutante:初次登台者 Pagina 227

  • hablando sc enticndc La gente:人们通过交谈相互理解(请语)

  • lee:你读(Leer)

  • cstos:这些

conentarios:评论

  • Sen ala con cu 6 1: 指出是哪个

  • est & s de acuerdo: 你网意 (estar de acuerde )

  • para hablar: 为了

uma lengua: 门语言 hay que conocer blen:左该要了解好

  • la grama tica: 语法

  • hablar una Lengua: 说—门语言

no es como Caperucita:不像小红帽 m台s 0 menos:或多或少:大機 para esto:为了这个

  • no necesitas: 你不需要 (necesitar )

  • cs suficiente con los gcstos:手就足够了

pero sinecesita:恒确实需震

  • planificaci 6n:规划

estudin:学习:研究 conc su pr actica:像它的实践一样

  • lo ma s inportante:最重要的

  • para aprender:为了学习

cs practicar:是炼习 es ma s importante eso que ...:那个t比..更重斐

  • cstudiar su gram a tica:学习它的语法

eres de los que practican:你是那些练习的人之

  • 0 de Los que estudian: 还是那些学习的人之一

veanoslo:让我们看看它(ver+lo)

  • marca las frases:标记这费句子

  • con las que te identificas: 你认同的那些

  • cuando el profesor pregunta: 当影辅提间时

en clase: 在课上

  • eres de Los primeros en contestar:伟是前批回答的人之一

solo hablas:你只说

  • cuando te preguntan: 当他们间你时

  • te da verg i enza:你感到害羞

quieres hablar mas:你想说更多

  • pcrc no tc atreves:但作不(atrevcrsc)

porque crees que:因为你认为

  • te vas a cquivocar:你将会把楼(cquivocarse)

  • te preocupa mucho: 你很担心 (preocupar )

  • coneter errores:扣错误

antes de hablar:在说语之前

  • piensas mucho:你犯很多

cono se dice:(某事)怎么说(decir)

  • e Intentas aplicar: 并A价授试药用(intentar aplicar)

  • aprovechas cualquier ocasi 6n: 你利用任何机会 (aprovechar)

para habtar: 为了说语 aunque na conozcas:即快你不认识(conocer的虚拟式现在时)

  • a La gente: 人]

  • intentas hablar sienpre:你总是尝试说(intentar]

  • en espa f ol: 用西斯牙语

  • con tus compa cros:和你的同学们

  • incluso con Los de tu misna Lengua:基至和那些说你同神语言的人

  • buscas sienpre anigos:你总是寻找朋友(buscar)

que hablen en espa iol:说西班牙语的(虚拟式现在时)

  • prefieres pasar tu tienpo Libre: 你更要欢度过伟的空闲时间 (preferir)

con personas de Lu misna nacionalidad : 和你何国箱的人

  • no te inporta equivocarte:你不介盘犯错 (inportar,equivocarse)

pueden entenderte:继们能理解你(poder,entender )

  • que es Lo inportante:这泉重要的事

te gusta que te corrijan: 你塞欢他们的正得 [gustar, corregir)

  • 1ncluso en p bL1co:基至在公共场合

  • te molesta que te interrunpan: 你反感他们打斯你 (molestar, interrumpir)

para corregirte: 为了纠证你

  • sienpre te parece:你总觉得(parecer)

que Los denas habLan mejor que t :别人说得比作好 影:uoToenjund

  • anota (..-) puntos por cada respuesta: 为每个国害记(..-)分 [anotar)

  • quccoincida con:与...—致的(coincidir的虚效式现在时)

  • las afirnativas / negativas:请定/否定呗

  • resultados:结果

de (...) a [...) puntos : 从(...)(... )分

  • tlenes que poner ma s empe i o: 得更努力

practicar es fundanental:练习是基础

  • para qu e quleres aprender: 价:为了什么想学

  • para hablar 。 < verdad 7: 为了说, 对明 7

  • entonces ,habla:那么,说吧

no te preocupes tanto: 别邯么担 (preocuparse)

  • por Los errores:为部些错误

  • equivocarse es natural :死错是自然的

  • en el aprendizaje: 在学习中

  • cl crror sirvc para aprender: 错误有助于学习(scrvir)

  • aden a s : 此外

  • si tc cquivocas:如果你犯错

  • es indicativo de que: x明...

  • debcnros estudiar ma s:我们应该学更多(deber)

un Lena concreto:一个具体的主题

  • tlenes que participar né s: 你特亚多餐与

en clase:在课上

  • s1no Lo sabes: 如果你不知道

  • todos tus profesores:你所有的老师

  • bien:好吧:很好地

sigue as i:爆姚这样(seguir) en poco tienpo:在短时间内

  • podras hacerlo:你将能做它(poder+hacer+lc)

con cuaLquier situaci 6n: 在任例情况下

  • sabcs lo quc quicres:你知道你想要什么

  • para entenderse es hablar:为了相互理能是说活(cntendcrse)

  • claro que cometes errores:当然作会招错

por corregir tus errores:通过纠正传的错误 pues aprender significa: 图为学习鲁账著 (significar]

  • 1r mejorando : 不额改速 (1r+mejorando)

  • no dejes de practicar: 不要停止练习 (dejar de)

  • pero tanbi én asiste a las clases: 但h去上误 (asistir)

y estudia:并且学习

  • La combinaci 6n: 结合

  • de la pr a ctica y la teor i a: 实践和理论的

  • es el canino né s r é pido: 是最快的路

  • y eficaz:和有效的

■ para un buen aprendizaje: 为了好的学习 Pagina 228

  • eval iα:我评估(evaluar)

m1 curso:我的误释 en grupos de cuatro: 四人一组

  • hablad:你们说[habLar的命令式)

  • sobre las caracter i sticas:关于特点

  • que ha de tener: 应该有的 (haber de tener)

un curso ideal:一个理想的课程 de espa ol : 西班牙请的

  • a continuaci6n:接下来

ponedLas en com in: f把它们分享/汇卷 (poner en com (i n)

  • los estudiantes:学生们

  • la clase:课堂

  • el profesor: 墓师

la escuela:学校 Lee Las opiniones:你读这暨观点 dc cste grupo:这个小爆的 sobre su curso:关于他们的课程 Y :onb oou3 ▪

  • creo que:我认为

  • el curso ha estado bien: 课程—直不错 (estar)

  • he aprendido nucho:: 我学了很多 (aprender )

Y ya puedo hablar: 并且我已经能说了 (poder) con espa ∩ oles:和西班牙人 yo tanbién: 我也 puedo conunicame blen:我能很好地交流【comunicarse】 pero creo que:但我认为

  • he practicado poco: R练习得少 (practicar)

  • el ano pasado:去年

estudiémucho:我学了很多(estudiar)

  • perc ne relacionaba poco:但我交往得少(relacionarsc)

porque no ten I a anigos:国为较没有朋友(tener)

  • con los quc hablar:可以与之交谈的

ahora:现在

  • hc conocido a muchos espa A oles:我认识了很多西班牙人(conocer)

y he practicado nucho:并且我练习了很多

  • yo no he aprendido mucho:我设学到慢多

porque todo esta:图为所有这

  • ya lo sab ia:我已经知道了(saber)

  • pero me lo he pasado muy bien: 但我过得很开心 (pas a rsela bien)

  • y tG qu é plensas:你怎么烈

de este cursa:关于这个课程

  • contesta el test:f国答潮试 (contestar)

  • y comenta tus respuestas:并且评论作的回答[conentar]

  • con tus compa f eros: 和你的同学们

con sinceridad: 真试地

  • nos ayudar á a mejorar: 这将帮动我们改进(ayudar,mejorar)

  • qu e te ha parccido:你觉得怎么样(parccer)

  • la clase:课量

nada:一点也不 poce:9许

  • normal: 正常的

  • bien:好

Buy bien: (张子 que piensas de:你宽得..怎么样(pensar)

  • de tus compa n eros:你同学们的

  • en clase: 在谦上

  • y de la actitud del profesor (a】:老师的座腺喔

c 6mo es:..是怎样的(ser)

  • la relaci6n:关系

del profesor(a} con Los alumnos:老师和学生的关系

  • cl profesor (a) te ha ayudado mucho:客师朝你很多了码(ayudar)

qué te ha parecido:你觉得怎么样

  • este libro:这本书

crees que:你认为 (creer)

  • los ejercicios para casa: 家应作业

  • han sido suficientes: 足够了码(ser)

  • crees que:你认为

las actividades para practicar : 习活动

  • han sido Interesantes: 有建码 (ser )

que piensas de:你宽得...怎么样 Los ejercicios:练习

  • cu a nto crees que has aprendido:你觉得你学了多少(aprender )

much I sino:非常多

  • observaciones:评论:备注

Pagina 229

  • Lee las opiniones:你读这暨戏点

  • de algunos estudiantes:一些学生的

yo creo que estudlar espa n ol:我认为学西辨牙语

  • ha sido muy divertido:—直很有趣(ser)

  • La grama tica , a veces: 语法, 有对

  • ha sido dif i cil:—直很殊 〔ser)

porque Los verbos tienen: 因为动词有 [tener)

  • muchas irregularidades:很多不规则性

el ingl é s no tiene tantas: 英请没有那么多

  • pero nonc ha parccido dif f cil:但我设觉得蓬

  • porque el profesor explica nuy bien: 因为老师解释得很好(explicar)

  • Y hcnros hablado nucho : 并且线们说了很多 (hablar)

  • ha sido pr a ctico y divertido:(这)既实用又有提

  • para目f:对我来说

el espa i al es una lengua f a cil : 西班牙语是门简单的语言

  • sobre todo La pronunciaci 6n: 特别是发膏

  • buena:好吧

yo soy itaL1ano:找易意大利人 y para n i el mayor problema:对我来说最大的问题 son Los acentos:是重音符号

  • que se usan de foma diferente:它们被不同继快用{usar)

  • el curso ha sido divertido: 课程—直有理

  • aunquc a veces:尽管有时

  • me aburr i a haciendo:我会到无聊数着...(aburrirse,hacer ]

  • algunos cjercicios:—世练习

  • aden a s : 比外

  • las clases empiezan: 课程开始 (enpezar)

denasiado tenprano: 太早 para f:对我来说 y algunos d as:并且有些天

  • me donm I a: 我会睡着 (domirse)

yo creo que la gran a tica: 我认为语法 es muy compL1cada:非常复杂

  • no hay muchas reglas::没有很多规则(haber)

y hay muchas excepclones: #日有截多外 me parece dif i cil:我觉得殊

  • aprender una Lengua: 学习门语言

  • quc tienc ma s cxccpcioncs quc rcglas:例外比规则多的

hay demasiados tienpos verbales : 有太多的动词时态

  • Yno sc sabe bien:并且人们不太清整(sabersc)

  • cu a ndo hay que utilizar : f么时候该用 (utilizar )

:oun epe> este curso ha sido muy u til: 这个误程一直很有用

  • Y ya puedo hablar un poco:我已经象说一点了

pero Lengo que estudiar mucho ma s:但我得学更多更多

  • hay muchas cosas que aprender: 有很多要学的东西

can cu1 de ellas:和她们中的邮一个

  • te 1dentificas: 物认网 (1dentificarse)

  • por que: 为什么

conenta tus opinlones:评论你的观点 con tus conpa i eros:和你的同学们 y entre tados:并且在所有人之阅 elaborad: 传们制作 (elaborar的命令式)

  • un peque n o informe:一份小报告

sobre el curso:关于误程

  • afe:年

a10:年 nivel:水平;级别 profesor/a:老师 aspectos positivos /negativos:积段/消极方南 lo mcjor/ pcor:最好的/最差的 en grupos de tres o cuatro: 三四人—纽

  • pensad en:你们组一想(pensar的命令式)

  • Las cosas 目as divertidas: 最有趣的事情

  • que han ocurrido: 已经发生的(ocurrir)

durante el curso:在课程期间

  • despu e s: 之后

conentadlas: 们弹坨魏们/它们 (conentar+ 1as )

  • con Los den á s grupos : 和其他小据

  • tarea:任务;作业

ya sabes: 已经地通了(saber)

  • lo que vas a hacer:你打算做的事(hacer)

  • después de este curso:这个误程之后

  • escribe:作写(escribir)

  • Lo que crees que har & s:你认为你将微的事(creer,hacer 的将采时}

  • cn cada uno dc estos nonrcntos:在这些时刻的每一个

  • el pr 6 ximo fin de senana: 下周末

  • cl pr 6 xino ncs : 下个月

  • despu é s de las vacaciones : 图期之后

  • el a fi o que viene: 明年

al finalizar nis estudios: 在我学业结束时 (finalizar ) Pagina 230

  • maneras:方式(manera的复数)

  • de vivir: 生活的

cultural:文化的 hoy:今天

  • las ciencias :科学(复致)

adelantan: 进步 (adelantar)

  • que es una barbaridad:(表示程度)真是了不起/太厉害了

en parejas:: 两人一坦

  • haced:你们低 (hacer的命令式)

uma lista:—份清单 de todos Los Inventos:所有发明的 inportantes:黑要的 que record 1s:你作)记将的(recordar的虚拟式理在时)

  • cual es:邸个是

elinvento:发明

  • tecnico:技术的

mé dico: 医学的 o cient i fico:或科学的 sin el que:没有它就...

  • La hunanidad:人英

no podr i a vivir: 不能生存(poder的条件式)

  • por qu: 么

preparad:们准备(preparar的命令式)

  • una presentaci 6n:一份展示

para toda la clase: 为全班

  • en la que expL1qu é 1s : 在其中存si解释(expL1car 的虑拟式现在时)

razcnadanente:合理地

  • cu a Les son: 明影是

  • los dos inventos:这两瞬发明

m&s 1nteresantes:最有理的

  • para vosotros:对你们来说

Pagina 231 en parefas :两人组 conoc eis:你们了解/认识(canecer )

  • Los Iinventos 目 é s Inportantes: 最垂要的发明

  • que ha producido: 已经生户/产生了的 (producir)

vuestro pa 1 s: 修们的国家

  • cuales son:即些是

y del mundo hisp anico:茜洲牙请重界的昵

  • buscad la infomaci on:你们直找他息(buscar)

en internet:在互联网上

  • lccd cstc texto:你们读这前课文(lccr)

y contestad las preguntas:并且国答间(contestar)

  • el progreso cient I fico: 科学港步

ha sido altamente beneficioso:—直是高度有益的

  • para La humanidad:对人类来说

la esperanza de vida: 预期寿命

  • ha aunentado:已经增长了(aunentar)

de manera considerable: 相当大地

  • y se han descubierto:并B已经技发残了(descubrir)

  • tratanientos:疗法

para nuchas enfenmedades:针对许多疾病

  • la producci 6n agr i cola: 农业生产

  • ha Lncrenentado: 已经增加了 (Increnentar )

  • en muchos Lugares del nundo:在世界许多地方

para atender:为了满尼/照料(atender)

  • las crecientes nccesidades:日益增长的需求

de la poblaci6n: 人口的

  • gracias al: 多亏了...

progreso tecnol 6 gico: 技术造步 y a la expLotaci 6n:以及对..,的开发利用(explotaci 6 n) de muevas fuentes de energ ia: 新能源的

  • La humanidad ha podido: 人类已经能够(poder )

  • Liberarse de: 报股 (liberarse)

Los trabajos penosos: 繁重的工作

  • las tecnolog i as basadas en:基于..,的技术

  • nuevos né todos de conunicaci 6n: 斯的通讯方式

  • y trataniento de 1a infornaci 6n:以及他息处理

0infoma tica:或信息技术

  • tanbi en han generado: 也产生了 (generar)

grandes oportunidades:巨大机遇

  • para el estudio cient i fico:为了科学研究

  • la enpresa: 企业

Y para la sociedad en gcneral:以及为盈个社会

  • las ciencias se han constituido en: 科掌已经梅成了 (constituirse)

  • una herramienta noderma: —个现代工具

para La adquisici 6 n de conociniento:: 为了知识的获取 para La hunanidad:对人类而言 ■sinlaaplicaci6n:没有...的应用

  • delacienciaydelatecnologia:科学和技术的

■seguiriamosatascados:我们会继续陷于(seguir,atascar的条件式) 圣:opesed1aua ■enelpasado:在过去

  • hoy masquenunca:今天比以往任何时候都更

  • la cienciay sus aplicaciones:科学及其应用

■sonindispensables:是不可或缺的 ■paraeldesarrollo:对发展而言 ■es necesariofomentar:有必要促进(fomentar) ■y difundir:和传播(difundir)

  • la alfabetizaci6ncientifica:科学素养/扫盲

■en todas las culturas:在所有文化中 ■y en todos los sectores:以及在所有领域(sector) delasociedad:社会的 ■creesque:你认为 ■el trabajo en elcampo:农活 ■esahora mas sencillo:现在更简单了吗(sencillo) ■que antes:比以前 ■por qué:为什么 ■quéelementos:什么要素(elemento)

  • hancontribuido aello:对此做出了贡献(contribuir)

■enqué medida:在多大程度上(medida) ■creesquehainfluido:你认为影响了(influir) ■la nueva red de intercomunicaciones:新的互联网络 ■enlaciencia:在科学上 ■engrupos:分组 ■preparadunreportaje:你们准备一份报道(preparar) ■paraun diariodigital:为一份数字报纸 ■quemuestre:展示...的(mostrar的虚拟式现在时) ■comoeralavida:生活是怎样的(ser) ■en1492,1850,1950:在1492,1850,1950年 ■yahora:和现在 sabiasque:你知道...吗(saber) ■Galileo:伽利略 ■invent6:发明了(inventar) ■eltermometro:温度计 ■sabesquéotroaparato:你知道什么别的仪器(aparato) diseno:设计了(disenar) ■paraobservarelcielo:用来观察天空 III. Maneras de VIvIR: jHoy las ciencias adelantan que es una barbaridad! (p.230-231) A.语法运用观察(UsoGramaticalObservado) ■命令式(Imperativo):用于活动指令(Haced,Buscad,Preparad,Explicad)。

  • 时态运用(TiemposVerbales):阅读文本中使用了现在时描述科学进步的普遍状态和影响。

C.文化信息(InformacionCultural)

  • 伽利略(Galileo):提及他发明了温度计(term6metro)和用于观察天空的仪器(望远

镜/telescopio)。

NOTE·目录三 <上一篇 下一篇> 走遍西班牙第一册-第十单元《Ymaiana, 从助记词到以太坊地址--钱包创建全解析 qué?》Ambito1详细笔记

原始排版图

原始导出图超过单张 WebP 的尺寸上限,以下图片按从上到下的顺序连续保存。 走遍西班牙第一册 - 第十单元《Y mañana, ¿qué?》Ámbito 2详细笔记:微信公众号导出原始排版图(第 1 段,共 2 段) 走遍西班牙第一册 - 第十单元《Y mañana, ¿qué?》Ámbito 2详细笔记:微信公众号导出原始排版图(第 2 段,共 2 段)