我们使用MediaExtractor提取视频文件基本信息的时候,发现有display-width display-height与width height
例如我们使用MediaExtractor 提取 视频各轨道基本信息的时候:
MediaExtractor mediaExtractor = new MediaExtractor();
mediaExtractor.setDataSource(inputPath);
for (int index = 0; index < mediaExtractor.getTrackCount(); index++) {
MediaFormat format = mediaExtractor.getTrackFormat(index);
LogUtils.w("format = " + format);
}
打印出来的视频轨道 格式信息:
{track-id=1, level=512, mime=video/avc, profile=8, language=und, display-width=720, csd-1=java.nio.HeapByteBuffer[pos=0 lim=10 cap=10], durationUs=47100000, display-height=1280, width=720, max-input-size=103124, frame-rate=30, height=1280, csd-0=java.nio.HeapByteBuffer[pos=0 lim=30 cap=30]}
display-width=720
display-height=1280
width=720
height=1280
这似乎是没有争议的,display-width 与width一样,display-height与height一样;
但实际上这两者是不一样的;
下面看一个视频打印出来的轨道格式信息:
{track-id=1, level=128, mime=video/avc, profile=8, language=und, display-width=225, csd-1=java.nio.HeapByteBuffer[pos=0 lim=9 cap=9], durationUs=322333333, display-height=400, width=700, max-input-size=21340, frame-rate=15, height=400, csd-0=java.nio.HeapByteBuffer[pos=0 lim=34 cap=34]}
display-width=225
display-height=400
width=700
height=400
这两者不仅大小不一样,而且比例还不一样,那这是怎么回事了?
可以用ffmpeg 取探测一下:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test4.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.40.101
comment : 91flv.com,做你想要的视频网站!
Duration: 00:05:22.33, start: 0.000000, bitrate: 362 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 700x400 [SAR 9:28 DAR 9:16], 296 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 62 kb/s (default)
Metadata:
handler_name : SoundHandler
视频流的信息打印出来了:
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 700x400 [SAR 9:28 DAR 9:16], 296 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)
700x400 这个就是视频的宽高;
后面的SAR 和DAR 是什么意思?
- SAR —— Sample Aspect Ratio 采样横纵比。表示横向的像素点数和纵向的像素点数的比值。
- DAR —— Display Aspect Ratio 显示横纵比。最终显示的图像在长度单位上的横纵比。
- PAR —— Pixel Aspect Ratio 像素横纵比。表示每个像素的宽度与长度的比值。可以认为每个像素不是正方形的。
标准播放流程是先识别视频的DAR,如果没有DAR,就按照SAR播放;
对于MediaExtractor 解析出来的视频轨道的格式信息:
display-width / display-height 对应的就是DAR; MediaFormat 中没有SAR的信息;
如果我们播放视频,优先按照display-width display-height来确定视频大小;