我正在研究Android在应用程序中显示H264视频的可能性。
视频流在mp4容器中,并且可以按字节数组的形式以逐块的形式提供。
((我也可以使用MediaCodec,但我不想弄乱时间。)
我现在正在研究ExoPlayer,但是我对如何将mp4片段输入其中感到有些困惑:
但是我真的很想知道:
我正在关注@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个字节。
没有简单的方法可以执行此操作,但是您仍然可以使用ByteArrayDataSource或DataSourceInputStream。您也可以在github上查看他们的问题,有人提出了custom inputStream可能对您有用。
要播放MP4文件,您需要ProgressiveMediaSource