Android播放器实现视频窗口实时放大缩小功能

很多开发者希望Android播放端实现视频窗口的放大缩小功能,为此,我们做了个简单的demo,通过播放端回调RGB数据,直接在上层view操作处理即可,Github:https://github.com/daniulive/SmarterStreaming

无视频无真相:http://www.iqiyi.com/w_19s9sa7epp.html

基本流程如下:

1. 基础的初始化和参数设定

        libPlayer = new SmartPlayerJniV2();myContext = this.getApplicationContext();sSurfaceView = (SurfaceView) this.findViewById(R.id.surface);surface_renderer = new RGBSurfaceRenderer(sSurfaceView);
private void InitAndSetConfig() {playerHandle = libPlayer.SmartPlayerOpen(myContext);if (playerHandle == 0) {Log.e(TAG, "surfaceHandle with nil..");return;}libPlayer.SetSmartPlayerEventCallbackV2(playerHandle,new EventHandeV2());libPlayer.SmartPlayerSetBuffer(playerHandle, playBuffer);// set report download speed(默认2秒一次回调 用户可自行调整report间隔)libPlayer.SmartPlayerSetReportDownloadSpeed(playerHandle, 1, 2);libPlayer.SmartPlayerSetFastStartup(playerHandle, isFastStartup ? 1 : 0);//设置RTSP超时时间int rtsp_timeout = 10;libPlayer.SmartPlayerSetRTSPTimeout(playerHandle, rtsp_timeout);//设置RTSP TCP/UDP模式自动切换int is_auto_switch_tcp_udp = 1;libPlayer.SmartPlayerSetRTSPAutoSwitchTcpUdp(playerHandle, is_auto_switch_tcp_udp);libPlayer.SmartPlayerSaveImageFlag(playerHandle, 1);// It only used when playback RTSP stream..// libPlayer.SmartPlayerSetRTSPTcpMode(playerHandle, 1);playbackUrl = "rtmp://202.69.69.180:443/webcast/bshdlive-pc";//playbackUrl = "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov";libPlayer.SmartPlayerSetUrl(playerHandle, playbackUrl);}

2.  设置External Render,回调RGBA数据

libPlayer.SmartPlayerSetExternalRender(playerHandle, new RGBAExternalRender());

Log.i(TAG, "Start playback stream++");InitAndSetConfig();// External RenderlibPlayer.SmartPlayerSetExternalRender(playerHandle, new RGBAExternalRender());libPlayer.SmartPlayerSetAudioOutputType(playerHandle, 0);if (isMute) {libPlayer.SmartPlayerSetMute(playerHandle, isMute ? 1: 0);}if (isHardwareDecoder) {int isSupportHevcHwDecoder = libPlayer.SetSmartPlayerVideoHevcHWDecoder(playerHandle, 1);int isSupportH264HwDecoder = libPlayer.SetSmartPlayerVideoHWDecoder(playerHandle, 1);Log.i(TAG, "isSupportH264HwDecoder: " + isSupportH264HwDecoder + ", isSupportHevcHwDecoder: " + isSupportHevcHwDecoder);}libPlayer.SmartPlayerSetLowLatencyMode(playerHandle, isLowLatency ? 1: 0);libPlayer.SmartPlayerSetFlipVertical(playerHandle, is_flip_vertical ? 1 : 0);libPlayer.SmartPlayerSetFlipHorizontal(playerHandle, is_flip_horizontal ? 1 : 0);libPlayer.SmartPlayerSetRotation(playerHandle, rotate_degrees);int iPlaybackRet = libPlayer.SmartPlayerStartPlay(playerHandle);if (iPlaybackRet != 0) {Log.e(TAG, "Call SmartPlayerStartPlay failed..");return;}surface_renderer.StartRender();btnStartStopPlayback.setText("停止播放 ");isPlaying = true;Log.i(TAG, "Start playback stream--");

3. 回调RGBA数据:

   class RGBAExternalRender implements NTExternalRender {// public static final int NT_FRAME_FORMAT_RGBA = 1;// public static final int NT_FRAME_FORMAT_ABGR = 2;// public static final int NT_FRAME_FORMAT_I420 = 3;private int width_ = 0;private int height_ = 0;private int row_bytes_ = 0;private ByteBuffer rgba_buffer_ = null;@Overridepublic int getNTFrameFormat() {Log.i(TAG, "RGBAExternalRender::getNTFrameFormat return "+ NT_FRAME_FORMAT_RGBA);return NT_FRAME_FORMAT_RGBA;}@Overridepublic void onNTFrameSizeChanged(int width, int height) {width_ = width;height_ = height;row_bytes_ = width_ * 4;Log.i(TAG, "RGBAExternalRender::onNTFrameSizeChanged width_:"+ width_ + " height_:" + height_);rgba_buffer_ = ByteBuffer.allocateDirect(row_bytes_ * height_);}@Overridepublic ByteBuffer getNTPlaneByteBuffer(int index) {if (index == 0) {return rgba_buffer_;} else {Log.e(TAG,"RGBAExternalRender::getNTPlaneByteBuffer index error:"+ index);return null;}}@Overridepublic int getNTPlanePerRowBytes(int index) {if (index == 0) {return row_bytes_;} else {Log.e(TAG,"RGBAExternalRender::getNTPlanePerRowBytes index error:"+ index);return 0;}}public void onNTRenderFrame(int width, int height, long timestamp) {if (rgba_buffer_ == null)return;// rgba_buffer_.rewind();// copy buffer// test// byte[] test_buffer = new byte[16];// rgba_buffer_.get(test_buffer);//Log.i(TAG, "RGBAExternalRender:onNTRenderFrame w=" + width + " h="//        + height + " timestamp=" + timestamp);// Log.i(TAG, "RGBAExternalRender:onNTRenderFrame rgba:" +// bytesToHexString(test_buffer));if ( surface_renderer != null){surface_renderer.SetRGBImage(width, height, rgba_buffer_);}}}

4. 对视频view进行放大缩小等状态处理:

        @SuppressLint("ClickableViewAccessibility")public RGBSurfaceRenderer(SurfaceView view){surface_holder_ = view.getHolder();if (surface_holder_ == null){Log.e(TAG, "RGBSurfaceRenderer, surfaceHolder with null..");return;}surface_holder_.addCallback(this);view.setOnTouchListener(new View.OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event){Log.e(TAG, "onTouch called..");switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:start_point_.set(event.getX(), event.getY());status_ = DRAG;break;case MotionEvent.ACTION_POINTER_DOWN:float distance = spacing(event);if (distance > 10f) {status_ = ZOOM;start_distance_ = distance;}break;case MotionEvent.ACTION_MOVE:if (status_ == DRAG) {dragAction(event);} else {if (event.getPointerCount() == 1)return true;zoomAcition(event);}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_POINTER_UP:status_ = NONE;break;default:break;}return true;}});}

