TextureView在4.0(API level 14)中引入。它可以将内容流直接投影到View中,可以用于实现Live preview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。值得注意的是TextureView必须在硬件加速的窗口中。它显示的内容流数据可以来自App进程或是远端进程。从类图中可以看到,TextureView继承自View,它与其它的View一样在View hierachy中管理与绘制。TextureView重载了draw()方法,其中主要把SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。SurfaceTexture.OnFrameAvailableListener用于通知TextureView内容流有新图像到来。SurfaceTextureListener接口用于让TextureView的使用者知道SurfaceTexture已准备好,这样就可以把SurfaceTexture交给相应的内容源。Surface为BufferQueue的Producer接口实现类,使生产者可以通过它的软件或硬件渲染接口为SurfaceTexture内部的BufferQueue提供graphic buffer。

结构类图如下

这里不啰嗦解释,具体看官方API文档

Textureview API

MainView

自定义一个view,注意TextureView中的draw方法和onDraw方法都是被定义成final的,不能被子类覆盖。所以必须可以通过实现TextureView.SurfaceTextureListener 接口,然后重写onSurfaceTextureAvailable方法,把你想添加的功能加到这个方法里即可,这里加入播放视频的功能

package com.test.xingliu.texturesample;import android.content.Context;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.view.Surface;
import android.view.TextureView;import java.io.IOException;/*** Created by Xingliu on 2016/12/5.*/
public class MainView extends TextureView implements TextureView.SurfaceTextureListener {private static final String FILE_NAME = "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov";private MediaPlayer mMediaPlayer;public MainView(Context context) {super(context);initView();}public void stopPlay() {if (mMediaPlayer != null) {mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer = null;}}private void initView() {setSurfaceTextureListener(this);}@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) {Surface surface = new Surface(surfaceTexture);try {mMediaPlayer = new MediaPlayer();mMediaPlayer.setDataSource(FILE_NAME);mMediaPlayer.setSurface(surface);mMediaPlayer.prepareAsync();mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mMediaPlayer.start();}});} catch (Exception e) {e.printStackTrace();}}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) {}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {return true;}@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
}

对应的activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="176dp"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><com.test.xingliu.texturesample.MainViewandroid:id="@+id/textureView"android:layout_width="match_parent"android:layout_height="176dp"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin" /></LinearLayout>

MainActivity

package com.test.xingliu.texturesample;import android.app.Activity;
import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new MainView(this));}@Overrideprotected void onDestroy() {new MainView(this).stopPlay();super.onDestroy();}}

mainifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.test.xingliu.texturesample"><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><application
        android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

效果图如下,由于资源是网络上的,需要联网才能播放

需要注意到是在硬件加速的情况下,TextureView是用GPU渲染的,软件上的Canvas是不能进行处理的,而TextureView必须在硬件加速的窗口中,可以调用lockcanvas()方法来获取canvas

转载于:https://www.cnblogs.com/ainima/p/6331769.html

TextureView实现视频播放相关推荐

  1. MediaPlayer+TextureView实现视频播放器

    Android中实现视频播放器的途径有两种: 使用VideoView 通过MediaPlayer + SurfaceView/ TextureView 1. VideoView VideoView使用 ...

  2. android 视频播放器-列表播放器

    github地址 HeartVideo HeartVideo是通过封装Mediaplayer+TextureView的视频播放器,封装此库的初衷是因为开发过程中简单的应用却要加载第三方过大的库增加了包 ...

  3. Android 仿今日头条视频播放器实现(不使用节操哟)

    1.概述 本人经常刷今日头条,里面的视频模块我觉得做的很好,做Android的嘛,看到好的东西就想怎么实现的.头条的那个视频播放器,只能同时播放同一个视频,点击下一个上一个就停止,觉得这功能不错,决定 ...

  4. Android视频滤镜添加硬解码方案

    由于工作的需求,研究过了一段时间的Android 的音视频播放渲染以及编辑方面的知识,这里就自己一些浅薄的了解对所了解做一个简单的介绍和记录,如有不对的地方请指正!同时也会记录下硬件解码的情况下完成滤 ...

  5. ExoPlayer详解——高级主题(官方文档)

    ExoPlayer详解系列文章 ExoPlayer详解--入门(官方文档) ExoPlayer详解--媒体类型(官方文档) ExoPlayer详解--高级主题(官方文档) 一.数字版权管理 ExoPl ...

  6. TextureView+MediaPlayer实现在线短视频播放

    Android多媒体开发系列文章 Android多媒体开发:录音机 Android多媒体开发:照相机 TextureView+MediaPlayer实现在线短视频播放 Android多媒体开发:第三方 ...

  7. textureview 缩放_用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器...

    原标题:用MediaPlayer+TextureView封装一个完美实现全屏.小窗口的视频播放器 本文作者 本文由xiaoyanger授权发布. xiaoyanger的博客地址: http://www ...

  8. 一步步自定义视频播放器——TextureView+MediaPlayer自定义视频播放器

    本篇参考封装一个视频播放器,原文已经写的非常棒了,本篇加入了个人对其内容的理解.秉承不重复造轮子的良好理念,接下来开始拆解轮子.内容非常多,我都差点放弃写,有耐心的请往下看 github上非常棒的视频 ...

  9. MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器

    NiceVieoPlayer 项目地址:xiaoyanger0825/NiceVieoPlayer  简介:MediaPlayer+TextureView,完美切换全屏.小窗口的 Android 视频 ...

  10. Android ijk视频播放器使用TextureView问题

    在视频播放器添加了个菜单,能多次在系统播放器和ijk播放器切换,但是在二次切换ijk播放器出问题:TextureView二次切换初始化时不会回调SurfaceTextureListener. 原有的i ...

最新文章

  1. Unix网络编程--进程间通信--管道通信
  2. 在SQLite中使用事务
  3. 汇编之浮点数处理(CrackMe003前置知识)
  4. Lintcode214-Max of Array-Naive
  5. mysql 集群 主从复制
  6. 提高mysql查询速度_如何提高数据库查询速度
  7. SQL SERVER “扩展属性的应用
  8. LeetCode 96. Unique Binary Search Trees
  9. python之条件-循环和其他语句
  10. 采用C语言写文本文件实例
  11. 数据结构视频教程 -《新东方计算机考研数据结构强化班》
  12. 计网 - 计算机网络开篇
  13. Tracking By Detecting的多目标跟踪
  14. 如何识别一个网站是正规合法的网站
  15. 谷歌浏览器安全证书不受信任_windows7系统下谷歌浏览器提示该网站的安全证书不受信任如何解决...
  16. 总体和个体,样本和样本值
  17. UITableView性能优化
  18. 计算机专业实践体会,计算机专业毕业实习心得体会
  19. java毕业设计铝塑门窗的研制和生产管理源码+lw文档+mybatis+系统+mysql数据库+调试
  20. SpringSecurity:密码登录与token登录过程理解

热门文章

  1. 谈谈运维监控那些事儿
  2. python转cython_Cython的简单使用
  3. office版本都有哪些_文员需要熟练掌握哪些办公软件啊?
  4. python中self和cls的区别
  5. [洛谷1533] 可怜的狗狗
  6. 购物车的简单添加与计算
  7. Android 数字动画
  8. HDU 2553(N皇后问题)
  9. 防止电子眼拍到车牌的秘籍
  10. iOS 代码命名规范 及Android 代码命名规范(2)Android