我试图通过扩展SurfaceView并将ExoPlayer视频渲染到其表面来创建一个非常简单的视图。我想支持HLS,而且只支持HLS。我似乎一直都能听到音频,但我从来没有看到视频被渲染到屏幕上。我很好奇我可能做错了什么。
我在日志中看到的唯一错误是:
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);
}
}
我有一个类似的情况,我可以听到音频,但没有视频,只有一个黑色的屏幕。原来我试图发送设置表面meagge:
player.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface);
在视频渲染被初始化并准备好之前,这就是为什么我只能听到音频
所以我发现了我的问题。在回顾了演示代码之后,我注意到演示SurfaceView是用com包起来的。谷歌。Android外星玩家。AspectRateOfRameLayout。在将我的SurfaceView包装成同样的布局后,视频神奇地开始播放。
我想在沙卡播放器上放一个伏特加。这是我的网址: https://5b48f8f32d3be.streamlock.net/023a27950bd44774/mp4:22436e792e8b42de_HD.0.mp4/playlist.m3u8 我一直在控制台中发现4032错误,我已经搜索了一点。在shaka文档中,4032错误被称为不受浏览器支持的内容。但当我在shaka player测试URL上
SRS支持HLS/RTMP两种成熟而且广泛应用的流媒体分发方式。 RTMP指Adobe的RTMP(Realtime Message Protocol),广泛应用于低延时直播,也是编码器和服务器对接的实际标准协议,在PC(Flash)上有最佳观看体验和最佳稳定性。 HLS指Apple的HLS(Http Live Streaming),本身就是Live(直播)的,不过Vod(点播)也能支持。HLS是A
由于公司业务,需要实现基于WEB查看监控画面,经过各种百度,补充了不少相关知识,了解到了很多大神的实现方法,也因为很多过时的帖子,而踩了不少的坑。 在被动积累了一些知识后,动手实现了v1.0初级版本,但是部署工作量较大,因为需要手动安装组件、配置、调试。 后来在发布到gitee后,被多位朋友咨询“如何使用”的问题后,决定对该版本再做提升,所以有了现在的v2.0版本,提高了部署效率,直接打包配置设备
在这一点上,我的解决方案是工作的,但只能作为RTMP,我可以使用URL完美地观看我的流: 但问题是我的LG智能电视使用WebOS不支持RTMP,我真的很想在那里播放我的流。我现在能看到的唯一解决方案是使用HLS。使用HLS也很好,但我需要在打开电视中的HLS流之前执行我的ffmpeg命令,否则它将不会创建在电视上显示流所需的文件。
我试图寻求(倒带)一个DVR HLS流使用MediaPlayer对象,但我得到th错误: 我已经阅读了前面的问题(Android 3.0上的HLS(http直播)和seeking),但它们已经2岁了。 在这个问题上有什么进展吗?
我目前正在一个平台上工作,该平台依靠MPEG Dash向浏览器提供音频和视频。对于onDemand im,使用ffmpeg将视频编码到h264/aac和MP4Box以创建清单。mpd文件。现在我想弄清楚如何创建实时MPEG Dash流,更具体地说,将hls实时流编码到MPEG Dash。 我需要重新编码所有的代码吗。ts段到。mp4(h264/aac)段,因为chrome不支持MPEG2T