先把这个理顺了,这些内容打通,对于学习音视频非常有用。
当我们知道这个,我们再来看个东西,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
/后面的会变化,代表具体的格式,这个格式是解析轨道的时候需要的。前面的用来判断是
视频还是音频信息。
当我们获取到具体的轨道后,可以获得一些信息:
基本可以获取到的信息文章来源地址https://www.toymoban.com/news/detail-424297.html
- 获取 MIME 信息
- 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);
我们拿到数据之后,就可以进行处理,解码转码操作:
文章来源:https://www.toymoban.com/news/detail-424297.html
到了这里,关于Android 深入系统完全讲解(28)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!