public void StartPlaying(string url) { State = State.Loading; Uri uri = Uri.Parse(url); IDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(Application.Context, Application.Context.PackageName); IMediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).CreateMediaSource(uri); _exoPlayer.Prepare(mediaSource); }
public static IMediaSource ToMediaSource(this IMediaItem mediaItem) { if (MediaPlayer.DataSourceFactory == null) { throw new ArgumentNullException(nameof(MediaPlayer.DataSourceFactory)); } IMediaSource mediaSource; switch (mediaItem.MediaType) { default: case MediaType.Default: mediaSource = new ExtractorMediaSource.Factory(MediaPlayer.DataSourceFactory) .SetTag(mediaItem.ToMediaDescription()) .CreateMediaSource(global::Android.Net.Uri.Parse(mediaItem.MediaUri)); break; case MediaType.Dash: if (MediaPlayer.DashChunkSourceFactory == null) { throw new ArgumentNullException(nameof(MediaPlayer.DashChunkSourceFactory)); } mediaSource = new DashMediaSource.Factory(MediaPlayer.DashChunkSourceFactory, MediaPlayer.DataSourceFactory) .SetTag(mediaItem.ToMediaDescription()) .CreateMediaSource(global::Android.Net.Uri.Parse(mediaItem.MediaUri)); break; case MediaType.Hls: mediaSource = new HlsMediaSource.Factory(MediaPlayer.DataSourceFactory) .SetAllowChunklessPreparation(true) .SetTag(mediaItem.ToMediaDescription()) .CreateMediaSource(global::Android.Net.Uri.Parse(mediaItem.MediaUri)); break; case MediaType.SmoothStreaming: if (MediaPlayer.SsChunkSourceFactory == null) { throw new ArgumentNullException(nameof(MediaPlayer.SsChunkSourceFactory)); } mediaSource = new SsMediaSource.Factory(MediaPlayer.SsChunkSourceFactory, MediaPlayer.DataSourceFactory) .SetTag(mediaItem.ToMediaDescription()) .CreateMediaSource(global::Android.Net.Uri.Parse(mediaItem.MediaUri)); break; } return(mediaSource); }
/// <summary> /// Plays the video contained in the URL at the given starting position. /// </summary> /// <param name="url">The URL.</param> /// <param name="position">The position.</param> private void PlayVideo(string url, long?position) { LoadingSpinnerView.Visibility = ViewStates.Visible; LoadingSpinnerView.Start(); // // Prepare the standard HTTP information for the source. // var mediaUri = global::Android.Net.Uri.Parse(url); var userAgent = Util.GetUserAgent(Activity, "Crex"); var defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory(userAgent); var defaultDataSourceFactory = new DefaultDataSourceFactory(Activity, null, defaultHttpDataSourceFactory); IMediaSource source; // // Determine if this is an HLS or MP4 stream. // if (mediaUri.Path.EndsWith(".m3u8", StringComparison.InvariantCultureIgnoreCase) || mediaUri.Path.EndsWith("/hsl", StringComparison.InvariantCultureIgnoreCase)) { using (var factory = new HlsMediaSource.Factory(defaultDataSourceFactory)) { source = factory.CreateMediaSource(mediaUri); } } else { using (var factory = new ExtractorMediaSource.Factory(defaultDataSourceFactory)) { source = factory.CreateMediaSource(mediaUri); } } // // Create the player and get it ready for playback. // AutoPlay = true; VideoPlayer = ExoPlayerFactory.NewSimpleInstance(Activity, new DefaultTrackSelector()); VideoPlayer.AddListener(this); PlayerView.Player = VideoPlayer; if (position.HasValue) { VideoPlayer.SeekTo(position.Value); } VideoPlayer.Prepare(source, !position.HasValue, false); }
private IMediaSource CreateCacheMediaSource(IMediaSource videoSource, Uri videoUrL) { try { if (PlayerSettings.EnableOfflineMode) { //Set the video for offline mode if (!string.IsNullOrEmpty(VideoData.Id)) { string file = VideoDownloadAsyncControler.GetDownloadedDiskVideoUri(VideoData.Id); SimpleCache cache = new SimpleCache(ActivityContext.CacheDir, new LeastRecentlyUsedCacheEvictor(1024 * 1024 * 10)); CacheDataSourceFactory cacheDataSource = new CacheDataSourceFactory(cache, DefaultDataMediaFactory); if (file != null) { videoUrL = Uri.Parse(file); Console.WriteLine(videoUrL); videoSource = new ExtractorMediaSource.Factory(cacheDataSource).SetTag("normal").CreateMediaSource(videoUrL); return(videoSource); } else { return(null); } } else { return(null); } } else { return(null); } } catch (Exception exception) { Console.WriteLine(exception); return(null); } }
private IMediaSource GetMediaSourceFromUrl(Uri uri, string tag) { try { var mBandwidthMeter = new DefaultBandwidthMeter(); //DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(ActivityContext, Util.GetUserAgent(ActivityContext, AppSettings.ApplicationName), mBandwidthMeter); var buildHttpDataSourceFactory = new DefaultDataSourceFactory(ActivityContext, mBandwidthMeter, new DefaultHttpDataSourceFactory(Util.GetUserAgent(ActivityContext, AppSettings.ApplicationName), new DefaultBandwidthMeter())); var buildHttpDataSourceFactoryNull = new DefaultDataSourceFactory(ActivityContext, mBandwidthMeter, new DefaultHttpDataSourceFactory(Util.GetUserAgent(ActivityContext, AppSettings.ApplicationName), null)); int type = Util.InferContentType(uri, null); IMediaSource src; switch (type) { case C.TypeSs: src = new SsMediaSource.Factory(new DefaultSsChunkSource.Factory(buildHttpDataSourceFactory), buildHttpDataSourceFactoryNull).SetTag(tag).CreateMediaSource(uri); break; case C.TypeDash: src = new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(buildHttpDataSourceFactory), buildHttpDataSourceFactoryNull).SetTag(tag).CreateMediaSource(uri); break; case C.TypeHls: src = new HlsMediaSource.Factory(buildHttpDataSourceFactory).SetTag(tag).CreateMediaSource(uri); break; case C.TypeOther: src = new ExtractorMediaSource.Factory(buildHttpDataSourceFactory).SetTag(tag).CreateMediaSource(uri); break; default: //src = Exception("Unsupported type: " + type); src = new ExtractorMediaSource.Factory(buildHttpDataSourceFactory).SetTag(tag).CreateMediaSource(uri); break; } return(src); } catch (Exception e) { Console.WriteLine(e); return(null); } }
private IMediaSource BuildMediaSource(android.Net.Uri uri, string overrideExtension) { int type = Utils.InferContentType(uri, overrideExtension); IMediaSource src = null; switch (type) { case C.TypeDash: src = new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(mediaDataSourceFactory), BuildDataSourceFactory(false)) .SetManifestParser(new FilteringManifestParser(new DashManifestParser(), GetOfflineStreamKeys(uri))) .CreateMediaSource(uri); break; case C.TypeSs: src = new SsMediaSource.Factory(new DefaultSsChunkSource.Factory(mediaDataSourceFactory), BuildDataSourceFactory(false)) .SetManifestParser(new FilteringManifestParser(new SsManifestParser(), GetOfflineStreamKeys(uri))) .CreateMediaSource(uri); break; case C.TypeHls: src = new HlsMediaSource.Factory(mediaDataSourceFactory) .SetPlaylistParserFactory(new FilteringManifestParser(new HlsPlaylistParser(), GetOfflineStreamKeys(uri))) .CreateMediaSource(uri); break; case C.TypeOther: src = new ExtractorMediaSource.Factory(mediaDataSourceFactory).CreateMediaSource(uri); break; default: throw new IllegalStateException("Unsupported type: " + type); } //Todo: implement IAnalyticsListener src.AddEventListener(mainHandler, eventLogger); return(src); }
private IMediaSource CreateMediaSource(StreamingUri link) { Android.Net.Uri uri = Android.Net.Uri.Parse(link.StreamingUrl.OriginalString); IMediaSource source = null; if (link.StreamingUrl.OriginalString.Contains(".mpd")) { source = new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(mediaSourceFactory), mediaSourceFactory) .SetManifestParser(new FilteringManifestParser(new DashManifestParser(), new List <StreamKey>())) .CreateMediaSource(uri); } if (link.StreamingUrl.OriginalString.Contains(".m3u8")) { source = new HlsMediaSource.Factory(mediaSourceFactory) .SetPlaylistParserFactory(new DefaultHlsPlaylistParserFactory(new List <StreamKey>())) .CreateMediaSource(uri); } if (link.StreamingUrl.OriginalString.Contains(".mp4")) { source = new ExtractorMediaSource.Factory(mediaSourceFactory).CreateMediaSource(uri); } return(source); }
public void PlayVideo(bool isEndOfList, Holders.VideoAdapterViewHolder holderVideoPlayer = null, PostsObject item = null) { try { if (VideoPlayer == null) { SetPlayer(); } int targetPosition; if (!isEndOfList) { var startPosition = ((LinearLayoutManager)GetLayoutManager()).FindFirstVisibleItemPosition(); var endPosition = ((LinearLayoutManager)GetLayoutManager()).FindLastVisibleItemPosition(); if (endPosition - startPosition > 1) { endPosition = startPosition + 1; } if (startPosition < 0 || endPosition < 0) { return; } if (startPosition != endPosition) { var startPositionVideoHeight = GetVisibleVideoSurfaceHeight(startPosition); var endPositionVideoHeight = GetVisibleVideoSurfaceHeight(endPosition); targetPosition = startPositionVideoHeight > endPositionVideoHeight ? startPosition : endPosition; } else { targetPosition = startPosition; } } else { targetPosition = GetAdapter().ItemCount - 1; } if (targetPosition == PlayPosition) { return; } // set the position of the list-item that is to be played PlayPosition = targetPosition; if (VideoSurfaceView == null) { return; } VideoSurfaceView.Visibility = ViewStates.Invisible; RemoveVideoView(VideoSurfaceView); var currentPosition = targetPosition - ((LinearLayoutManager)GetLayoutManager()).FindFirstVisibleItemPosition(); var child = GetChildAt(currentPosition); if (child == null) { return; } dynamic holder; if (holderVideoPlayer != null) { holder = holderVideoPlayer; targetPosition = holderVideoPlayer.LayoutPosition; } else { Holders.VideoAdapterViewHolder holderChild = (Holders.VideoAdapterViewHolder)child.Tag; if (holderChild == null) { PlayPosition = -1; return; } else { targetPosition = holderChild.LayoutPosition; holder = holderChild; } } if (!(holder is Holders.VideoAdapterViewHolder holderVideo)) { return; } MediaContainerLayout = holderVideo.MediaContainerLayout; Thumbnail = holderVideo.VideoImage; ViewHolderParent = holderVideo.ItemView; PlayControl = holderVideo.PlayControl; if (!IsVideoViewAdded) { AddVideoView(); } holderVideo.VideoProgressBar.Visibility = ViewStates.Visible; VideoSurfaceView.Player = VideoPlayer; var controlView = VideoSurfaceView.FindViewById <PlayerControlView>(Resource.Id.exo_controller); Uri videoUrl = Uri.Parse(item != null ? item.MediaSet[0].File : NativeFeedAdapter.PixelNewsFeedList[targetPosition].MediaSet[0].File); //>> Old Code //===================== Exo Player ======================== var lis = new ExoPlayerRecyclerEvent(controlView, this, holderVideo); IMediaSource videoSource = GetMediaSourceFromUrl(videoUrl, "normal"); var dataSpec = new DataSpec(videoUrl); //0, 1000 * 1024, null if (Cache == null) { CacheVideosFiles(videoUrl); } //Cache = new SimpleCache(new Java.IO.File(MainContext.FilesDir, "media"), new NoOpCacheEvictor()); if (CacheDataSourceFactory == null) { CacheDataSourceFactory = new CacheDataSourceFactory(Cache, DefaultDataSourceFac); } var counters = new CacheUtil.CachingCounters(); CacheUtil.GetCached(dataSpec, Cache, counters); if (counters.ContentLength == counters.TotalCachedBytes()) { videoSource = new ExtractorMediaSource.Factory(CacheDataSourceFactory).CreateMediaSource(videoUrl); } else if (counters.TotalCachedBytes() == 0) { videoSource = new ExtractorMediaSource.Factory(CacheDataSourceFactory).CreateMediaSource(videoUrl); // not cached at all Task.Run(() => { try { var cacheDataSource = new CacheDataSource(Cache, CacheDataSourceFactory.CreateDataSource()); CacheUtil.Cache(dataSpec, Cache, cacheDataSource, counters, new AtomicBoolean()); double downloadPercentage = counters.TotalCachedBytes() * 100d / counters.ContentLength; Console.WriteLine(downloadPercentage); } catch (Exception e) { Console.WriteLine(e); } }); } else { // partially cached videoSource = new ExtractorMediaSource.Factory(CacheDataSourceFactory).CreateMediaSource(videoUrl); } lis.mFullScreenButton.SetOnClickListener(new NewClicker(lis.mFullScreenButton, videoUrl.ToString(), this)); VideoPlayer.Prepare(videoSource); VideoPlayer.AddListener(lis); VideoPlayer.PlayWhenReady = true; } catch (Exception e) { Console.WriteLine(e); } }
public void Start() { if (_player != null) { Stop(); } _handler.Post(() => { try { var defaultBandwidthMeter = new DefaultBandwidthMeter(); var adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(defaultBandwidthMeter); var defaultTrackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); _player = ExoPlayerFactory.NewSimpleInstance(_context, defaultTrackSelector); _player.AddListener(this); _player.PlayWhenReady = true; if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { var audioFocusRequest = new AudioFocusRequestClass.Builder(AudioFocus.Gain) .SetOnAudioFocusChangeListener(this) .SetAudioAttributes(new AudioAttributes.Builder() .SetUsage(AudioUsageKind.Media) .SetContentType(AudioContentType.Music) .Build()) .Build(); if (_audioManager.RequestAudioFocus(audioFocusRequest) == AudioFocusRequest.Granted) { play(); } } else { #pragma warning disable CS0618 // Type or member is obsolete if (_audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain) == AudioFocusRequest.Granted) { play(); } #pragma warning restore CS0618 // Type or member is obsolete } } catch (Exception ex) { //Log.Error(TAG, $"Could not start player: {ex.Message}"); //Log.Debug(TAG, ex.ToString()); Error?.Invoke(this, new RadioStationErrorEventArgs(ex)); IsPlaying = false; } }); void play() { var mediaUri = Android.Net.Uri.Parse(StreamUrl); var userAgent = Util.GetUserAgent(_context, "wzxv.app.radio.player"); var defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory(userAgent); var defaultDataSourceFactory = new DefaultDataSourceFactory(_context, null, defaultHttpDataSourceFactory); var mediaSourceFactory = new ExtractorMediaSource.Factory(defaultDataSourceFactory); var mediaSource = mediaSourceFactory.CreateMediaSource(mediaUri); _player.Prepare(mediaSource); IsPlaying = true; } }
void SetSource() { isPrepared = false; bool hasSetSource = false; DefaultHttpDataSourceFactory httpDataSourceFactory = new DefaultHttpDataSourceFactory("1"); DefaultSsChunkSource.Factory ssChunkFactory = new DefaultSsChunkSource.Factory(httpDataSourceFactory); Handler emptyHandler = new Handler(); IMediaSource videoSource = null; if (Element.Source is HLSVideoSource) { string uri = (Element.Source as HLSVideoSource).Uri; if (!string.IsNullOrWhiteSpace(uri)) { //videoView.SetVideoURI(Android.Net.Uri.Parse(uri)); videoSource = new HlsMediaSource.Factory(httpDataSourceFactory) .CreateMediaSource(Android.Net.Uri.Parse(uri)); hasSetSource = true; } } else if (Element.Source is UriVideoSource) { string uri = (Element.Source as UriVideoSource).Uri; if (!string.IsNullOrWhiteSpace(uri)) { //videoView.SetVideoURI(Android.Net.Uri.Parse(uri)); var dataSourceFactory = new DefaultDataSourceFactory(Context, Util.GetUserAgent(Context, "Multimedia")); videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).CreateMediaSource(Android.Net.Uri.Parse(uri)); hasSetSource = true; } } else if (Element.Source is FileVideoSource) { string filename = (Element.Source as FileVideoSource).File; if (!string.IsNullOrWhiteSpace(filename)) { DataSpec dataSpec = new DataSpec(Android.Net.Uri.FromFile(new Java.IO.File(filename))); FileDataSource fileDataSource = new FileDataSource(); try { fileDataSource.Open(dataSpec); } catch (FileDataSource.FileDataSourceException e) { e.PrintStackTrace(); } // videoView.SetVideoPath(filename); IDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this.Context, "CloudMusic"); videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).CreateMediaSource(fileDataSource.Uri); hasSetSource = true; } } else if (Element.Source is ResourceVideoSource) { string package = Context.PackageName; string path = (Element.Source as ResourceVideoSource).Path; if (!string.IsNullOrWhiteSpace(path)) { string filename = Path.GetFileNameWithoutExtension(path).ToLowerInvariant(); string uri = "android.resource://" + package + "/raw/" + filename; //videoView.SetVideoURI(Android.Net.Uri.Parse(uri)); videoSource = new SsMediaSource.Factory(new DefaultSsChunkSource.Factory(httpDataSourceFactory), BuildDataSourceFactory(new DefaultBandwidthMeter())) .SetManifestParser(new FilteringManifestParser(new SsManifestParser(), null)) .CreateMediaSource(Android.Net.Uri.Parse(uri)); hasSetSource = true; } } if (videoSource != null) { ExoPlayer.Prepare(videoSource); } if (hasSetSource && Element.AutoPlay) { ExoPlayer.PlayWhenReady = true; // videoView.Start(); } }