- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图通过扩展 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/
此时我的解决方案正在运行,但仅作为 RTMP,我可以使用 URL 完美地观看我的流: rtmp://X.X.X.X:1935/show/name 但问题是我使用 WebOS 的 LG 智能电视不支持
将 hls 流重新混合为 mp4 文件时,我使用以下命令。 ffmpeg -i "http://example.com/master.m3u8" -c copy -bsf:a aac_adtstoas
我正在使用 Hls.js 将视频管理到我的 HTML 页面中。我需要构建一个音量计来告知用户视频的音频电平。由于我需要保留 video.muted = true,我想知道 Hls.js 是否有任何方法
我正在构建一个视频播放器,它需要播放 HLS 直播和点播流。 它似乎只在 Safari 中运行良好。 (减去我需要更新的自定义样式,忽略它) 在所有其他浏览器中,我收到此错误: VIDEOJS: ER
原始视频是来自 https://www.appsloveworld.com/download-sample-mp4-video-mp4-test-videos/ 的“示例视频 5” . 我的 /hom
我正在直播mp3流(可能它正在使用 icecast - 管理员要求我在另一台服务器上重新广播它)。我正在使用 ffmpeg对于这个任务,使用 HLS播放列表,公开URL地点。 有用!但有时(我的意思是
我正在使用最新的 hls.js 1.0.0(不是 rc)流式传输 .m3u8,但版本为 2021-04-01... 例如:直播从下午 5 点开始,现在是下午 5 点 15 分... 几乎所有浏览器中的
我正在尝试实现具有 3 种视频质量和一种音频质量的自适应流媒体。愿景是带宽减少时切换到仅音频。但由于某种原因,仅播放仅音频文件。它没有切换到任何其他质量。我在客户端使用 exoplayer。 这是主m
我在仅播放音频的 Android 上播放 HLS 时遇到困难。该流将播放第一个视频 fragment ,然后变成仅音频流。这是一个示例链接 https://clipter.com/c/aymels8/
在我的代码中,我试图生成 m3u8不同质量的我的单个视频的格式。我的代码能够生成m3u8但没有品质,它采用原始框架高度和宽度而不是我定义的框架。我对它进行了研究,但我无法完成正确的目标。因为我是 ff
我正在尝试将具有多个音频流的一些视频(不同格式,例如 mp4、mkv、avi)转换为只有一个音频的 HLS。我用 ffmpeg 尝试了不同的解决方案,但似乎没有一个是理想的。 例如 ffmpeg -i
我将视频转码为 HLS,使用以下命令一切正常: ffmpeg -i source -vcodec nvenc -acodec copy -f ssegment -segment_list playli
我们正在使用 JWPlayer 8.9.0,我们正在尝试在我们的视频中插入广告。 我们正在使用 EXT-X-DISCONTINUITY但显然,当我们开始转换广告时,播放器停止显示缓冲状态。 这是我们播
使用最近的 ffmpeg 主分支(commit 7fcbeb),我们可以使用生成主播放列表 -master_pl_name 选项。但我无法生成具有不同配置文件的主播放列表。尝试使用 -var_stre
使用 avformat_open_input 打开 HLS 流从所有流中检索数据,我只想从其中一些流中检索数据。那可能吗? 考虑以下 MWE: #include int main(int argc,
这可能不是一个纯粹的技术问题,但不能确定放置它的最佳位置。 因此,我们有一个直播网站(请考虑MTV)。我们使用HTTP Live Streaming交付内容。因此,视频流由一堆视频组成。我们希望对此进
HLS 协议(protocol)是否指定音频编解码器?如果支持,支持哪些? 我尝试搜索,但找到了不同的列表: MP3, HE-AAC or AC-3 根据 wikipedia AAC, AAC-LC,
我正在尝试在 iOS 中进行直播,因此遵循以下步骤 - 初始化播放器 player = AVPlayer() player.rate = 1.0
我使用 MPMoviePlayer、MPMovieAccessLogEvent 从服务器获取比特率文件视频 hls,我计算如下: double bitrate = 8 * event.observed
目前我正在使用 Kintex 7 和 microblaze 来实现伪随机位序列功能。我已经在HLS中执行了PRBS并创建了HLS IP,然后将HLS IP与vivado集成,生成比特流并将其导出到SD
我是一名优秀的程序员,十分优秀!