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

首頁 > 系統 > Android > 正文

Android中使用TextureView播放視頻

2019-10-22 18:13:15
字體:
來源:轉載
供稿:網友

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

1).TextureView的兄弟SurfaceView

應用程序的視頻或者opengl內容往往是顯示在一個特別的UI控件中:SurfaceView。

SurfaceView的工作方式是創建一個置于應用窗口之后的新窗口。這種 方式的效率非常高,因為SurfaceView窗口刷新的時候不需要重繪應用程序的窗口(android普通窗口的視圖繪制機制是一層一層的,任何一個子元素或者 是局部的刷新都會導致整個視圖結構全部重繪一次,因此效率非常低下,不過滿足普通應用界面的需求還是綽綽有余),但是SurfaceView也有一些非常  不便的限制。

因為SurfaceView的內容不在應用窗口上,所以不能使用變換(平移、縮放、旋轉等)。也難以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如View.setAlpha()。

2).Android 4.0中的TextureView。

為了解決這個問上面那個我們剛說到的問題Android 4.0中引入了TextureView;

TextureView與SurfaceView相比,TextureView并沒有創建一個單獨的Surface用來繪制,這使得它可以像一般的View一樣執行一些變換操作,設置透明度等。

另外,Textureview必須在硬件加速開啟的窗口中。

項目中碰到的問題:

1.之前用SurfaceView播放視頻的時候,從圖片切換到播放視頻,會出現黑屏的現象。

2.SurfaceView靈活性沒有TextureView好。

下面是實現源碼,大家參考一下

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);//設置監聽函數 重寫4個方法      //   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();//開啟一個線程去播放視頻   }   @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沒有文件就復制過去    */   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創建的時顯示圖片,然后初始化播放器,預加載視頻,如果視頻文件不存在,從assets下copy一份到sdcard目錄下,視頻加載完畢隱藏圖片,我這邊圖片默認顯示的是android項目自帶的圖片,你們可以根據需求顯示想要的圖片。

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> 

放了一個TextureView跟一個ImageView  TextureView初始化顯示ImageView...當視頻播放的時候隱藏ImageView,并且切換過去的時候不會出現黑屏。

如果播放在線視頻出現閃屏的問題,需要開啟一個線程異步播放視頻,然后再用handle延時隱藏圖片。我用的是延時300毫秒

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

最終效果

Android,TextureView,播放視頻

Demo源碼下載


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丰台区| 资源县| 石狮市| 辛集市| 新巴尔虎右旗| 东乌珠穆沁旗| 沙雅县| 侯马市| 灵寿县| 吉林省| 上虞市| 沈丘县| 资兴市| 中方县| 朔州市| 固阳县| 黎川县| 灵台县| 炎陵县| 郸城县| 山丹县| 寻甸| 登封市| 城固县| 石泉县| 松原市| 高邑县| 高台县| 镇安县| 独山县| 门源| 云龙县| 横山县| 长泰县| 曲周县| 洪泽县| 长宁县| 伊宁市| 尚志市| 巴里| 永宁县|