很多开发者希望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--");} 

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

  1. android播放器和视频拍摄中的硬解和软解以及硬编和软编的区别

    转载 原文地址:https://blog.csdn.net/ltym2014/article/details/82354606 https://blog.csdn.net/lipengshiwo/ar ...

  2. VLC播放器Demo(录像,截图等功能),Android播放器Demo可二次开发。ffmpeg-Kit (录像,截图,合流播放,合流推送,等一些列视频操作功能),可二次开发。

    VLC播放器Demo(录像,截图等功能),可二次开发. ffmpeg-Kit (录像,截图,合流播放,合流推送,等一些列视频操作功能),可二次开发. 如果帮助的到了您,请您不要吝啬你的Star,先谢谢 ...

  3. android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧

    android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧 由于本人想学习音视频相关的东西,所以找了剪映作为借鉴,通过仿照剪映的功能学习音视频相关的东西,所以有了这个项目 暂时这个项目 ...

  4. 如何通过API调用EasyPlayer.js播放器的视频实时录像功能?

    我们在前期的文章介绍过关于流媒体播放器EasyPlayer.js已经实现了直播视频实时录像的功能,感兴趣的用户可以戳这篇文章进行了解:<H5网页播放器EasyPlayer.js如何实现直播视频实 ...

  5. java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...

    文件名称: VideoViewDemo下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 194 KB 上传时间: 2014-09-19 下载次数: 5 详细说明:a ...

  6. 播放器/短视频 SDK 架构设计,点播服务 (Demo)

    在Android中,我们可以直接使用MediaRecord来进行录像,但是在很多适合MediaRecord并不能满足我们的需求,比如我们需要对录制的视频加水印或者其他处理后,所有的平台都按照同一的大小 ...

  7. Android视频播放器实现小窗口和全屏状态切换

    Android视频播放器实现小窗口和全屏状态切换 实在是不好意思,楼下评论的兄弟久等了,这文章一直没写第一是没时间,第二是自己准备也不充足,最近才看了好几个Android视频播放器的开源项目,才对视频 ...

  8. android 播放器封装,Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏、小窗视频播放器,附项目源码...

    原标题:Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏.小窗视频播放器,附项目源码 作者:xiaoyanger 来源:http://www.jian ...

  9. ijk基于exo_github上十二款最著名的Android播放器开源项目

    1.ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器.实现了跨平台功能,API 易于集成:编译配置可裁剪,方便控制 ...

最新文章

  1. 数据团队做什么,看这篇就够了!
  2. 细胞膜内流体应力分析
  3. oracle schema
  4. codeblocks如何watch数组
  5. 《研磨设计模式》chap2 简单工厂simplefactory
  6. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): dao.UserDao.selectU
  7. IT销售素质 -- 自信进取
  8. python3.6配置环境变量_python安裝及环境变量配置
  9. HDU2021 发工资咯:)【入门】
  10. Android AIDL
  11. 重磅!吴恩达新书《机器学习训练秘籍》中文版来了(附PDF下载)
  12. vuejs中根据用户名生成头像背景色
  13. 干货!一份详实的 Scrapy 爬虫教程,值得收藏!
  14. python grpc基于流式传输实现长连接
  15. 为什么对偶问题一定是凸优化问题?
  16. Longest Continuous Increasing Subsequence(最长递增连续子序列)
  17. 知晓云深坑:获取不到数据
  18. 如何让安卓手机访问内网服务器?
  19. FIT2CLOUD飞致云发布开源轻量级云管平台CloudExplorer Lite
  20. linux 排除多个目录搜索文件,关于linux:使用find命令但排除两个目录中的文件

热门文章

  1. 《SolidWorks 2013中文版完全自学手册》——2.6 综合实例——拨叉草图
  2. latex 上标_1700页数学笔记火了!全程敲代码,速度飞快易搜索,硬核小哥教你上手LaTeX+Vim...
  3. 高级网络工程师能挣多少钱?
  4. Web Services到底是什么
  5. JAVA练习题13:唱歌比赛评委打分
  6. 01 【打新债】打新可转债
  7. 做什么样的软件才能赚钱?学什么样的知识才能赚钱?
  8. 树控件DeleteAllItems之前先SelectItem(NULL)
  9. 【转载】城市交通路口无线视频监控系统
  10. php medoo好用吗,where 查询条件-Medoo - 高效的轻量级PHP数据库框架, 提高开发效率!...