-
Notifications
You must be signed in to change notification settings - Fork 246
KSYTextureView
KSYTextureView继承了TextureView并对KSYMediaPlayer进行封装,接口与KSYMediaPlayer保持一致,但将setSurface和setDisplay两个接口去除,其相关逻辑已移至KSYTextureView内部处理,用户无需再做处理。
KSYTextureView在软解或硬解的情况下均可使用,并支持在硬解情况下前后台切换不黑屏或花屏、切后台音频播放、旋转、缩放、截图等功能
在KSYTextureView实现了TextureView.SurfaceTextureListener
并在初始化时设置了对应的监听器,不建议用户再设置SurfaceTextureListener
需要注意的是在前后台切换时需调用相关接口,具体可见文档的 前后台切换 这一节内容
v1.5.4及以上版本。
Android 4.1(API Level 16)及以上
首先需在你的布局中添加KSYTextureView
<com.ksyun.media.player.KSYTextureView
android:id="@+id/ksy_textureview"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:targetApi="ice_cream_sandwich"/>
KSYTextureView的调用接口与KSYMediaPlayer的调用方式相同,具体可参考KSYMediaPlayer接口调用方式,下面我们对KSYTextureView的主要调用点进行说明:
public class VideoPlayerActivity extends Activity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
//不需要再显示的创建mVideoView
mVideoView = (KSYTextureView) findViewById(R.id.ksy_textureview);
//设置监听器
mVideoView.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
mVideoView.setOnCompletionListener(mOnCompletionListener);
mVideoView.setOnPreparedListener(mOnPreparedListener);
mVideoView.setOnInfoListener(mOnInfoListener);
mVideoView.setOnVideoSizeChangedListener(mOnVideoSizeChangeListener);
mVideoView.setOnErrorListener(mOnErrorListener);
mVideoView.setOnSeekCompleteListener(mOnSeekCompletedListener);
//设置播放参数
mVideoView.setBufferTimeMax(2.0f);
mVideoView.setTimeout(5, 30);
//......
//(其它调用)
//......
//设置播放地址并准备
mVideoView.setDataSource("http://your_address.flv");
mVideoView.prepareAsync();
}
}
播放器内部完成初始化后会调用OnPreparedListener的onPrepared。所以需要在开始播放之前设置所需的缩放模式,然后调用start开始播放。经过此步之后应该可以在设备上看到你所播放的视频。
private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(IMediaPlayer mp) {
if(mVideoView != null) {
// 设置视频伸缩模式,此模式为裁剪模式
mVideoView.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
// 开始播放视频
mVideoView.start();
}
}
}
当不想再继续播放时,需要调用stop来停止播放
private View.OnClickListener mStopButton = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mVideoView != null){
mVideoView.stop();
}
}
}
在开始新的播放之前需要调用reset对播放器进行重置,然后再开始新的播放。reset后缩放模式、旋转角度会被重置需要重新设置。
if (mVideoView != null){
//当前有视频正在播放,需先停止当前播放
mVideoView.stop();
//重置播放
mVideoView.reset();
//设置新的播放地址
mVideoView.setDataSource("http://your_new_address.mp4");
mVideoView.prepareAsync();
}
在播放过程中进行前后台切换时需要调用相应的接口:切后台调runInBackground,切回前台调runInForeground。在v1.6.1之后runInForeground的行为由原来的切回前台直接播放调整为若调用runInBackground时设置为音频后台播放(即参数设为true),则切回前台调用runInForeground后自动恢复播放状态。若调用runInBackground时设置参数为false,则切回前台调用runInForeground后播放仍处于暂停状态,需要用户手动调用播放start启动播放。
@Override
protected void onPause() {
super.onPause();
if (mVideoView != null) {
//mAudioBackgroundPlay为true表示切换到后台后仍然播放音频
mVideoView.runInBackground(mAudioBackgroundPlay);
}
}
@Override
protected void onResume() {
super.onResume();
if (mVideoView != null) {
mVideoView.runInForeground();
}
}
在播放界面进行分享QQ、微信等操作时,需要在触发分享事件时调用void setComeBackFromShare(boolean comeBackFromShare)
方法,comeBackFromShare为true表示需要从分享返回。如果没有调用此函数分享回来后会有一直黑屏问题,下面以QQ分享为例:
btn_shareQQ.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mVideoView != null){
mVideoView.setComeBackFromShare(true);
}
tencent = Tencent.createInstance("1105762334", getApplicationContext());
final Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的标题");
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要");
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "http://www.qq.com/news/1.html");
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试应用222222");
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, 80);
tencent.shareToQQ(TextureVideoActivity.this, params,mShareListener );
}
});
当不再进行播放且要离开所在Activity时,需要调用release将播放释放。注意此调用只有在不再进行播放且离开Activity时才能调用。如果只是停止此次播放以便播放新的视频请参看上面的"再次播放"说明。
private void videoPlayEnd() {
if (mVideoView != null) {
//释放播放器
mVideoView.release();
}
}
以上就是KSYTextureView的主要调用处理,具体的用法请参考demo的TextureVideoActivity.java文件中的调用。
###KSYTextureView与KSYMediaPlayer接口对比 相比于KSYMediaPlayer的接口KSYTextureView有如下改动: ####去掉接口:
void setSurface(Surface surface);
void setDisplay(SurfaceHolder sh)
void setSurfaceTexture(SurfaceTexture surfTexture);
####新增接口:
void runInBackground(boolean audioPlay);//audioPlay:true后台音频继续播放 audioPlay:false停止所有播放
void runInForeground();