5. 关闭播放:

if (isPlaying) {Log.i(TAG, "Stop playback stream++");int iRet = libPlayer.SmartPlayerStopPlay(playerHandle);if (iRet != 0) {Log.e(TAG, "Call SmartPlayerStopPlay failed..");return;}surface_renderer.StopRender();libPlayer.SmartPlayerClose(playerHandle);playerHandle = 0;isPlaying = false;btnStartStopPlayback.setText("开始播放 ");Log.i(TAG, "Stop playback stream--");} 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻量级RTSP服务SDK

为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,大牛直播SDK在推送端发布了轻量级RTSP服务SDK: 简单来说,之前推送端SDK支持的功能,内置轻量级RTSP服务SDK后,功能继续支持。 一…

技术员联盟win11系统64位专业版镜像v2021.08

技术员联盟win11系统64位专业版镜像v2021.08以微软官方原版作为母盘对系统进行了全面优化更新,用户使用更加流畅顺手,轻松体验到系统的优秀性能,适用目前市场最新机型以及老旧机型,多种安装方式供用户选择,且更新时间短…

多路RTSP-RTMP转RTMP定制版

大牛直播SDK多路RTMP/RTSP转RTMP转发软件,系原有转发SDK基础上,官方推出的Windows平台定制版。在秉承低延迟、灵活稳定、低资源占用的前提下,客户无需关注开发细节,只需图形化配置转发等各类参数,实现产品快速上线目的…

Win11系统无法安装GPT分区的解决方法

越来越多的人使用大容量硬盘,比如3T、4T容量硬盘,传统的MBR分区表不支持大容量硬盘,所以GPT分区格式就逐渐成为主流,尤其是现在UEFI主板非常普遍,很多人都选择用GPT分区安装Win11系统,那么该如何具体操作呢…

基于智慧教室|无纸化会议的新选择:RTMP解决方案

基于智慧教室或是会议的技术方案,一般主要是涉及到屏幕采集和推送,整体技术方案这块,一般建议走RTMP,说到这里,好人开发者提到,市面上也有RTSP的技术方案,甚至RTSP组播方案,这块&…

轻量级RTSP服务模块和RTSP推流模块适用场景区别

