<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ExoPlayer on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/exoplayer/</link><description>Recent content in ExoPlayer on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 02 Jun 2026 20:30:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/exoplayer/index.xml" rel="self" type="application/rss+xml"/><item><title>AIRead 实战拆解：KMM 语音播报 SDK 从 start 到双端播放链路</title><link>https://amatsuzero.github.io/LastStand/posts/kmmaireadpractice/</link><pubDate>Tue, 02 Jun 2026 20:30:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/kmmaireadpractice/</guid><description>&lt;h2 id="阅读导航建议先看"&gt;阅读导航（建议先看）&lt;/h2&gt;
&lt;p&gt;如果你是第一次接触这套 SDK，建议按下面顺序读：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先看 2 章&lt;/strong&gt;：理解 commonMain 与双端 actual 的职责边界；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再看 5~6 章&lt;/strong&gt;：把“主流程 + 双端播放器实现”串起来；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后看 10 章&lt;/strong&gt;：按需查 Debug 手册，不必一次读完。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你只想快速建立整体认知，优先看 &lt;code&gt;0 + 5 + 9 + 12&lt;/code&gt; 四节即可。&lt;/p&gt;
&lt;h2 id="0-这篇写什么"&gt;0. 这篇写什么&lt;/h2&gt;
&lt;p&gt;这篇不再重复 KMM 概念，而是聚焦一件事：&lt;strong&gt;AIRead 这套 KMM SDK 在工程上到底怎么跑起来&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;会重点回答四个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;工程目录怎么分层；&lt;/li&gt;
&lt;li&gt;核心 API 给了什么能力；&lt;/li&gt;
&lt;li&gt;从 &lt;code&gt;start(contentId, sentenceId)&lt;/code&gt; 到播放/高亮/回调/重连，链路如何闭环；&lt;/li&gt;
&lt;li&gt;Android（ExoPlayer）和 iOS（AVPlayer）分别承担了什么。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;KMM 基础与平台适配背景放在上一篇：&lt;a href="https://amatsuzero.github.io/LastStand/posts/kmm/"&gt;KMM 基础篇&lt;/a&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-仓库目录总览"&gt;1. 仓库目录总览&lt;/h2&gt;
&lt;p&gt;AIRead 仓库根目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AIRead/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── androidApp/ # Android 示例应用（Compose + WebView）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── iosApp/ # iOS 示例应用（SwiftUI + WKWebView）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── shared/ # KMM SDK 主模块
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── gradle/ # 版本目录、发布脚本、wrapper
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── build.gradle.kts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── settings.gradle.kts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── gradle.properties
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── README.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先按根目录分工看一眼：&lt;/p&gt;</description></item></channel></rss>