什么视频格式将在所有Android设备上播放?

时间:2011-02-23 21:06:04

标签: android video

Android可以播放variety of video formats,但我需要选择一种适用于所有设备的格式。

所有Android 2.3设备是否支持完全相同的格式?即如果格式将在模拟器中播放,这是否意味着它也将在所有硬件上播放?或者不同的设备是否支持不同的格式,具体取决于它们具有哪些解码器芯片?

如果它们完全相同,那么显然最好的格式是H.264,具有高比特率和分辨率。如果没有,那么90%的设备上最好的编解码器/比特率/分辨率是多少?谷歌是否提供了一些查询设备视频功能和选择合适格式的方法?

3 个答案:

答案 0 :(得分:21)

在很多设备上测试后(对于非常受欢迎的应用的视频闪屏)。我的建议是:

video codec : H.264 
file format: .mp4
video bitrate: 256kbps
video frame/second: 24

注意:我的视频没有声音!!

但即使有了这个建议,有些视频因其解决方案而无效。 所以我创建了一个棘手的代码:我在我的raw文件夹中嵌入了我所有密度的所有视频,向我的setOnErrorListener添加了VideoView我尝试每次启动一个较小的视频发生错误。

这是我的原始文件夹:

raw/
   splashmdpi.mp4
   splashhdpi.mp4
   splashxhdpi.mp4

这是我的java代码:

int densityoffset = 0;
VideoView video = new VideoView(this);

video.setOnPreparedListener(new OnPreparedListener() {
             @Override
                 public void onPrepared(MediaPlayer mp) {
                    video.start();
                    }
 }

video.setOnErrorListener(new OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                densityoffset++;
                String suff = getDensitySuffix(getContext(), densityoffset);
                video.setVideoPath("android.resource://com.example.packagename/raw/splash"+suff);
                if(offset>5)
                    return false;
                else


                    return true;
                }
            });

String suff = getDensitySuffix(this,offset);
video.setVideoPath("android.resource://com.example.packagename/raw/splash"+suff);

private String suffix[]={"ldpi","mdpi","hdpi","xhdpi"};

/**
*Return the suffix concerning your device less offset value
**/
private String getDensitySuffix(Context ctx, int offset){
        int dens = 2;
        int d = getContext().getResources().getDisplayMetrics().densityDpi
        if(d==DisplayMetrics.DENSITY_LOW)
            dens = 0;
        else
            if(d==DisplayMetrics.DENSITY_MEDIUM)
                dens = 1;
            else
                if(d==DisplayMetrics.DENSITY_HIGH))
                    dens = 2;
                else
                    if(d==DisplayMetrics.DENSITY_XHIGH))
                        dens = 3;   
        return suffix[Math.max(0, dens-offset)];
    }

答案 1 :(得分:6)

仿真器对编解码器的测试很差,并且在一些领域不起作用。是的,设备制造商可能会为其Android版本添加额外的编解码器。但是,您可能需要查看Android Compatibility并阅读兼容性定义文档,了解制造商在设备上获取Android电子市场所需的详细信息。不幸的是,快速查看它并没有说明最低比特率,所以根据您愿意支持的Android版本的年龄可能会有问题。

答案 2 :(得分:2)

http://developer.android.com/guide/appendix/media-formats.html

我相信您可以使用MediaPlayer类来查看特定功能。