91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android使用MediaPlayer和TextureView實現視頻無縫切換

發布時間:2020-08-26 21:02:06 來源:腳本之家 閱讀:345 作者:Winson_Zhou 欄目:移動開發

需求描述

比如廣告播放,每個視頻15秒,視頻之間切換的時候,性能不太好的機器可能會黑屏一段時間,體驗不太好,接下來我們就是要解決這個黑屏問題。

解決方案

使用兩個surfaceView方式,經過測試不行
使用一個MediaPlayer,在MediaPlayer上面加一層ImageView,每次播放完成后,獲取視頻的最后一幀的圖像給ImageView,視頻切換完成,ImageView隱藏,如此往復循環,可行

實踐

1.獲取視頻流圖片方式,通過MediaMetadataRetriever,測試發現,部分機器獲取的Bitmap可能為空,無法解決,放棄

2.使用TextureView方式,可以獲取當前幀的Bitmap,可行,下面貼代碼

package com.winson.blog.video;
 
import android.graphics.Bitmap;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
 
import java.io.IOException;
 
public class VideoFragment extends Fragment {
 
 public static final String TAG = VideoFragment.class.getSimpleName();
 
 String TEST_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/testmp4.mp4";
 int mIndex = 0;
 String path2 = TEST_PATH;
 String[] paths = new String[]{TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH};
 
 boolean destory;
 Handler mHandler;
 Runnable mPlayRun;
 FrameLayout content;
 TextureView textureView;
 ImageView frameImage;
 MediaPlayer mediaPlayer;
 Bitmap lastFrameBitmap;
 
 public void updateResources(String[] paths) {
 this.paths = paths;
 if(mHandler != null && mPlayRun!= null){
  mHandler.post(mPlayRun);
 }
 }
 
 @Override
 public void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 mHandler = new Handler();
 mediaPlayer = new MediaPlayer();
 mPlayRun = new Runnable() {
 
  @Override
  public void run() {
 
  if (mediaPlayer == null || destory) {
   return;
 
  }
  mediaPlayer.pause();
  mediaPlayer.reset();
 
  try {
   String path = paths[mIndex % paths.length];
   mIndex++;
 
   mediaPlayer.setDataSource(getActivity(), Uri.parse(path));
   mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
 
   @Override
   public void onPrepared(MediaPlayer arg0) {
    mediaPlayer.start();
    frameImage.setVisibility(View.GONE);
   }
   });
   mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
   @Override
   public void onCompletion(MediaPlayer mp) {
    frameImage.setVisibility(View.VISIBLE);
    Bitmap currentFrameBitmap = textureView.getBitmap();
    frameImage.setImageBitmap(currentFrameBitmap);
    if (lastFrameBitmap != null) {
    lastFrameBitmap.recycle();
    }
    lastFrameBitmap = currentFrameBitmap;
 
    mHandler.post(mPlayRun);
   }
   });
   mediaPlayer.prepareAsync();
 
  } catch (Exception e) {
   e.printStackTrace();
  }
  }
 
 };
 }
 
 
 public void release() {
 mHandler.removeCallbacks(mPlayRun);
 if (mediaPlayer != null) {
  mediaPlayer.pause();
  mediaPlayer.release();
 }
 }
 
 public Bitmap getBitmap() {
 return textureView == null ? null : textureView.getBitmap();
 }
 
 @Override
 public void onDestroy() {
 super.onDestroy();
 release();
 }
 
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 content = new FrameLayout(getActivity());
 
 FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
 lp.gravity = Gravity.LEFT | Gravity.TOP;
 
 textureView = new TextureView(getActivity());
 textureView.setLayoutParams(lp);
 content.addView(textureView);
 
 frameImage = new ImageView(getActivity());
 frameImage.setScaleType(ImageView.ScaleType.FIT_XY);
 frameImage.setLayoutParams(lp);
 content.addView(frameImage);
 
 textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
  @Override
  public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
  Surface s = new Surface(surface);
  mediaPlayer.setSurface(s);
 
  }
 
  @Override
  public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
  }
 
  @Override
  public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
  return false;
  }
 
  @Override
  public void onSurfaceTextureUpdated(SurfaceTexture surface) {
  }
 });
 
 return content;
 }
 
 @Override
 public void onActivityCreated(@Nullable Bundle savedInstanceState) {
 super.onActivityCreated(savedInstanceState);
 
 testPlay();
 }
 
 public void testPlay() {
// mediaPlayer.pause();
// mediaPlayer.reset();
//
// try {
//  mediaPlayer.setDataSource(getActivity(), Uri.parse(TEST_PATH));
//  mediaPlayer.prepare();
//  mediaPlayer.start();
// } catch (IOException e) {
//  e.printStackTrace();
// }
 
 mHandler.post(mPlayRun);
 }
 
 
}

相關鏈接,github地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

诏安县| 龙川县| 绥芬河市| 鸡东县| 田东县| 邛崃市| 九龙县| 长寿区| 北流市| 嘉禾县| 浠水县| 灵璧县| 贵南县| 宜昌市| 都兰县| 义马市| 宜君县| 太康县| 乌恰县| 益阳市| 镇原县| 兰溪市| 保康县| 韶山市| 桑日县| 万山特区| 龙江县| 浙江省| 都昌县| 常宁市| 绩溪县| 兴隆县| 西丰县| 深水埗区| 长治市| 宁强县| 红原县| 长泰县| 景洪市| 滨州市| 历史|