Пример #1
0
 private IMediaSource GetMediaSourceFromUrl(Uri uri, string extension, string tag, IDrmSessionManager drmSessionManager)
 {
     try
     {
         var BandwidthMeter = DefaultBandwidthMeter.GetSingletonInstance(ActivityContext);
         //DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(MainContext, Util.GetUserAgent(MainContext, AppSettings.ApplicationName), mBandwidthMeter);
         var          buildHttpDataSourceFactory     = new DefaultDataSourceFactory(ActivityContext, BandwidthMeter, new DefaultHttpDataSourceFactory(Util.GetUserAgent(ActivityContext, AppSettings.ApplicationName)));
         var          buildHttpDataSourceFactoryNull = new DefaultDataSourceFactory(ActivityContext, BandwidthMeter, new DefaultHttpDataSourceFactory(Util.GetUserAgent(ActivityContext, AppSettings.ApplicationName)));
         int          type = Util.InferContentType(uri, extension);
         IMediaSource src  = type switch
         {
             C.TypeSs => new SsMediaSource.Factory(new DefaultSsChunkSource.Factory(buildHttpDataSourceFactory), buildHttpDataSourceFactoryNull).SetTag(tag).SetDrmSessionManager(drmSessionManager).SetDrmSessionManager(IDrmSessionManager.DummyDrmSessionManager).CreateMediaSource(uri),
             C.TypeDash => new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(buildHttpDataSourceFactory), buildHttpDataSourceFactoryNull).SetTag(tag).SetDrmSessionManager(drmSessionManager).SetDrmSessionManager(IDrmSessionManager.DummyDrmSessionManager).CreateMediaSource(uri),
             C.TypeHls => new HlsMediaSource.Factory(buildHttpDataSourceFactory).SetTag(tag).SetDrmSessionManager(IDrmSessionManager.DummyDrmSessionManager).SetDrmSessionManager(drmSessionManager).CreateMediaSource(uri),
             C.TypeOther => new ProgressiveMediaSource.Factory(buildHttpDataSourceFactory).SetTag(tag).SetDrmSessionManager(drmSessionManager).CreateMediaSource(uri),
             _ => new ProgressiveMediaSource.Factory(buildHttpDataSourceFactory).SetTag(tag).SetDrmSessionManager(drmSessionManager).CreateMediaSource(uri)
         };
         return(src);
     }
     catch (Exception e)
     {
         Methods.DisplayReportResultTrack(e);
         return(null !);
     }
 }
Пример #2
0
 public IMediaSourceFactory SetDrmSessionManager(IDrmSessionManager drmSessionManager)
 {
     this.drmSessionManager = drmSessionManager ?? IDrmSessionManager.DummyDrmSessionManager;
     return(this);
 }
Пример #3
0
 public MediaSourceFactoryAnonymousInnerClass(VideoController outerInstance)
 {
     this.outerInstance = outerInstance;
     drmSessionManager  = IDrmSessionManager.DummyDrmSessionManager;
 }
