Подтвердить что ты не робот

Какой видеоформат будет воспроизводиться на всех устройствах Android?

Android может воспроизводить различные форматы видео, но мне нужно выбрать один формат, который будет работать на всех устройствах.

Все ли устройства Android 2.3 поддерживают одни и те же форматы? то есть, если формат будет воспроизводиться в эмуляторе, означает ли это, что он также будет воспроизводиться на всех аппаратных средствах? Или различные устройства поддерживают разные форматы в зависимости от того, какие у них декодеры декодера?

Если они все одинаковые, то, очевидно, лучший формат - H.264 с высоким битрейтом и разрешением. Если нет, то какой лучший кодек/битрейт/разрешение, которое будет воспроизводиться на 90% устройств? Предоставляет ли Google некоторый способ запроса возможностей устройства и выбора подходящего формата?

4b9b3361

Ответ 1

Эмулятор плохо тестирует кодеки и не работает в нескольких областях. И да, производители устройств могут добавить дополнительные кодеки в свою версию Android. Однако вы можете проверить Android Compatibility и прочитать документ определения совместимости для более подробной информации о том, что требуется производитель получит Android Market на устройстве. К сожалению, быстрый просмотр в нем ничего не говорит о минимальном битрейте, поэтому в зависимости от того, сколько лет версия Android, которую вы готовы поддержать, может иметь проблемы.

Ответ 2

После тестирования на множестве устройств (для видеозахвата очень популярного приложения). Мои рекомендации:

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)];
    }