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 !); } }
public IMediaSourceFactory SetDrmSessionManager(IDrmSessionManager drmSessionManager) { this.drmSessionManager = drmSessionManager ?? IDrmSessionManager.DummyDrmSessionManager; return(this); }
public MediaSourceFactoryAnonymousInnerClass(VideoController outerInstance) { this.outerInstance = outerInstance; drmSessionManager = IDrmSessionManager.DummyDrmSessionManager; }
// 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); }
/// <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(); } }