Android: прямая подача ExoPlayer необработанных фрагментов mp4 (h264) - PullRequest
0 голосов
/ 12 апреля 2020

Я исследую возможности Android для отображения видео H264 в приложении.

Видеопоток находится внутри контейнера mp4 и доступен в виде байтового массива по частям.

(я также могу использовать MediaCode c, но я не хочу связываться с таймингами.)

Сейчас я смотрю в ExoPlayer, но я ' Я немного озадачен тем, как я могу вставить в него фрагменты mp4:

MediaSources :

  • DashMediaSource для DA SH.
  • SsMediaSource для SmoothStreaming.
  • HlsMediaSource для HLS.
  • ProgressiveMediaSource для обычных медиафайлов.

Но я действительно хочу знать:

  1. если ExoPlayer способен обрабатывать носители (фрагментированные mp4) из памяти (байтовый массив, входной поток или аналогичный)?
  2. , если да, какой источник мультимедиа является лучшим способом для 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 байт за раз.

1 Ответ

1 голос
/ 13 апреля 2020
  1. Нет простого способа сделать это, но вы все еще можете сделать это с помощью ByteArrayDataSource или DataSourceInputStream . Вы также можете посмотреть на их проблему на github, кто-то сделал пользовательский inputStream , который может быть вам полезен.

  2. Для воспроизведения файла MP4 вам нужно ProgressiveMediaSource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...