通过HTTPS流式传输MP4视频时出现MediaPlayer错误

时间:2014-09-27 12:38:13

标签: android streaming video-streaming android-mediaplayer

我在自定义VideoView上通过HTTP成功传输视频。

但是现在,我尝试通过HTTPS流式传输已签名的视频。

让我们以下面的网址为例:

https://api.akm.info/users/5e2badf4-4e63-4e36-929e-90f7be3e407a/videos/UxZkUACjSyxZhjzG?lat=45.6574&lng=150.234

这些是请求的身份验证标头,我从中构建了Map标头:

Akm-Client-Timestamp : 2014-09-27T12:18:07Z
Authorization : AKM wdMTVz5Oesgf+UVWO4CX:546gtSMWUPhP8kKPJFaBgZTzWALj/kx3PASz+Y/Za08=
ACCEPT : application/json

我已将setDataSource (Context context, Uri uri, Map<String, String> headers )用于较新版本的Android和Java reflection,以使用ICE_CREAM_SANDWICH之前的标头调用隐藏的setDataSource方法。以及地图上的所有先前标题。

自定义VideoView.java类中的

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    mMediaPlayer.setDataSource (getContext (), mUri, mHeaders);
} else {
    Method method = null;
    try {
        method = mMediaPlayer.getClass ().getMethod ("setDataSource", new Class[] { Context.class, Uri.class, Map.class });
    } catch (NoSuchMethodException e) {
        Log.w (TAG, "Unable to open content: " + mUri, e);
        mCurrentState = STATE_ERROR;
        mTargetState = STATE_ERROR;
        mErrorListener.onError (mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
        return;
    }

    try {
        method.invoke (mMediaPlayer, new Object[] {this, mUri, mHeaders});
    } catch (IllegalAccessException e) {
        Log.w (TAG, "Unable to open content: " + mUri, e);
        mCurrentState = STATE_ERROR;
        mTargetState = STATE_ERROR;
        mErrorListener.onError (mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
        return;
    } catch (InvocationTargetException e) {
        Log.w (TAG, "Unable to open content: " + mUri, e);
        mCurrentState = STATE_ERROR;
        mTargetState = STATE_ERROR;
        mErrorListener.onError (mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
        return;
    } 
}

并且在播放时我收到此错误:

MediaPlayer : error (1, -1004)
AwesomePlayer: mConnectingDataSource->connect () returned -1004

编辑:我想指出这不是因为视频格式,因为当我下载这个视频并将其存储到手机的外部存储器时,它可以使用我的自定义播放VideoView

有什么办法可以解决这个问题吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

您可能遇到ssl证书问题。在主要代码之前,请尝试阅读此引用以信任所有证书:Trusting all certificates using HttpClient over HTTPSAccepting a certificate for HTTPs on Androidhttp://blog.denevell.org/android-trust-all-ssl-certificates.html

可能是希望你。

我使用此代码:

  TrustManager[] trustAllCerts = new TrustManager[]
   { new X509TrustManager()
      {
        public java.security.cert.X509Certificate[] getAcceptedIssuers()  { return null; }
        public void checkClientTrusted( X509Certificate[] chain, String authType) {}
        public void checkServerTrusted( X509Certificate[] chain, String authType) {}
      }
   };

  try
    {
      SSLContext sc = SSLContext.getInstance( "SSL"); // "TLS" "SSL"
      sc.init( null, trustAllCerts, null);
      // sc.init( null, trustAllCerts, new java.security.SecureRandom());
      HttpsURLConnection.setDefaultSSLSocketFactory( sc.getSocketFactory());
      HttpsURLConnection.setDefaultHostnameVerifier( 
       new HostnameVerifier() 
        {
          public boolean verify( String hostname, SSLSession session) { return true; }
        } );
    }
   catch (Exception e) {}
相关问题