Android 深入系统完全讲解(28)

Posted 程序员入门进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 深入系统完全讲解(28)相关的知识,希望对你有一定的参考价值。

先把这个理顺了,这些内容打通,对于学习音视频非常有用。
当我们知道这个,我们再来看个东西,MediaExtractor ,这个是媒体的提取类。把音视频进
行分离。
我们的视频有两部分组成,音频和视频,这两个是在不同的轨道上,默认是一个视频轨道,
一个是音频轨道。但是有时候会有多个音轨,比如选择器里面的国语,港语这类选择,实际
就是多个音轨,选择不同的来播放。
它们在同一个校准时钟下运行,保证同步。
这里我们看下 Demo:
mFile = new File(getExternalCacheDir(),“demo.mp4”);
MediaExtractor extractor = new MediaExtractor();//实例一个 MediaExtractor
extractor.setDataSource(mFile.getAbsolutePath());//设置添加 MP4 文件路径
int count = extractor.getTrackCount();//获取轨道数量
Log.e(TAG, "轨道数量 = “+count);
for (int i = 0; i < count; i++)
MediaFormat mediaFormat = extractor.getTrackFormat(0);
Log.e(TAG, i+” 编 号 通 道 格 式 =
"+mediaFormat.getString(MediaFormat.KEY_MIME));

打印出来轨道的格式,这里会出来
video/avc
audio/mp4a-latm
/后面的会变化,代表具体的格式,这个格式是解析轨道的时候需要的。前面的用来判断是
视频还是音频信息。
当我们获取到具体的轨道后,可以获得一些信息:
基本可以获取到的信息

  1. 获取 MIME 信息
  2. MediaFormat mediaFormat = extractor.getTrackFormat(0);//获取多媒体格式,因为是 demo 已经
    确定自己的视频文件没问题,所以直接获取 0 位轨道
    String mimeFormat = mediaFormat.getString(MediaFormat.KEY_MIME);//获取 MIME 格式内容
    Log.e(TAG, “mediaExtractor: 获取 MIME 格式内容=”+mimeFormat);
    2.获取语言格式(大多数情况是获取到空的字符串,但是至少不会报 null)
    MediaFormat mediaFormat = extractor.getTrackFormat(0);
    String language = mediaFormat.getString(MediaFormat.KEY_LANGUAGE);//获取语言格式内容
    Log.e(TAG, “mediaExtractor: 获取语言格式内容=”+language);
    3.视频的高度与宽度
    MediaFormat mediaFormat = extractor.getTrackFormat(0);
    int width = mediaFormat.getInteger(MediaFormat.KEY_WIDTH);//获取高度
    int height = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT);//获取高度
    4.播放总时长
    long durationTime = mediaFormat.getLong(MediaFormat.KEY_DURATION);//总时间
    5.获取 MediaFormat 描述的数据缓冲区的最大字节数的键
    int maxByteCount = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);//获取视频
    缓存输出的最大大小
    不确定可以获取到的信息
    1.获取采样率
    int sampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);//获取采样率
    2.获取比特率
    int bitRate = mediaFormat.getInteger(MediaFormat.KEY_BIT_RATE);//获取比特
    3.获取声道数量
    int channelCount = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);//获取 声道
    数量
    4.获取最大高度与最大宽度
    int maxWidth = mediaFormat.getInteger(MediaFormat.KEY_MAX_WIDTH);//最大宽度
    int maxHeight = mediaFormat.getInteger(MediaFormat.KEY_MAX_HEIGHT);//最大高度
    5.获取颜色格式
    int colorFormat = mediaFormat.getInteger(MediaFormat.KEY_COLOR_FORMAT);//颜色格式
    6.获取帧率
    int frameRate = mediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE);//帧率
    7.获取图块的高度与宽度
    int tileWidth = mediaFormat.getInteger(MediaFormat.KEY_TILE_WIDTH);//图块分辨率int tileHeight = mediaFormat.getInteger(MediaFormat.KEY_TILE_HEIGHT);//图块分辨率
    8.获取网格行
    int gridRows = mediaFormat.getInteger(MediaFormat.KEY_GRID_ROWS);//网格行
    9.获取网格列
    int gridColumns = mediaFormat.getInteger(MediaFormat.KEY_GRID_COLUMNS);//网格列
    10.PCM-编码 模拟信号编码
    int pcmEncoding = mediaFormat.getInteger(MediaFormat.KEY_PCM_ENCODING);//PCM- 编 码
    模拟信号编码
    11.捕获率
    float captureRate = mediaFormat.getFloat(MediaFormat.KEY_CAPTURE_RATE);//捕获率
    12.是否是 AAS
    int isAdts = mediaFormat.getInteger(MediaFormat.KEY_IS_ADTS);
    我们拿到数据之后,就可以进行处理,解码转码操作:

以上是关于Android 深入系统完全讲解(28)的主要内容,如果未能解决你的问题,请参考以下文章

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(31)

Android 深入系统完全讲解(31)

Android深入系统完全讲解(38)

Android深入系统完全讲解(38)