好多开发者一直搞不清轻量级RTSP服务SDK和RTSP推流SDK的区别(Github下载地址),以下是相关区别: 1. 轻量级RTSP服务模块:轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务,实现本…

钉钉怎么投屏到设备

钉钉想要使用投屏,该怎么使用呢?下面我们就来看看钉钉投屏的教程。 1、打开钉钉的聊天对话框,在右上角个人中心头像左边有三个按钮,点击中间的投屏按钮,根据系统提示来设置投屏选项。 钉钉怎么投屏到设备? 2、点击之后需要输…

如何实现多路海康大华等RTSP数据转RTMP推送

一个好的转发模块,首先要低延迟!其次足够稳定、灵活、有状态反馈机制、资源占用低,跨平台,最好以接口形式提供,便于第三方系统集成。 以Windows平台为例,我们的考虑的点如下 1. 拉流:通过RTSP…

如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析

在直播系统中,除了直播音视频之外,有时候还想从主播端发布文本信息等,这些信息可以不通过视频传输通道发送给用户播放端,但如果传输的数据想和视频保持精准同步,那最好的办法就是这些信息和视频数据打包在一起传输&…

网易邮箱大师如何添加Word附件 添加附件方法步骤详细介绍

网易邮箱大师是一款非常好用的邮箱软件,可同时管理包括网易的各大邮箱,界面简洁,非常好用,其中还有很多功能,比如添加附件等,但是很多小伙伴不知道怎么添加Word及其他附件,接下来看完这篇文章你…

RTSP播放器开发过程中需要考虑哪些关键因素

好多开发者,在自研或者选择市面上的播放器的时候,除了常规的播放功能,还有很多点值得关注,如延迟、资源占用、网络异常处理、多实例支持、长时间运行稳定性等。以下是我们开发直播播放器过程中,考虑的部分关键因素&…

如何拉取公网RTSP/RTMP流在内网多客户端播放

好多情况下,一路RTSP或RTMP网络流过来后,想共享给更多局域网内的客户端播放,一般来说,有两种设计方案: 1. 拉取的RTSP或RTMP流,回调后的数据,转推RTMP服务器,内网部署一台RTMP服务器…

爱链工具怎么使用 爱链工具详细使用图文教程

爱链工具是爱站seo软件独立推出的一款免费友链交换平台,也是目前互联网上最强外链交换平台,不但拥有丰富的友链资源,智能的链接匹配系统,全面的SEO基础数据等等,而且率先推出目录链接交换功能,可以大大提升…

如何在Unity3d平台下低延迟播放RTMP或RTSP流

随着VR类、工业仿真、智慧城市等场景的快速发展,开发者对Unity3d低延迟的直播需求量越来越大,前两年,大牛直播SDK发布了Windows平台、Android平台和iOS平台的Unity3d RTMP和RTSP的播放,好多公司用起来体验都非常好,以下…

轻量级RTSP服务存在的意义

为什么要设计轻量级RTSP服务 轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务。 轻量级RTSP服务可满足内网无纸化/电子教室等内网超低延迟的低并发需求,避免让用户配置单独的服务器,大牛直播SDK在推送端发布了轻量级RTSP服…

foxmail邮件怎样打印日历

foxmail邮件中的日历有很多信息,想要打印日历,该怎么打印呢?我们点击日历信息。点击设置按钮,再点击打印按钮,先进行设置打印机,然后打印邮件的日历,下面我们就来看看详细的图文教程。 foxmail邮件怎样打…

Windows平台RTMP/RTSP直播推送模块设计和使用说明

开发背景 好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们…

跨平台低延迟的RTMP/RTSP直播播放器设计实现

开发背景 2015年,当我们试图在市面上找一款专供直播播放使用的低延迟播放器,来配合测试我们的RTMP推送模块使用时,居然发现没有一款好用的,市面上的,如VLC或Vitamio,说白了都是基于FFMPEG,在点…

win7系统锁定计算机设置方法

我们都知道电脑长时间不使用的话,计算机就会自动进入锁定状态,但是也有用户不想让计算机自动进入锁定状态,但是却不知道应该怎么操作,为此非常苦恼,那么Win7锁定计算机怎么设置呢?今天为大家分享win7系统锁定计算机设…

Windows平台基于RTMP实现一对一互动直播

目前市面上大多一对一互动都是基于WebRTC,缺点如下: 服务器部署非常复杂,不利于私有部署,在一些私密性高的场景下,无法使用,如公安、市政等体系;传输基于UDP,很难保证传输质量&…