Пример #4
0
        // Internal methods

        private void initializePlayer()
        {
            Intent intent        = Intent;
            bool   needNewPlayer = player == null;

            if (needNewPlayer)
            {
                var adaptiveTrackSelectionFactory =
                    new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);
                trackSelector           = new DefaultTrackSelector(adaptiveTrackSelectionFactory);
                trackSelectionHelper    = new TrackSelectionHelper(trackSelector, adaptiveTrackSelectionFactory);
                lastSeenTrackGroupArray = null;
                eventLogger             = new EventLogger(trackSelector);

                var drmSchemeUuid = intent.HasExtra(DRM_SCHEME_UUID_EXTRA)
                                        ? UUID.FromString(intent.GetStringExtra(DRM_SCHEME_UUID_EXTRA)) : null;
                IDrmSessionManager drmSessionManager = null;
                if (drmSchemeUuid != null)
                {
                    var drmLicenseUrl             = intent.GetStringExtra(DRM_LICENSE_URL);
                    var keyRequestPropertiesArray = intent.GetStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES);
                    int errorStringId             = Resource.String.error_drm_unknown;
                    if (Util.Util.SdkInt < 18)
                    {
                        errorStringId = Resource.String.error_drm_not_supported;
                    }
                    else
                    {
                        try
                        {
                            drmSessionManager = BuildDrmSessionManagerV18(drmSchemeUuid, drmLicenseUrl,
                                                                          keyRequestPropertiesArray);
                        }
                        catch (UnsupportedDrmException e)
                        {
                            errorStringId = e.Reason == UnsupportedDrmException.ReasonUnsupportedScheme
                                                                ? Resource.String.error_drm_unsupported_scheme : Resource.String.error_drm_unknown;
                        }
                    }
                    if (drmSessionManager == null)
                    {
                        ShowToast(errorStringId);
                        return;
                    }
                }

                var preferExtensionDecoders = intent.GetBooleanExtra(PREFER_EXTENSION_DECODERS, false);
                var extensionRendererMode   =
                    ((DemoApplication)Application).UseExtensionRenderers()
                                                ? (preferExtensionDecoders ? DefaultRenderersFactory.ExtensionRendererModePrefer
                                                : DefaultRenderersFactory.ExtensionRendererModeOn)
                                                : DefaultRenderersFactory.ExtensionRendererModeOff;
                var renderersFactory = new DefaultRenderersFactory(this,
                                                                   drmSessionManager, extensionRendererMode);

                player = ExoPlayerFactory.NewSimpleInstance(renderersFactory, trackSelector);
                player.AddListener(this);
                player.AddListener(eventLogger);
                player.SetAudioDebugListener(eventLogger);
                player.SetVideoDebugListener(eventLogger);
                player.SetMetadataOutput(eventLogger);

                simpleExoPlayerView.Player = player;
                player.PlayWhenReady       = shouldAutoPlay;
                debugViewHelper            = new DebugTextViewHelper(player, debugTextView);
                debugViewHelper.Start();
            }
            var action = intent.Action;

            Uri[]    uris;
            string[] extensions;
            if (ACTION_VIEW.Equals(action))
            {
                uris       = new Uri[] { intent.Data };
                extensions = new string[] { intent.GetStringExtra(EXTENSION_EXTRA) };
            }
            else if (ACTION_VIEW_LIST.Equals(action))
            {
                var uriStrings = intent.GetStringArrayExtra(URI_LIST_EXTRA);
                uris = new Uri[uriStrings.Length];
                for (int i = 0; i < uriStrings.Length; i++)
                {
                    uris[i] = Uri.Parse(uriStrings[i]);
                }
                extensions = intent.GetStringArrayExtra(EXTENSION_LIST_EXTRA);
                if (extensions == null)
                {
                    extensions = new string[uriStrings.Length];
                }
            }
            else
            {
                ShowToast(GetString(Resource.String.unexpected_intent_action, action));
                return;
            }
            if (Util.Util.MaybeRequestReadExternalStoragePermission(this, uris))
            {
                // The player will be reinitialized if the permission is granted.
                return;
            }
            var mediaSources = new IMediaSource[uris.Length];

            for (var i = 0; i < uris.Length; i++)
            {
                mediaSources[i] = BuildMediaSource(uris[i], extensions[i]);
            }
            var mediaSource = mediaSources.Length == 1 ? mediaSources[0]
                                : new ConcatenatingMediaSource(mediaSources);
            var adTagUriString = intent.GetStringExtra(AD_TAG_URI_EXTRA);

            if (adTagUriString != null)
            {
                Uri adTagUri = Uri.Parse(adTagUriString);
                if (!adTagUri.Equals(loadedAdTagUri))
                {
                    ReleaseAdsLoader();
                    loadedAdTagUri = adTagUri;
                }
                try
                {
                    mediaSource = CreateAdsMediaSource(mediaSource, Uri.Parse(adTagUriString));
                }
                catch (System.Exception)
                {
                    ShowToast(Resource.String.ima_not_loaded);
                }
            }
            else
            {
                ReleaseAdsLoader();
            }
            bool haveResumePosition = resumeWindow != C.IndexUnset;

            if (haveResumePosition)
            {
                player.SeekTo(resumeWindow, resumePosition);
            }
            player.Prepare(mediaSource, !haveResumePosition, false);
            inErrorState = false;
            UpdateButtonVisibilities();
        }
            public void OnSingleManifest(Object obj)
            {
                var manifest = obj.JavaCast <SmoothStreamingManifest>();

                if (_canceled)
                {
                    return;
                }

                var mainHandler    = _player.MainHandler;
                var loadControl    = new DefaultLoadControl(new DefaultAllocator(BufferSegmentSize));
                var bandwidthMeter = new DefaultBandwidthMeter(mainHandler, _player);

                // Check drm support if necessary.
                IDrmSessionManager drmSessionManager = null;

                if (manifest.ProtectionElement != null)
                {
                    if (ExoPlayerUtil.SdkInt < 18)
                    {
                        _player.OnRenderersError(
                            new UnsupportedDrmException(UnsupportedDrmException.ReasonUnsupportedScheme));
                        return;
                    }
                    try
                    {
                        drmSessionManager = new StreamingDrmSessionManager(manifest.ProtectionElement.Uuid,
                                                                           _player.PlaybackLooper, _drmCallback, null, _player.MainHandler, _player);
                    }
                    catch (Exception e)
                    {
                        _player.OnRenderersError(e);
                        return;
                    }
                }

                // Build the video renderer.
                var videoDataSource  = new DefaultUriDataSource(_context, bandwidthMeter, _userAgent);
                var videoChunkSource = new SmoothStreamingChunkSource(_manifestFetcher
                                                                      , DefaultSmoothStreamingTrackSelector.NewVideoInstance(_context, true, false)
                                                                      , videoDataSource
                                                                      , new FormatEvaluatorAdaptiveEvaluator(bandwidthMeter)
                                                                      , LiveEdgeLatencyMs);
                var videoSampleSource = new ChunkSampleSource(videoChunkSource
                                                              , loadControl
                                                              , VideoBufferSegments * BufferSegmentSize
                                                              , mainHandler
                                                              , _player
                                                              , VideoPlayer.TypeVideo);
                var videoRenderer = new MediaCodecVideoTrackRenderer(_context
                                                                     , videoSampleSource
                                                                     , MediaCodecSelector.Default
                                                                     , (int)VideoScalingMode.ScaleToFit
                                                                     , 5000
                                                                     , drmSessionManager
                                                                     , true
                                                                     , mainHandler
                                                                     , _player
                                                                     , 50);

                // Build the audio renderer.
                var audioDataSource  = new DefaultUriDataSource(_context, bandwidthMeter, _userAgent);
                var audioChunkSource = new SmoothStreamingChunkSource(_manifestFetcher
                                                                      , DefaultSmoothStreamingTrackSelector.NewAudioInstance()
                                                                      , audioDataSource
                                                                      , null
                                                                      , LiveEdgeLatencyMs);
                var audioSampleSource = new ChunkSampleSource(audioChunkSource
                                                              , loadControl
                                                              , AudioBufferSegments * BufferSegmentSize
                                                              , mainHandler
                                                              , _player
                                                              , VideoPlayer.TypeAudio);
                var audioRenderer = new MediaCodecAudioTrackRenderer(audioSampleSource
                                                                     , MediaCodecSelector.Default
                                                                     , drmSessionManager
                                                                     , true
                                                                     , mainHandler
                                                                     , _player
                                                                     , AudioCapabilities.GetCapabilities(_context)
                                                                     , (int)Stream.Music);

                // Build the text renderer.
                var textDataSource  = new DefaultUriDataSource(_context, bandwidthMeter, _userAgent);
                var textChunkSource = new SmoothStreamingChunkSource(_manifestFetcher
                                                                     , DefaultSmoothStreamingTrackSelector.NewTextInstance()
                                                                     , textDataSource
                                                                     , null
                                                                     , LiveEdgeLatencyMs);
                var textSampleSource = new ChunkSampleSource(textChunkSource
                                                             , loadControl
                                                             , TextBufferSegments * BufferSegmentSize
                                                             , mainHandler
                                                             , _player
                                                             , VideoPlayer.TypeText);
                var textRenderer = new TextTrackRenderer(textSampleSource
                                                         , _player
                                                         , mainHandler.Looper);

                // Invoke the callback.
                var renderers = new TrackRenderer[VideoPlayer.RendererCount];

                renderers[VideoPlayer.TypeVideo] = videoRenderer;
                renderers[VideoPlayer.TypeAudio] = audioRenderer;
                renderers[VideoPlayer.TypeText]  = textRenderer;
                _player.OnRenderers(renderers, bandwidthMeter);
            }
