手机coursera播放视频时遇到错误。请退出播放器后再试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手机coursera播放视频时遇到错误。请退出播放器后再试相关的知识,希望对你有一定的参考价值。

参考技术A coursera的视频是通过d3c33hcgiwev3.cloudfront.net 上面去获取的,所以可以修改hosts中的域名解析进而访问到视频。但是这个对coursera有用。
每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。而当我们访问一些网站发出请求时计算机会先从Hosts(计算机里面的一个域)中获取域名解析,找不到时再通过DNS解析返回获得,这时GFWed 会破坏(被墙的网站)返回结果,因而无法访问。

手机影音第九天,控制视频全屏播放与退出全屏播放,音量调节按钮来控制视频音量与静音的实现

    代码以托管到码云,有兴趣的小伙伴可以下载看看

    https://git.oschina.net/joy_yuan/MobilePlayer

一、视频全屏播放与退出全屏  

  系统默认的videoview类,没有调整大小的方法,因此需要自定义一个类,继承videoview,然后重写里面的三个构造方法,再自定义一个调整视频播放页面大小的方法。

    1、布局文件

        同时,在视频播放的布局文件中,videoview布局要引用上面自定义的类。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
                android:gravity="center"
                android:background="#000000"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <com.yuanlp.mobileplayer.view.MyVideoView
        android:layout_centerInParent="true"
        android:id="@+id/videoview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <include layout="@layout/media_controller" android:id="@+id/media_controller"/>


</RelativeLayout>

2、自定义的类

package com.yuanlp.mobileplayer.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.VideoView;

/**
 * Created by 原立鹏 on 2017/7/19.
 */

public class MyVideoView extends VideoView {

    //在代码中创建的时候用,即new
    public MyVideoView(Context context) {
        this(context,null);
    }

    //当在布局文件中使用该类的时候,系统自动使用该构造方法
    public MyVideoView(Context context, AttributeSet attrs) {
       this(context, attrs,0);
    }

    /**
     * 当需要样式时,使用该类
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public MyVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    /**
     * 测量
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 设置视频的宽高
     * @param width
     * @param height
     */
    public void setVideoSize(int width,int height){
        ViewGroup.LayoutParams params=getLayoutParams();
        params.width=width;
        params.height=height;
        setLayoutParams(params);
    }
}

3、设置全屏播放

    在准备播放视频的回调方法中,获取视频的长、宽;

/**
 * 准备好播放时的监听
 */
class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {
    

    @Override
    public void onPrepared(MediaPlayer mp) {
        videoview.start(); //开始播放
        duration = videoview.getDuration();  //获取视频总时长
        seekbarVideo.setMax(duration);   //设置播放进度的最大值

        //发送消息,来更新视频进度
        handler.sendEmptyMessage(PROGRESS);

        //设置显示的视频总时长
        tvDuration.setText(utils.stringForTime(duration));

        //默认进入播放时,隐藏
        media_controller.setVisibility(View.GONE);
        isShow=false;  //设置为隐藏

        //获取播放器播放视频的宽度和高度
        videoHeight=mp.getVideoHeight();
        videoWidth=mp.getVideoWidth();
       // videoview.setVideoSize(mp.getVideoWidth(),mp.getVideoHeight());

        setVideoType(DEFAULTSCREEN);
    }
}

    利用系统的DisplayMetrics来获取手机屏幕的宽高;

/**
 * 获取手机屏幕的宽度高度像素
 */
DisplayMetrics displayMetrics=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

screenWidth=displayMetrics.widthPixels;
screenHeight=displayMetrics.heightPixels;

4、当双击屏幕后,去判断当前是否是全屏,定义一个全局变量isFullScreen,默认false来判断是否全屏,

    4.1 如果不是全屏,那么就设置为全屏,将isFullScreen设置为true,

           将屏幕的宽,设置为视频的宽,屏幕的高,设置为视频的高

            将右下角的那个视频是否全屏的图标换了

        

