gpt4 book ai didi

android - 使用 ExoPlayer 播放 HLS

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:45 26 4
gpt4 key购买 nike

我试图通过扩展 SurfaceView 并将 ExoPlayer 视频渲染到其表面来创建一个非常简单的 View 。我想支持 HLS 且仅支持 HLS。我似乎始终如一地获得音频,但我从未在屏幕上看到视频。我很好奇我可能做错了什么。

我在 Logcat 中看到的唯一错误如下:

E/OMXMaster﹕ A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one.

下面是我的代码。

private static final int BUFFER_SEGMENT_SIZE = 256 * 1024;
private static final int BUFFER_SEGMENTS = 64;

private ExoPlayer mExoPlayer;
private Handler mHandler;
private AudioCapabilitiesReceiver mAudioCapabilitiesReceiver;
private AudioCapabilities mAudioCapabilities;
private ManifestFetcher<HlsPlaylist> playlistFetcher;
private String mUserAgent;
String url = "http://solutions.brightcove.com/bcls/assets/videos/Great-Blue-Heron.m3u8";

public ExoPlayerView(Context context) {
super(context);
}

public ExoPlayerView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ExoPlayerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
public void init() {
mHandler = new Handler();
mUserAgent = Util.getUserAgent(getContext(), "CX Video Player");
HlsPlaylistParser parser = new HlsPlaylistParser();
playlistFetcher = new ManifestFetcher<>(url, new DefaultUriDataSource(getContext(), mUserAgent),
parser);
mAudioCapabilitiesReceiver = new AudioCapabilitiesReceiver(getContext(), this);
mAudioCapabilitiesReceiver.register();
}

@Override
public void play() {
mExoPlayer.setPlayWhenReady(true);
}

@Override
public void stop() {
mExoPlayer.stop();
release();
}

@Override
public void pause() {
mExoPlayer.setPlayWhenReady(false);
}

@Override
public void seekTo(long timeMillis) {
mExoPlayer.seekTo(timeMillis);
}

@Override
public long getCurrentPosition() {
return mExoPlayer.getCurrentPosition();
}

@Override
public boolean isPlaying() {
return false;
}

@Override
public void playNext() {

}

@Override
public boolean isPlayingLastVideo() {
return false;
}

@Override
public int getDuration() {
return (int)mExoPlayer.getDuration();
}

@Override
public void addVideo(Uri uri) {

}

@Override
public void addVideos(List<Uri> uris) {

}

@Override
public void release() {
mAudioCapabilitiesReceiver.unregister();
mExoPlayer.release();
}

@Override
public void onSingleManifest(HlsPlaylist hlsPlaylist) {
final int numRenderers = 2;

LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE));
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();

int[] variantIndices = null;
if (hlsPlaylist instanceof HlsMasterPlaylist) {
HlsMasterPlaylist masterPlaylist = (HlsMasterPlaylist) hlsPlaylist;
try {
variantIndices = VideoFormatSelectorUtil.selectVideoFormatsForDefaultDisplay(
getContext(), masterPlaylist.variants, null, false);
} catch (MediaCodecUtil.DecoderQueryException e) {
e.printStackTrace();
return;
}
if (variantIndices.length == 0) {
return;
}
}

DataSource dataSource = new DefaultUriDataSource(getContext(), bandwidthMeter, mUserAgent);
HlsChunkSource hlsChunkSource = new HlsChunkSource(dataSource, url, hlsPlaylist, bandwidthMeter,
variantIndices, HlsChunkSource.ADAPTIVE_MODE_SPLICE, mAudioCapabilities);
HlsSampleSource hlsSampleSource = new HlsSampleSource(hlsChunkSource, loadControl, BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE);

// Build the track renderers
TrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(hlsSampleSource, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(hlsSampleSource);

// Build the ExoPlayer and start playback
mExoPlayer = ExoPlayer.Factory.newInstance(numRenderers);
mExoPlayer.prepare(videoRenderer, audioRenderer);

// Pass the surface to the video renderer.
mExoPlayer.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, getHolder().getSurface());

mExoPlayer.setPlayWhenReady(true);
}

@Override
public void onSingleManifestError(IOException e) {

}

@Override
public void onAudioCapabilitiesChanged(AudioCapabilities audioCapabilities) {
mAudioCapabilities = audioCapabilities;
playlistFetcher.singleLoad(mHandler.getLooper(), this);
}
}

最佳答案

所以我发现了我的问题。回顾演示代码后,我注意到演示 SurfaceView 被包裹在 com.google.android.exoplayer.AspectRatioFrameLayout 中。将我的 SurfaceView 包裹在相同的布局中后,视频神奇地开始播放。

关于android - 使用 ExoPlayer 播放 HLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32338957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com