算起来从出第一版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
没有评论 :
发表评论