else{
    //是默认,设置为全屏
    setVideoType(FULLSCREEN);
}
。。。。。。
private void setVideoType(int screen) {
  if (screen==FULLSCREEN){
      //1、设置视频画面大小
        videoview.setVideoSize(screenWidth,screenHeight);
      //2、设置按钮变化
      btVideoSwitchScreen.setBackgroundResource(R.drawable.bt_video_switch_screen_default_selector);
      //3、设置isFullScreen=true;
      isFullScreen=true;
  }else if (screen==DEFAULTSCREEN){
        int mVideoWidth=videoWidth;  //视频真实宽度
        int mVideoHeight=videoHeight; //视频真实高度

      videoview.setVideoSize(mVideoWidth,mVideoHeight);
      btVideoSwitchScreen.setBackgroundResource(R.drawable.bt_video_switch_screen_full_selector);
      isFullScreen=false;
  }
}

    4.2 如果当前已经是全屏,那么就设置isFullScreen为false,设置为正常屏幕大小

        根据前面获取到的准备播放时的回调方法里的宽高设置为播放器的宽高

    

if (isFullScreen){
   //是全屏,则设置为默认
    setVideoType(DEFAULTSCREEN);
}


二、设置seekbarvoice这个控制播放器音量

  1、  播放器音量可以通过AudioManager来获取实例控制

/**
 * 实例化音量管理器
 */
audioManager= (AudioManager) getSystemService(Context.AUDIO_SERVICE);

currentVoice=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); //当前音量
maxVoice=audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);  //最大音量/

2、设置seekbarvoice音量进度条的最大值和当前值,注意,音量最大值为15.

//设置音量监听
seekbarVoice.setOnSeekBarChangeListener(new VoiceOnSeekBarChangeListener());
//设置音量
seekbarVoice.setMax(maxVoice);
seekbarVoice.setProgress(currentVoice);

3、创建音量进度条的变化监听类

/**
 * 音量进度条变化监听
 */
class VoiceOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser){
            if (progress>0){
                isMuteVoice=false;
            }else{
                isMuteVoice=true;
            }
            setVoice(progress,isMuteVoice);
        }

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        handler.removeMessages(HIDEVIDEO);
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        handler.sendEmptyMessageDelayed(HIDEVIDEO,3000);
    }
}

public void setVoice(int progress,boolean isMuteVoice) {
    if (isMuteVoice){
        seekbarVoice.setProgress(0);
        //音量控制器控制音量变化
        //audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,1);  //第三个参数设置1,表示显示系统音量进度
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0,0);  //第三个参数设置1,表示显示系统音量进度

    }else {

        //音量控制器控制音量变化
        //audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,1);  //第三个参数设置1,表示显示系统音量进度
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);
        seekbarVoice.setProgress(progress);
        currentVoice=progress;  //把音量赋值给当前音量
        Log.d(TAG, "setVoice: 当前声音"+currentVoice);
        System.out.println("setVoice ----------当前声音"+currentVoice);
    }

}

通过进度条变化时的progress值,来控制系统音量和设置seekbar上的进度。


4、点击声音按钮时,会设置静音与否

    

if ( v == btnVoice ) {
            // Handle clicks for btnVoice
            isMuteVoice=!isMuteVoice;
           setVoice(currentVoice,isMuteVoice);
//            if (isMuteVoice){
//                //是静音,设置为不静音
//                isMuteVoice=false;
//                seekbarVoice.setProgress(currentVoice);
//                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,currentVoice,0);
//            }else {
//                //不是静音,设置为静音
//                isMuteVoice=true;
//                seekbarVoice.setProgress(0);
//                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0,0);
//
//            }
        }

至此,视频的全屏播放,音量变化与静音已经做好

本文出自 “YuanGuShi” 博客,请务必保留此出处http://cm0425.blog.51cto.com/10819451/1949571

以上是关于手机coursera播放视频时遇到错误。请退出播放器后再试的主要内容,如果未能解决你的问题,请参考以下文章

coursera视频可以拉吗

极品代码一般人我不告诉他,手机端h5播放时不自动全屏代码

手机影音第九天,控制视频全屏播放与退出全屏播放,音量调节按钮来控制视频音量与静音的实现

coursera视频无法播放(翻墙也无效)?看这里就全懂了

当我在我自己创建的应用程序中播放视频时,面对错误“初始化管播放器时出错”

解决win/mac无法播放coursera视频