国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android中使用TextureView播放視頻

2019-12-12 01:03:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

如果你想顯示一段在線視頻或者任意的數(shù)據(jù)流比如視頻或者OpenGL 場(chǎng)景,你可以用android中的SurfaceView或者TextureView做到。

1).TextureView的兄弟SurfaceView

應(yīng)用程序的視頻或者opengl內(nèi)容往往是顯示在一個(gè)特別的UI控件中:SurfaceView。

SurfaceView的工作方式是創(chuàng)建一個(gè)置于應(yīng)用窗口之后的新窗口。這種 方式的效率非常高,因?yàn)镾urfaceView窗口刷新的時(shí)候不需要重繪應(yīng)用程序的窗口(android普通窗口的視圖繪制機(jī)制是一層一層的,任何一個(gè)子元素或者 是局部的刷新都會(huì)導(dǎo)致整個(gè)視圖結(jié)構(gòu)全部重繪一次,因此效率非常低下,不過(guò)滿足普通應(yīng)用界面的需求還是綽綽有余),但是SurfaceView也有一些非常  不便的限制。

因?yàn)镾urfaceView的內(nèi)容不在應(yīng)用窗口上,所以不能使用變換(平移、縮放、旋轉(zhuǎn)等)。也難以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如View.setAlpha()。

2).Android 4.0中的TextureView。

為了解決這個(gè)問(wèn)上面那個(gè)我們剛說(shuō)到的問(wèn)題Android 4.0中引入了TextureView;

TextureView與SurfaceView相比,TextureView并沒(méi)有創(chuàng)建一個(gè)單獨(dú)的Surface用來(lái)繪制,這使得它可以像一般的View一樣執(zhí)行一些變換操作,設(shè)置透明度等。

另外,Textureview必須在硬件加速開(kāi)啟的窗口中。

項(xiàng)目中碰到的問(wèn)題:

1.之前用SurfaceView播放視頻的時(shí)候,從圖片切換到播放視頻,會(huì)出現(xiàn)黑屏的現(xiàn)象。

2.SurfaceView靈活性沒(méi)有TextureView好。

下面是實(shí)現(xiàn)源碼,大家參考一下

MainActivity.java文件

package com.example.textureviewvideo;  import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream;  import android.app.Activity; import android.content.res.AssetManager; import android.graphics.SurfaceTexture; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.view.TextureView.SurfaceTextureListener; import android.widget.ImageView;  public class MainActivity extends Activity implements SurfaceTextureListener{ // private TextureView textureView;   private MediaPlayer mMediaPlayer;   private Surface surface;      private ImageView videoImage;      @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     TextureView textureView=(TextureView) findViewById(R.id.textureview);     textureView.setSurfaceTextureListener(this);//設(shè)置監(jiān)聽(tīng)函數(shù) 重寫(xiě)4個(gè)方法      //   textureView=new TextureViewTest(this); //   setContentView(textureView);     videoImage=(ImageView) findViewById(R.id.video_image);   }      @Override   public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,int height) {     System.out.println("onSurfaceTextureAvailable onSurfaceTextureAvailable");     surface=new Surface(surfaceTexture);     new PlayerVideo().start();//開(kāi)啟一個(gè)線程去播放視頻   }   @Override   public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,int height) {     System.out.println("onSurfaceTextureSizeChanged onSurfaceTextureSizeChanged");   }      @Override   public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {     System.out.println("onSurfaceTextureDestroyed onSurfaceTextureDestroyed");     surfaceTexture=null;     surface=null;     mMediaPlayer.stop();     mMediaPlayer.release();     return true;   }      @Override   public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { //   System.out.println("onSurfaceTextureUpdated onSurfaceTextureUpdated");   }      private class PlayerVideo extends Thread{     @Override     public void run(){        try {          File file=new File(Environment.getExternalStorageDirectory()+"/ansen.mp4");          if(!file.exists()){//文件不存在            copyFile();          }          mMediaPlayer= new MediaPlayer();          mMediaPlayer.setDataSource(file.getAbsolutePath());           mMediaPlayer.setSurface(surface);          mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);          mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {           @Override           public void onPrepared(MediaPlayer mp){             videoImage.setVisibility(View.GONE);             mMediaPlayer.start();           }          });          mMediaPlayer.prepare();        } catch (Exception e) {           e.printStackTrace();        }     }   }      public interface PlayerController{     public void play();   }      /**    * 如果sdcard沒(méi)有文件就復(fù)制過(guò)去    */   private void copyFile() {     AssetManager assetManager = this.getAssets();     InputStream in = null;     OutputStream out = null;     try {       in = assetManager.open("ansen.mp4");       String newFileName = Environment.getExternalStorageDirectory()+"/ansen.mp4";       out = new FileOutputStream(newFileName);       byte[] buffer = new byte[1024];       int read;       while ((read = in.read(buffer)) != -1) {         out.write(buffer, 0, read);       }       in.close();       in = null;       out.flush();       out.close();       out = null;     } catch (Exception e) {       Log.e("tag", e.getMessage());     }   } }

TextureView創(chuàng)建的時(shí)顯示圖片,然后初始化播放器,預(yù)加載視頻,如果視頻文件不存在,從assets下copy一份到sdcard目錄下,視頻加載完畢隱藏圖片,我這邊圖片默認(rèn)顯示的是android項(xiàng)目自帶的圖片,你們可以根據(jù)需求顯示想要的圖片。

activity_main.xml布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:tools="http://schemas.android.com/tools"   android:layout_width="match_parent"   android:layout_height="match_parent" >    <TextureView     android:id="@+id/textureview"     android:layout_width="wrap_content"     android:layout_height="wrap_content"/>         <ImageView     android:id="@+id/video_image"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:src="@drawable/ic_launcher"/> </RelativeLayout> 

放了一個(gè)TextureView跟一個(gè)ImageView  TextureView初始化顯示ImageView...當(dāng)視頻播放的時(shí)候隱藏ImageView,并且切換過(guò)去的時(shí)候不會(huì)出現(xiàn)黑屏。

如果播放在線視頻出現(xiàn)閃屏的問(wèn)題,需要開(kāi)啟一個(gè)線程異步播放視頻,然后再用handle延時(shí)隱藏圖片。我用的是延時(shí)300毫秒

private void sendEmpryMessage(){   handler.sendEmptyMessageDelayed(0,300);//給主線程發(fā)送一個(gè)隱藏圖片的消息 } 

最終效果

Demo源碼下載

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清涧县| 木兰县| 南涧| 湟源县| 盐池县| 龙川县| 互助| 叙永县| 安图县| 涟水县| 宁乡县| 太仆寺旗| 贵州省| 南宁市| 宜良县| 罗江县| 延寿县| 莱阳市| 金寨县| 朝阳区| 富平县| 安福县| 夏河县| 海口市| 读书| 天全县| 顺平县| 施甸县| 通渭县| 柯坪县| 星座| 新宾| 阿图什市| 贵阳市| 湘潭县| 成安县| 毕节市| 兴安盟| 大埔县| 忻城县| 左云县|