/// <inheritdoc /> public async Task DownloadVideoAsync(MediaStreamInfoSet mediaStreamInfoSet, string filePath, string format, IProgress <double> progress = null, CancellationToken cancellationToken = default(CancellationToken)) { mediaStreamInfoSet.GuardNotNull(nameof(mediaStreamInfoSet)); filePath.GuardNotNull(nameof(filePath)); format.GuardNotNull(nameof(format)); var mediaStreamInfos = new List <MediaStreamInfo>(); // Get best audio stream (priority: transcoding -> bitrate) var audioStreamInfo = mediaStreamInfoSet.Audio .OrderByDescending(s => !IsTranscodingRequired(s.Container, format)) .ThenByDescending(s => s.Bitrate) .FirstOrDefault(); // Add to result mediaStreamInfos.Add(audioStreamInfo); // If needs video - get best video stream (priority: quality -> framerate -> transcoding) if (!IsAudioOnlyFormat(format)) { var videoStreamInfo = mediaStreamInfoSet.Video .OrderByDescending(s => s.VideoQuality) .ThenByDescending(s => s.Framerate) .ThenByDescending(s => !IsTranscodingRequired(s.Container, format)) .FirstOrDefault(); // Add to result mediaStreamInfos.Add(videoStreamInfo); } // Download media streams and process them await DownloadAndProcessMediaStreamsAsync(mediaStreamInfos, filePath, format, progress, cancellationToken); }
/// <inheritdoc /> public async Task DownloadVideoAsync(MediaStreamInfoSet mediaStreamInfoSet, string filePath, string format, IProgress <double> progress = null, CancellationToken cancellationToken = default) { mediaStreamInfoSet.GuardNotNull(nameof(mediaStreamInfoSet)); filePath.GuardNotNull(nameof(filePath)); format.GuardNotNull(nameof(format)); // Select best media stream infos based on output format var mediaStreamInfos = GetBestMediaStreamInfos(mediaStreamInfoSet, format).ToArray(); // Download media streams and process them await DownloadAndProcessMediaStreamsAsync(mediaStreamInfos, filePath, format, progress, cancellationToken); }