Пример #6
0
        /// <summary>
        /// Initializes the player.
        /// </summary>
        public void InitializePlayer()
        {
            if (_player == null)
            {
                bool preferExtensionDecoders = _stream.PreferExtensionDecoders;

                UUID drmSchemeUuid = string.IsNullOrEmpty(DrmSchemeUuidExtra)
                                                                                   ? UUID.FromString(_stream.DrmSchemeUuidExtra) : null;

                IDrmSessionManager drmSessionManager = null;

                if (drmSchemeUuid != null)
                {
                    string   drmLicenseUrl             = _stream.DrmLicenseUrl;
                    string[] keyRequestPropertiesArray = _stream.DrmKeyRequestProperties;
                    Dictionary <string, string> keyRequestProperties;

                    if (keyRequestPropertiesArray == null || keyRequestPropertiesArray.Length < 2)
                    {
                        keyRequestProperties = null;
                    }
                    else
                    {
                        keyRequestProperties = new Dictionary <string, string>();
                        for (int i = 0; i < keyRequestPropertiesArray.Length - 1; i += 2)
                        {
                            keyRequestProperties.Add(keyRequestPropertiesArray[i],
                                                     keyRequestPropertiesArray[i + 1]);
                        }
                    }
                    try
                    {
                        drmSessionManager = BuildDrmSessionManager(drmSchemeUuid, drmLicenseUrl,
                                                                   keyRequestProperties);
                    }
                    catch (UnsupportedDrmException e)
                    {
                        int errorstringId = Util.SdkInt < 18 ? Resource.String.error_drm_not_supported
                                                                                                : (e.Reason == UnsupportedDrmException.ReasonUnsupportedScheme
                                                        ? Resource.String.error_drm_unsupported_scheme : Resource.String.error_drm_unknown);
                        ShowToast(errorstringId);

                        return;
                    }
                }

                _eventLogger = new EventLogger();
                ITrackSelectionFactory videoTrackSelectionFactory =
                    new AdaptiveVideoTrackSelection.Factory(_bandwidthMeter);
                _trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

                _trackSelectionHelper = new TrackSelectionHelper(_trackSelector, videoTrackSelectionFactory);
                _player = ExoPlayerFactory.NewSimpleInstance(_context, _trackSelector, new DefaultLoadControl());
                _player.AddListener(this);
                _player.AddListener(_eventLogger);
                _player.SetAudioDebugListener(_eventLogger);
                _player.SetVideoDebugListener(_eventLogger);
                _player.SetMetadataOutput(_eventLogger);

                _simpleExoPlayerView.Player = _player;

                if (_shouldRestorePosition)
                {
                    if (_playerPosition == C.TimeUnset)
                    {
                        _player.SeekToDefaultPosition(_playerWindow);
                    }
                    else
                    {
                        _player.SeekTo(_playerWindow, _playerPosition);
                    }
                }

                _player.PlayWhenReady = _shouldAutoPlay;
                _debugViewHelper      = new DebugTextViewHelper(_player, _debugTextView);
                _debugViewHelper.Start();
                _playerNeedsSource = true;
            }

            if (_playerNeedsSource)
            {
                //var intent = (_context as Activity).Intent;
                //string action = intent.Action;

                global::Android.Net.Uri[] uris;
                string[] extensions = {};

                uris       = new global::Android.Net.Uri[] { Android.Net.Uri.Parse(_stream.Url) };
                extensions = new string[] { _stream.ExtensionExtra };

                /*if (ActionView.Equals(action))
                 * {
                 *      uris = new global::Android.Net.Uri[] { intent.Data };
                 *      extensions = new string[] { _stream.ExtensionExtra };
                 * }
                 * else if (ActionViewList.Equals(action))
                 * {
                 *      string[] uristrings = _stream.UriListExtra;
                 *      uris = new global::Android.Net.Uri[uristrings.Length];
                 *      for (int i = 0; i < uristrings.Length; i++)
                 *      {
                 *              uris[i] = global::Android.Net.Uri.Parse(uristrings[i]);
                 *      }
                 *      extensions = _stream.ExtensionListExtra;
                 *      if (extensions == null)
                 *      {
                 *              extensions = new string[uristrings.Length];
                 *      }
                 * }
                 * else
                 * {
                 *      ShowToast(_context.GetString(Resource.String.unexpected_intent_action, action));
                 *      return;
                 * }*/

                if (Util.MaybeRequestReadExternalStoragePermission((Activity)_context, uris))
                {
                    // The player will be reinitialized if the permission is granted.
                    return;
                }

                var mediaSources = new IMediaSource[uris.Length];

                for (int i = 0; i < uris.Length; i++)
                {
                    mediaSources[i] = BuildMediaSource(uris[i], extensions[i]);
                }
                IMediaSource mediaSource = mediaSources.Length == 1 ? mediaSources[0]
                                        : new ConcatenatingMediaSource(mediaSources);
                _player.Prepare(mediaSource, !_shouldRestorePosition, true);
                _playerNeedsSource = false;
                UpdateButtonVisibilities();
            }
        }