我们来阅读一下WXInlinePlayer的源码,本来像一篇博文写完,但是发现这样不好看也不好写,一口吃不成一个大胖子。这篇先讲一下WXInlinePlayer的整体代码介绍。
代码目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# tree . -I 'node_modules|dist|*.o|CMakeFiles|*.c|test|*.a' -L 4
# 下面这些一般来说有后缀的是文件,没后缀的是文件夹,除了LICENSE
.
├── build.sh # 编译脚本
├── package.json # 项目所需要的javascript模块
├── LICENSE # Anti-996协议
├── README.md
├── example # 例子目录
│ ├── index.html
│ ├── index.js
│ ├── prod.all.asm.combine.js
│ ├── prod.all.wasm.combine.js
│ ├── prod.baseline.asm.combine.js
│ ├── prod.baseline.wasm.combine.js
│ ├── prod.h265.asm.combine.js
│ └── prod.h265.wasm.combine.js
├── lib # 总C++代码部分,包括第三方代码,以及一些胶水js
│ └── codec
│ ├── 3rdparty # 第三方解码器源码
│ │ ├── de265
│ │ ├── openh264
│ │ └── tinyh264
│ ├── build.sh # 编译这个lib部分的脚本,包括c++代码和胶水js拼装
│ ├── CMakeLists.txt
│ ├── combine # js胶水代码
│ │ └── glue.js
│ ├── src # WXInlinePlayer自己的c++代码目录
│ │ ├── config.h # 使用lib/codec/tool/compile.js生成的配置文件
│ │ ├── main.cpp # C++部分暴露的外部入口
│ │ ├── codec # 解码器类定义文件夹,外部入口调用这个
│ │ ├── demuxer # 解封装FLV文件
│ │ ├── factor # 上报解码器的结果
│ │ ├── helper # 对最终产品没用,用于编译本地可执行文件的帮助代码
│ │ └── stream # 定义一些buffer类,适用于流处理
│ └── tool
│ ├── compile.js # 用于生成CMakeLists.txt和config.h的脚本工具
│ └── wrapper.js # 用于生成最终js解封装解码js的脚本工具
└── src # javascript源码目录
├── index.js # 外部API调用定义
├── processor # 播放器js部分主要逻辑框架代码
│ └── processor.js
├── loader # 数据源加载器,这里是下载FLV文件
│ ├── chunk.js
│ ├── loader.js
│ └── stream.js
├── drawer # 在canvas上绘制YUV图片
│ └── drawer.js
├── sound # 音频播放
│ ├── browser.js
│ ├── sound.js
│ └── wechat.js
└── util # 一些javascript工具类
├── ticker.js
└── util.js
|
整体框架
大致代码结构就是这样,javascript部分负责加载数据、绘制YUV图像、用AudioContext播放音频、音视频同步控制;C++代码部分负责解封装FLV文件,并将解封装的视频数据拼成NALUs喂给第三方解码器,音频则封装成ADTS传到javascript部分播放,脚本数据弄成mediaInfo上报给js部分;第三方解码器专心处理视频流数据。
文章作者
shandowc
上次更新
2020-07-15
(7a1c413)