ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

抖音视频播放解析:aweme_id 与 video_id 的分工

抖音视频播放解析:aweme_id 与 video_id 的分工

抖音视频播放解析:aweme_id 与 video_id 的分工

【免费下载链接】douyinVue3 + Pinia 仿抖音,Vue 在移动端的最佳实践 . Imitate TikTok ,Vue Best practices on Mobile项目地址: https://gitcode.com/GitHub_Trending/do/douyin

手里攥着一个 19 位数字,以为万事俱备,往浏览器一贴却发现画面毫无动静。在 douyin-vue(Vue3 + Pinia 实现、支持无限滑动视频播放的仿抖音项目)里,每条视频记录都同时带着两个标识:aweme_id 与 video_id。前者负责查询标题、作者、评论这类元信息,后者才用于视频播放时取回真实码流,搞混两者的角色是接触抖音数据时最常踩的坑。

两个编号各管什么

先给结论:两个编号是"作品"与"文件"两条平行标识,谁也推导不出谁。用寄快递来类比,aweme_id 是作品的身份证号,video_id 是视频文件的快递单号——身份证号能在任何柜台查档案,单号只能用来取件,两者从不通用。

维度aweme_id(作品身份证号)video_id(文件快递单号)
形态19 位纯数字,如7265649807396474112v开头加字母数字,如v0300fg10000cna0c8bc77ufge7emlsg
职责唯一标识"这是哪条作品",查详情、评论、作者列表的接口入参唯一标识"CDN 上哪份文件",拼接播放地址的核心参数
在数据中的位置public/data/videos.json 每条记录的顶层字段藏在video.play_addr里:uri字段,以及url_listURL 的video_id参数
能否互相推导不能不能

这里还藏着一个命名陷阱:public/data/comments/ 下的video_id_7260749400622894336.json这类文件名,后缀数字其实全是 aweme_id,"video_id_"前缀只是历史命名。

📡 一次播放请求的生命周期

播放地址不需要现场拼,快照里早已备齐,直接喂给<video>标签即可。video_id 并不是顶层字段,它在video.play_addr里以两种形态出现:

{ "uri": "v0300fg10000cna0c8bc77ufge7emlsg", "url_list": ["https://www.douyin.com/aweme/v1/play/?video_id=...&file_id=...&sign=..."] }
  • uri:video_id 本体,即这份文件的"单号"。
  • url_list:服务端拼好的完整播放地址,除video_id外还带着file_id(文件指纹)与sign(时效性签名)。

sign 的存在说明一件事:video_id 单独换不回文件,它必须配着 sign 才能取件。而这个签名会过期,所以项目直接存完整 URL 列表,不存裸的 video_id 让你现场拼。

完整链路四步走:

  1. 前端 src/api/videos.ts 发起请求,如recommendedVideo()请求/video/recommended,职责只是"发请求、收数据"。
  2. src/mock/index.ts 用 axios-mock-adapter 拦截这些请求,从本地allRecommendVideos(初始为打包的 src/assets/data/posts6.json,启动后还会拉取 public/data/videos.md 合并进来)按页切片返回。
  3. 组件拿到数据后直接消费url_list,对应代码在 src/components/slide/BaseVideo.vue:
<video :autoplay="isPlay"> <source v-for="(urlItem, index) in item.video.play_addr.url_list" :src="urlItem" type="video/mp4" /> </video>
  1. 浏览器请求该 URL,码流开始播放。file_id 与 sign 只是 URL 里的参数,前端从不计算它们。

为什么 mock 层不实时拼地址

因为项目刻意把"查数据"和"播放"拆成两条互不交叉的泳道,而实时拼地址恰好是前端做不了的那一步。

  • 查询泳道(以 aweme_id 为键):点击评论入口时用props.item.aweme_id请求/video/comments,mock 层去 public/data/comments/ 找video_id_{id}.json;这些小文件由 node/comment/process.js 按 aweme_id 从大份评论 JSON 里逐条过滤拆分而来。
  • 播放泳道(以 video_id 为键):play_addr.url_list直接进<video>标签,中间没有任何拼接步骤。

不实时计算不是偷懒,是硬约束:能播的地址必须有有效 sign,它只能由抖音服务端签发且有时效,纯前端演示拿不到实时签名。于是"一次抓快照、反复回放"成为唯一自洽的方案,代价是数据带保质期——地址会随时间陆续失效,项目因此把数据定位为一次性快照,而非长期信源。

📦 自己备数据的最短取数路径

接口响应是最省事的来源:拿到作品列表接口的原始响应后,video.play_addr.uri就是 video_id,url_list就是拼好的播放地址。node/post/process-post.js 演示了整理动作——把原始aweme_list按字段白名单裁剪,只保留play_addr等项目需要的部分,再合并进本地用户视频列表供 mock 层消费。

两点提醒:

  • 别把 aweme_id 填进play/?video_id=参数,它只认 video_id,传错类型必然失败。
  • 地址里的 sign 有时效,长期服务要考虑定期刷新,演示用途则一次性快照足够。

小结

整条链路一句话收束:aweme_id 负责找到作品,video_id 负责找到文件,sign 负责证明你此刻有资格播放。douyin-vue 不触碰其中任何一步的实时逻辑,只把快照交给 mock 层回放,前端即可完整体验无限滑动的视频流。

git clone https://gitcode.com/GitHub_Trending/do/douyin cd douyin pnpm install pnpm dev

【免费下载链接】douyinVue3 + Pinia 仿抖音,Vue 在移动端的最佳实践 . Imitate TikTok ,Vue Best practices on Mobile项目地址: https://gitcode.com/GitHub_Trending/do/douyin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进