東川印記

一本東川,笑看爭龍斗虎;寰茫兦者,度橫佰昧人生。

Exoplayer学习01连襟关系

2021年5月16日星期日



算起来从出第一版demo到现在已经很久了。。。。

其间经历了 KODI、VLC、一堆稀奇古怪的播放器,最后终究还是要debug exoplayer的。。。。

如果只是视频播放没有碰到问题,4K 8K 都游刃有余,没想到卡到了多声道上。。。。

设备怎么都不能输出多声道,大概是 系统HDMI握手问题,但是要实际上线的话,就得去手动改Exoplayer了。。。。

想要通过 HDMI 和 S/PDIF线分别实现 直通传递多声道数据跟解码传递多声道数据,一个直通搞好久,问issus,结果答复默认会自己支持,我测得要是能自己支持我还需要问吗。。。。

哎。。。。

exoplayer的hello world https://exoplayer.dev/hello-world.html

对于大部分编码都是支持的,没授权的Dolby也可以通过 FFmpeg来软解 https://exoplayer.dev/supported-formats.html

当然,对于设备最低版本也是有要求的 https://exoplayer.dev/supported-devices.html

另外,还支持DRM。。。。

功能很强大,但是  demo为啥搞那么复杂,无关核心内容的东西太多了。。。。

看对于exoplayer对直通的介绍,没想到还区分了这么多情况 https://source.android.com/devices/tv/multimedia-tunneling

也就是说,从android媒体框架来说,是支持这么多方式的:

1,纯软件(本地解码)

2,压缩音频分流

3,压缩音频直通

4,多媒体隧道

5,多媒体直通

真是甩了一手好锅啊。。。。

当然,exoplayer也颇具google风格,架构图中便可处处透漏着甩锅的坑人气息。。。。

几个眼熟已久的词

ABR
自适应比特率
Adaptive Bitrate.
AVC
H.264的编码格式
Advanced Video Coding,
HEVC
H.265的编码格式
High Efficiency Video Coding
DASH
http动态自适应流
Dynamic Adaptive Streaming over HTTP,定义于ISO/IEC 23009
HLS
苹果的http实时流
HTTP Live Streaming
Smooth Streaming
微软的自适应流协议
Microsoft’s adaptive streaming protocol.
DRM
数字版权管理
Digital Rights Management.
Track
video track,audio track等
A single audio, video, text or metadata stream within a piece of media
AudioTrack
一套Android API用来播放音频

An Android API for playing audio.

CDM
内容解密模块
Content Decryption Module
IMA
互动媒体广告SDK
Interactive Media Ads.
audio offload
音频分载
音频由dsp解码,不走omx框架
Passthrough
音频直通
不解码音频,直接发送到播放设备
DSP
数字信号处理器
digital signal processor
omx
open max 解码器
open max
PCM
脉冲编码调制
Pulse-Code Modulation.
MPD
媒体演示说明
Media Presentation Description.
架构里的:


BandwidthMeter
网络带宽组件
估算网络带宽的组件,从而根据带宽自适应播放
DataSource
数据源
请求数据的组件,如http或本地文件
Extractor
媒体提取器
解析媒体信息,输出音视频及轨道信息
LoadControl 加载控制
控制开始、停止、播放
MediaSource 媒体来源
媒体结构信息,创建MediaPeriod实例
MediaPeriod 媒体Period
加载单个媒体,并允许读取加载的媒体
Renderer
渲染器
读取,解码和渲染媒体样本的组件
Timeline
时间线
时间线能代表各种媒体结构,从简单到复杂的构成。
TrackGroup
轨道分组
一个或多个包含相同音视频内容的组,如不同比特率的组
TrackSelection
音轨选择
如自适应流中,选择从组中下一个加载哪个媒体块
TrackSelector
音轨选择器
选择要播放的音轨。每个TrackSelector为TrackSelection生成一个Renderer.

这么多年了,Thunderbird就不知道更新一下表格功能。。。。

官方播放网络流的例子

 首先,数据流进入Loader中的DataSource,识别MediaSource类型给extractor,用来解析容器格式和轨道信息,获取到audio/video的元数据后,分别送入相应渲染器renderer中,就到了图二.

renderer会调用解码器解码,并将解码后的数据 写入AudioTrack播放音频,Surface播放视频。

常用的 SimpleExoPlayer 实现了 ExoPlayer,ExoPlayer是个接口,它又继承了Player这个接口

public class SimpleExoPlayer extends BasePlayer implements ExoPlayer, Player.AudioComponent, Player.VideoComponent, Player.TextComponent, Player.MetadataComponent, Player.DeviceComponent {}

BasePlayer 实现了Player接口。

public abstract class BasePlayer implements Player {}

ExoPlayer是个接口,它继承了Player接口

Cluster-exoplayer2-ExoPlayer

ExoPlayer有三个实现类,负责干活的ExoPlayerImpl,负责对外场面的SimpleExoPlayer,另外StubExoPlayer看起来是用于测试的。

final class ExoPlayerImpl extends BasePlayer implements ExoPlayer {}

public class SimpleExoPlayer extends BasePlayer implements ExoPlayer, Player.AudioComponent, Player.VideoComponent, Player.TextComponent, Player.MetadataComponent, Player.DeviceComponent {}

public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {}

Player接口有一个实现类,对他的基本实现BasePlayer

public abstract class BasePlayer implements Player {}

BasePlayer这个抽象类有三个子类

public final class CastPlayer extends BasePlayer {}

final class ExoPlayerImpl extends BasePlayer implements ExoPlayer {}

public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {}

final class FakePlayer extends StubExoPlayer {

public class SimpleExoPlayer extends BasePlayer implements ExoPlayer, Player.AudioComponent, Player.VideoComponent, Player.TextComponent, Player.MetadataComponent, Player.DeviceComponent {}

这个关系像极了娱乐圈。。。。

那么问题来了,ExoPlayer跟BasePlayer是什么关系?

没错,是连襟。。。。

根据以上得知,选一个好的源码查看工具是多么的重要

太特么闹心了,这破工具,。,。。。。

明天去公司加个全的。。。。
2021年05月16日15:10:18



--
senRsl
2021年05月15日17:29:12

没有评论 :

发表评论