Android音视频开发-播放视频(使用MediaExtractor、MediaCodec、AudioTract、SurfaceView)

看了一大堆的音视频理论知识,还是得实操一下。
这次就来实现一个播放视频的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整个播放数据到音频池
全部评论

相关推荐

03-12 21:51
门头沟学院 C++
pdd卡怎么严吗 笔试a出来两道,第三题a出来20%直接给挂了😭😭😭
鳍足目:我a了2.5道也挂了,但是组里同学只a了1.6道进面了,而且我和他都是无实习,本硕同校,感觉全是玄学
投递拼多多集团-PDD等公司10个岗位 > 拼多多求职进展汇总
点赞 评论 收藏
分享
点赞 评论 收藏
分享
03-13 12:48
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务