4

У меня есть простой мультимедийный плеер для Android, который может воспроизводить несколько видео одновременно на одном экране. Таким образом, в основном один экран медиаплеера делится на 4 части, при этом склеен экземпляр 4 mediaPlayer, и каждая часть воспроизводит данное видео.Мои проблемы с синхронизацией с MediaPlayer для Android

Он работает почти нормально, когда мои видеофайлы хранятся локально на устройстве. Есть проблемы синхронизации, но незначительные. Но когда я вводил URL-адрес для потоковой передачи HTTP, есть значительные проблемы с синхронизацией. В чем проблема? Как правило, как я могу удалить проблемы синхронизации?

Единственное, что я мог сделать, это сначала создать медиапланеры и prepare() их, а затем позвонить start() один за другим, чтобы по крайней мере время начала было близко друг к другу. Однако это не имеет большого эффекта.

Здесь у меня есть метод, который возвращать каждый из mediaplayer экземпляров:

MediaPlayer mediaPreparation(String filename, boolean setMute) { 
    String url = "myURL"; // your URL here 
    // create mediaplayer instance 
    MediaPlayer mediaPlayer = new MediaPlayer(); 
    if (setMute) { 
     mediaPlayer.setVolume(0, 0); 
    } 
    try { 

     mediaPlayer.setDataSource(url); 
     mediaPlayer.prepare(); 

    } catch (IOException e) { 
    } 

    mediaPlayer.setLooping(true); 
    // mediaPlayer.start(); 
    return mediaPlayer; 
} 

И тогда я начинаю их один за другим:

mp[0].start(); 
mp[1].start(); 
mp[2].start(); 
mp[3].start(); 

enter image description here

+0

Tina J, вам удалось справиться с этой проблемой? У меня такая же проблема, и мне интересно, есть ли какое-то решение. – Mohru

ответ

1

Я не уверен, если любой мультимедийный плеер Android предлагает эту функцию.

Я подозреваю, что могут быть и устройства зависимости, так как разные устройства могут иметь разные возможности в HW для декодирования и воспроизведения нескольких видеороликов, и если некоторые из ваших видеороликов должны использовать декодирование SW и т. Д., Они будут намного медленнее.

Возможно, это не соответствует вашим потребностям, но общий способ обеспечить такую ​​сетку видео на этом конечном устройстве - объединить видео вместе на стороне сервера и доставить его на устройство в виде одного видеопотока.

Update

одна вещь, чтобы быть в курсе при использовании MediaCodec и используя кодеки HW - если видео имеют разные профили видео это может вызвать различные задержки декодирования также.

Это связано с тем, как кодируются видео - простыми словами, если конкретный кадр относится к информации из кадра, который приходит после него (общий подход к сжатию), тогда декодеру необходимо буферизовать кадр, пока он не будет реферируется и для рамки. Более простые подходы к сжатию для использования базового профиля не используют этот метод, поэтому не нужно буферизировать и, следовательно, могут иметь более низкую задержку. Это, как представляется, различны для разных производителей HW также - увидеть эту записку от Intel, в частности, раздел низкой задержки в конце:

Я подозреваю, лучший подход к этому конкретному аспекту является нацелиться на самый низкий общий доминант - либо использовать только базовый профиль, либо пытаться отложить все показы видео на какой-то коэффициент дольше, чем максимальная латентность, которую вы можете ожидать от какого-либо отдельного видео.

+0

Он уже реализован. Вопрос заключается в любых способах улучшения синхронизации ... –

+0

Спасибо за полезное обновление. Фактически все мои видео используют тот же самый профиль и на самом деле имеют одинаковый размер и одинаковое разрешение. –

1

В потоковых корпусах всегда существует риск того, что данные не будут постоянно доступны, поэтому игроки начнут играть несколько кадров до начала воспроизведения. И в этом случае несколько потоков могут занять различное время для буферизации для достаточного количества. Я вижу один способ, который вы можете попробовать, медикакодек. См. Это, https://developer.android.com/reference/android/media/MediaCodec.html.

Пройдите, в частности, releaseOutputBuffer() и его варианты. У вас больше контроля над рендерингом (при необходимости измените метку времени, хотя я не буду советовать, так как воспроизведение не будет плавным). Вы можете отслеживать, все ли 4 экземпляра получили определенный временной фрейм, декодированный или нет, и затем визуализируют их сразу.

+0

Интересная проницательность! Как работает потоковая передача на основе URL? При вызове 'prepare()' он загружает только первые несколько секунд, а не целое, верно? Я задам отдельный вопрос для этого сейчас ... –

+0

Итак, как я могу отслеживать, получили ли все 4 экземпляра определенный временной фрейм? Какие-нибудь примеры или что-то еще? –

+1

Это только декодирование. Когда вы получите декодированный фрейм, вы получите соответствующую метку времени. Следите за отметкой времени для всех 4, и когда все они декодируют конкретную временную метку, отрисуйте все. Базовый декодер и рендеринг в документации на Android, логике отслеживания, вы должны писать. –

Смежные вопросы