看了一大堆的音视频理论知识,还是得实操一下。
这次就来实现一个播放视频的Demo吧。
使用到如下几个类:
- MediaExtractor
extractor意思就是提取器,功能就是提取我们所需的流(音频/视频),选取指定的track。
常用Api |
功能介绍 |
setDataSource(String path) |
设置数据的来源(文件路径or网络流的url地址) |
int getTrackCount() |
获取数据源中的轨道数量(音频轨道、视频轨道) |
MediaFormat getTrackFormat(int index) |
获取某个轨道的格式 |
native void selectTrack() |
选定指定的轨道,多次选择只有一次生效 |
native int readSampleData(@NonNull ByteBuffer byteBuf, int offset); |
检索当前编码样本并且把它存储到给定起始位置的字节缓冲区 |
public native long getSampleTime() |
返回当前样本的描述时间(微秒) |
public native boolean advance() |
推进到下一个样本,如果没有更多样本则返回false |
- MediaCodec
编解码器,传入指定的容器格式即可创建。
常用Api |
功能介绍 |
static MediaCodec createDecoderByType(@NonNull String type) |
实例化指定类型解码器 |
static MediaCodec createEncoderByType(@NonNull String type) |
实例化指定类型编码器 |
void configure(MediaFormat format,Surface surface,MediaCrypto crypto,int flags) |
配置这个编解码器,如果需要构造一个编码器则需指定flags为CONFIGURE_FLAG_ENCODE。surface:是否需要渲染,可传入null,crtpto:加密对象来保证数据解码的安全 |
- MediaFormat
媒体一些元数据信息(容器格式、采样率、声道等)
常用KEY |
介绍 |
KEY_MIME |
容器格式 |
KEY_SAMPLE_RATE |
采样率 |
KEY_CHANNEL_COUNT |
channel数量 |
KEY_WIDTH |
视频的width |
KEY_HEIGHT |
视频的height |
KEY_MAX_INPUT_SIZE |
数据缓冲区最大大小 |
KEY_BIT_RATE |
比特率 |
- AudioTract
相对于MeidaPlayer更底层的音频播放器,只能播放PCM裸数据,但是更具有拓展性。
常用Api |
功能介绍 |
AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes, int mode) |
已弃用 |
AudioTrack(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes,int mode, int sessionId) |
使用builder构造相应的属性; mode:指定播放器的模式,streamiing or static buffer;bufferSizeInBytes:缓冲池大小,建议使用AudioRecord.getMinBufferSize获取; |
int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes) |
写入数据到音频池; Streaming mode:阻塞直到完全写入,并返回一个完整的数据转移数量,否则由于线程被中断等其他原因则会返回一个较短的数据转移数量;Static buffer mode:Copy整个播放数据到音频池 |