Я исследую возможности Android для отображения видео H264 в приложении.
Видеопоток находится внутри контейнера mp4 и доступен в виде байтового массива по частям.
(я также могу использовать MediaCode c, но я не хочу связываться с таймингами.)
Сейчас я смотрю в ExoPlayer, но я ' Я немного озадачен тем, как я могу вставить в него фрагменты mp4:
MediaSources :
- DashMediaSource для DA SH.
- SsMediaSource для SmoothStreaming.
- HlsMediaSource для HLS.
- ProgressiveMediaSource для обычных медиафайлов.
Но я действительно хочу знать:
- если ExoPlayer способен обрабатывать носители (фрагментированные mp4) из памяти (байтовый массив, входной поток или аналогичный)?
- , если да, какой источник мультимедиа является лучшим способом для go?
Обновление
Я следил за ссылкой @ Biscuit .
Я реализовал m у собственного источника данных:
public class MediaDispatcher implements DataSource {
public static final String LOG_TAG = "MediaDispatcher";
private DataSpec mDataSpec;
private String mBuffer;
@Override
public void addTransferListener(TransferListener transferListener) {
Log.d(LOG_TAG, "addTransferListener");
}
@Override
public long open(DataSpec dataSpec) throws IOException {
Log.d(LOG_TAG, "open");
mDataSpec = dataSpec;
return Long.MAX_VALUE;
}
@Override
public int read(byte[] buffer, int offset, int readLength) {
Log.d(LOG_TAG, "read, readLength=" + readLength);
if (0 == readLength) return 0;
if (readLength > mBuffer.length()) buffer = mBuffer.getBytes();
return mBuffer.length();
}
public void write(String buffer) throws InterruptedException {
//My service calls this
mBuffer = buffer;
}
@Nullable
@Override
public Uri getUri() {
Log.d(LOG_TAG, "getUri");
return Uri.EMPTY;
}
@Override
public void close() throws IOException {
Log.d(LOG_TAG, "close");
}
}
И я инициализирую его, как показано ниже:
DataSource.Factory factory = new DataSource.Factory() {
@Override
public DataSource createDataSource() {
return new MediaDispatcher();
}
};
MediaSource mediaSource = new ExtractorMediaSource(mMediaDispatcher.getUri(),
factory, new DefaultExtractorsFactory(), null, null);
mplayer = new SimpleExoPlayer.Builder(context).build();
myVideoLayout.setPlayer(mplayer)
mplayer.prepare(mediaSource);
Но моя проблема в том, что ExoPlayer хочет читать только 1 байт за раз!
Журнал:
getUri
addTransferListener
open
getUri
getUri
read, readLength=4
read, readLength=1
read, readLength=1
read, readLength=1
read, readLength=1
... (same line repeats)
close
Кроме того, ExtractorMediaSource
устарело, поэтому я не знаю, как поступить.
У меня есть обновил часть инициализации:
MediaSource mediaSource = new ProgressiveMediaSource.Factory(factory).createMediaSource(Uri.EMPTY);
Но ExoPlayer по-прежнему хочет читать только 1 байт за раз.