Android:ExoPlayer直接输入原始mp4(h264)片段

问题描述 投票:0回答:1

我正在研究Android在应用程序中显示H264视频的可能性。

视频流在mp4容器中,并且可以按字节数组的形式以逐块的形式提供。

((我也可以使用MediaCodec,但我不想弄乱时间。)

我现在正在研究ExoPlayer,但是我对如何将mp4片段输入其中感到有些困惑:

MediaSources

  • DASH的DashMediaSource。
  • SsMediaSource for SmoothStreaming。
  • HLS的HlsMediaSource。
  • ProgressiveMediaSource用于常规媒体文件。

但是我真的很想知道:

  1. 如果ExoPlayer能够处理来自内存(字节数组,inputstream或类似对象)的媒体(片段mp4)?
  2. 如果是,哪种媒体来源是最好的选择?

更新

我正在关注@Biscuit的link

我实现了自己的数据源:

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个字节。

android exoplayer exoplayer2.x
1个回答
1
投票
  1. 没有简单的方法可以执行此操作,但是您仍然可以使用ByteArrayDataSourceDataSourceInputStream。您也可以在github上查看他们的问题,有人提出了custom inputStream可能对您有用。

  2. 要播放MP4文件,您需要ProgressiveMediaSource

© www.soinside.com 2019 - 2024. All rights reserved.