【软通动力】SurfaceProvider实现视频播放Demo-热乎乎的拜年视频
Tiechui.Wang 2021-02-09 10:00:00 发布3298 浏览 17 点赞 13 收藏
辛丑年即将到来,基于HOS,利用SurfaceProvider控件实现了一个视频播放的Demo,有开始、暂停和循环播放功能,邀请大家一起来看看。提前祝51CTO的广大开发爱好者新春快乐!牛气冲天!
奉上视频一睹为快。
具体实现步骤如下:
一.创建布局:
<?xml version="1.0" encoding="utf-8"?>
<StackLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:width="match_parent"
ohos:height="match_parent">
<ohos.agp.components.surfaceprovider.SurfaceProvider
ohos:id="$+id:surfaceProvider"
ohos:width="match_parent"
ohos:height="match_parent"/>
<Image
ohos:id="$+id:img"
ohos:height="match_content"
ohos:width="match_content"
ohos:image_src="$media:player"
ohos:layout_alignment="center"
ohos:visibility="hide"/>
</StackLayout>
二、在MainAbilitySlice实现播放功能的代码
onStart()中添加:
//设置沉浸式状态栏
getWindow().addFlags(WindowManager.LayoutConfig.MARK_TRANSLUCENT_STATUS);
initPlayer();
需要重写两个回调:VideoSurfaceCallback 、VideoPlayerCallback
private void initPlayer() {
sfProvider=(SurfaceProvider) findComponentById(ResourceTable.Id_surfaceProvider);
image=(Image) findComponentById(ResourceTable.Id_img);
sfProvider.getSurfaceOps().get().addCallback(new VideoSurfaceCallback());
//sfProvider.pinToZTop(boolean)--如果设置为true, 视频控件会在最上次展示,但是设置为false时,虽然不在最上层展示,却出现黑屏,
// 需加上一行代码:WindowManager.getInstance().getTopWindow().get().setTransparent(true);
sfProvider.pinToZTop(false);
WindowManager.getInstance().getTopWindow().get().setTransparent(true);
player=new Player(getContext());
//sfProvider添加监听事件
sfProvider.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
if(player.isNowPlaying()){
//如果正在播放,就暂停
player.pause();
//播放按钮可见
image.setVisibility(Component.VISIBLE);
}else {
//如果暂停,点击继续播放
player.play();
//播放按钮隐藏
image.setVisibility(Component.HIDE);
}
}
});
}
private void playLocalFile(Surface surface) {
try {
RawFileDescriptor filDescriptor = getResourceManager().getRawFileEntry("resources/rawfile/123.mp4").openRawFileDescriptor();
Source source = new Source(filDescriptor.getFileDescriptor(),filDescriptor.getStartPosition(),filDescriptor.getFileSize());
player.setSource(source);
player.setVideoSurface(surface);
player.setPlayerCallback(new VideoPlayerCallback());
player.prepare();
sfProvider.setTop(0);
player.play();
} catch (Exception e) {
HiLog.info(logLabel,"playUrl Exception:" + e.getMessage());
}
}
private class VideoSurfaceCallback implements SurfaceOps.Callback {
@Override
public void surfaceCreated(SurfaceOps surfaceOps) {
HiLog.info(logLabel,"surfaceCreated() called.");
if (sfProvider.getSurfaceOps().isPresent()) {
Surface surface = sfProvider.getSurfaceOps().get().getSurface();
playLocalFile(surface);
}
}
@Override
public void surfaceChanged(SurfaceOps surfaceOps, int i, int i1, int i2) {
HiLog.info(logLabel,"surfaceChanged() called.");
}
@Override
public void surfaceDestroyed(SurfaceOps surfaceOps) {
HiLog.info(logLabel,"surfaceDestroyed() called.");
}
}
private class VideoPlayerCallback implements Player.IPlayerCallback {
@Override
public void onPrepared() {
HiLog.info(logLabel,"onPrepared");
}
@Override
public void onMessage(int i, int i1) {
HiLog.info(logLabel,"onMessage");
}
@Override
public void onError(int i, int i1) {
HiLog.info(logLabel,"onError: i=" + i + ", i1=" + i1);
}
@Override
public void onResolutionChanged(int i, int i1) {
HiLog.info(logLabel,"onResolutionChanged");
}
@Override
public void onPlayBackComplete() {
//播放完成回调,重新播放
if (player != null) {
player.prepare();
player.play();
}
}
@Override
public void onRewindToComplete() {
HiLog.info(logLabel,"onRewindToComplete");
}
@Override
public void onBufferingChange(int i) {
HiLog.info(logLabel,"onBufferingChange");
}
@Override
public void onNewTimedMetaData(Player.MediaTimedMetaData mediaTimedMetaData) {
HiLog.info(logLabel,"onNewTimedMetaData");
}
@Override
public void onMediaTimeIncontinuity(Player.MediaTimeInfo mediaTimeInfo) {
HiLog.info(logLabel,"onMediaTimeIncontinuity");
}
}
三 在MainAbilitySlice的其他生命周对player进行资源管理:
@Override
public void onActive() {
super.onActive();
player.play();
}
@Override
protected void onBackground() {
super.onBackground();
player.pause();
}
@Override
protected void onStop() {
super.onStop();
player.stop();
player.release();
}
©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
其它
标签
鸿蒙
相关推荐
润和软件:在开源鸿蒙领域,公司重点聚焦行业端的商业化落地
757
0鸿蒙智行的OTA“进化论”
鸿蒙工程师代号007
812
0华为鸿蒙新功能曝光:锁屏卡片如何悄悄改变你的注意力习惯
11
0鸿蒙4.2.0.121升级的真正意义是什么?是让老机赌命还是再战两年?
85
0华为鸿蒙5.0.1全量推送:一场蓄谋已久的生态突围战
调试的少年A
157
0
Tiechui.Wang
我还没有写个人简介......
1091
帖子
0
提问
893
粉丝
最新发布
华为应用市场增长优化师火热认证中
2025-03-10 10:16:02 发布华为应用市场斩获Pocket Gamer2023年移动游戏奖,全球第三大移动应用生态获行业认可
2024-04-27 11:06:07 发布热门推荐