Android-кодек для Android сильно зависит от поставщика устройства. Samsung невероятно проблематичен, другие устройства, работающие с одним и тем же кодом, будут работать нормально. Это была моя жизнь последние 6 месяцев.
Лучший способ сделать, хотя он может чувствовать себя неправильно, это попробовать + уловить + повторить попытку. Есть 4 различных места, где MediaCodec будет генерировать исключения:
- Конфигурация - NativeDecoder.Configure (...);
- Start - NativeDecoder.Start();
- Render output - NativeDecoder.ReleaseOutputBuffer (...);
- Ввод - codec.QueueInputBuffer (...);
ПРИМЕЧАНИЕ: мой код находится в Xamarin, но карты вызовов очень близко к raw java.
Способ настройки формата также имеет значение. Mediacodec может привести к сбою на NEXUS устройств, если вы не указываете:
formatDescription.SetInteger(MediaFormat.KeyMaxInputSize, currentPalette.Width * currentPalette.Height);
Когда вы ловите любое исключение вам нужно будет обеспечить mediacodec сбрасывается. Unfortunatly сброса Isnt доступны для старых API-уровня, но вы можете имитировать тот же эффект с:
#region Close + Release Native Decoder
void StopAndReleaseNativeDecoder() {
FlushNativeDecoder();
StopNativeDecoder();
ReleaseNativeDecoder();
}
void FlushNativeDecoder() {
if (NativeDecoder != null) {
try {
NativeDecoder.Flush();
} catch {
// ignore
}
}
}
void StopNativeDecoder() {
if (NativeDecoder != null) {
try {
NativeDecoder.Stop();
} catch {
// ignore
}
}
}
void ReleaseNativeDecoder() {
while (NativeDecoder != null) {
try {
NativeDecoder.Release();
} catch {
// ignore
} finally {
NativeDecoder = null;
}
}
}
#endregion
После того, как вы ловите ошибки при передаче нового входа вы можете проверить:
if (!DroidDecoder.IsRunning && streamView != null && streamView.VideoLayer.IsAvailable) {
DroidDecoder.StartDecoder(streamView.VideoLayer.SurfaceTexture);
}
DroidDecoder.DecodeH264FrameBuffer(payload, payloadSize, frameDuration, presentationTime, isKeyFrame);
рендеринга в текстуру В настоящее время просмотр является наиболее стабильным вариантом. Но фрагментация устройства действительно повредила андроид в этой области. Мы нашли более дешевые устройства, такие как Tesco Hudl, которые были самыми стабильными для видео.Даже было до 21 одновременных видео на экране в 1 раз. Samsung S4 может обойтись 4-6 в зависимости от разрешения/fps, но что-то вроде HTC может работать так же, как и Hudl. Это был звонок для пробуждения и заставил меня понять, что устройства samsung буквально копируют дизайн яблока и скручиваются с android-sdk и фактически нарушают много функциональности на этом пути.
Это не устраняет проблему. –
Есть ли что-нибудь, что может быть выведено из кода ошибки -34? –
К сожалению, не могу найти. Возможно, вам придется просмотреть источник MediaCodec, чтобы найти, где -34 выбрано внутри этого кода. – Devsil