コード例 #1
0
ファイル: MediaEncoder.cs プロジェクト: sxryt/jellyfin
        /// <summary>
        /// Gets the media info.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task.</returns>
        public Task <MediaInfo> GetMediaInfo(MediaInfoRequest request, CancellationToken cancellationToken)
        {
            var extractChapters = request.MediaType == DlnaProfileType.Video && request.ExtractChapters;

            var inputFiles = MediaEncoderHelpers.GetInputArgument(FileSystem, request.MediaSource.Path, request.MediaSource.Protocol, request.MountedIso, request.PlayableStreamFileNames);

            var    probeSize = EncodingHelper.GetProbeSizeArgument(inputFiles.Length);
            string analyzeDuration;

            if (request.MediaSource.AnalyzeDurationMs > 0)
            {
                analyzeDuration = "-analyzeduration " +
                                  (request.MediaSource.AnalyzeDurationMs * 1000).ToString();
            }
            else
            {
                analyzeDuration = EncodingHelper.GetAnalyzeDurationArgument(inputFiles.Length);
            }

            probeSize = probeSize + " " + analyzeDuration;
            probeSize = probeSize.Trim();

            var forceEnableLogging = request.MediaSource.Protocol != MediaProtocol.File;

            return(GetMediaInfoInternal(GetInputArgument(inputFiles, request.MediaSource.Protocol), request.MediaSource.Path, request.MediaSource.Protocol, extractChapters,
                                        probeSize, request.MediaType == DlnaProfileType.Audio, request.MediaSource.VideoType, forceEnableLogging, cancellationToken));
        }
コード例 #2
0
        /// <summary>
        /// Gets the media info.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task.</returns>
        public Task <MediaInfo> GetMediaInfo(MediaInfoRequest request, CancellationToken cancellationToken)
        {
            var extractChapters = request.MediaType == DlnaProfileType.Video && request.ExtractChapters;
            var inputFile       = request.MediaSource.Path;

            string analyzeDuration = string.Empty;

            if (request.MediaSource.AnalyzeDurationMs > 0)
            {
                analyzeDuration = "-analyzeduration " +
                                  (request.MediaSource.AnalyzeDurationMs * 1000).ToString();
            }

            var forceEnableLogging = request.MediaSource.Protocol != MediaProtocol.File;

            return(GetMediaInfoInternal(
                       GetInputArgument(inputFile, request.MediaSource),
                       request.MediaSource.Path,
                       request.MediaSource.Protocol,
                       extractChapters,
                       analyzeDuration,
                       request.MediaType == DlnaProfileType.Audio,
                       request.MediaSource.VideoType,
                       forceEnableLogging,
                       cancellationToken));
        }
コード例 #3
0
ファイル: MediaEncoder.cs プロジェクト: rickardrocks/Emby
        /// <summary>
        /// Gets the media info.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task.</returns>
        public Task <MediaInfo> GetMediaInfo(MediaInfoRequest request, CancellationToken cancellationToken)
        {
            var extractChapters = request.MediaType == DlnaProfileType.Video && request.ExtractChapters;

            var inputFiles = MediaEncoderHelpers.GetInputArgument(FileSystem, request.InputPath, request.Protocol, request.MountedIso, request.PlayableStreamFileNames);

            return(GetMediaInfoInternal(GetInputArgument(inputFiles, request.Protocol), request.InputPath, request.Protocol, extractChapters,
                                        GetProbeSizeArgument(inputFiles, request.Protocol), request.MediaType == DlnaProfileType.Audio, request.VideoType, cancellationToken));
        }
コード例 #4
0
        private async Task ProbeStream(MediaSourceInfo mediaSourceInfo, string probeUrl, string source, CancellationToken cancellationToken)
        {
            _logger.Info("[TVHclient] Probe stream for {0}", source);
            _logger.Info("[TVHclient] Probe URL: {0}", probeUrl);

            MediaInfoRequest req = new MediaInfoRequest
            {
                MediaType       = MediaBrowser.Model.Dlna.DlnaProfileType.Video,
                InputPath       = probeUrl,
                Protocol        = MediaProtocol.Http,
                ExtractChapters = false,
                VideoType       = VideoType.VideoFile,
                // currently not available !!!
                // RequiredHttpHeaders = mediaSourceInfo.RequiredHttpHeaders,
            };

            var       originalRuntime = mediaSourceInfo.RunTimeTicks;
            Stopwatch stopWatch       = new Stopwatch();

            stopWatch.Start();
            MediaInfo info = await _mediaEncoder.GetMediaInfo(req, cancellationToken).ConfigureAwait(false);

            stopWatch.Stop();
            TimeSpan ts          = stopWatch.Elapsed;
            string   elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);

            _logger.Info("[TVHclient] Probe RunTime " + elapsedTime);

            if (info != null)
            {
                _logger.Info("[TVHclient] Probe returned:");

                mediaSourceInfo.Bitrate = info.Bitrate;
                _logger.Info("[TVHclient]         BitRate:                    " + info.Bitrate);

                mediaSourceInfo.Container = info.Container;
                _logger.Info("[TVHclient]         Container:                  " + info.Container);

                mediaSourceInfo.Formats = info.Formats;
                _logger.Info("[TVHclient]         Formats:                    ");
                LogStringList(info.Formats, "                                 ");

                mediaSourceInfo.MediaStreams = info.MediaStreams;
                _logger.Info("[TVHclient]         MediaStreams:               ");
                LogMediaStreamList(info.MediaStreams, "                       ");

                mediaSourceInfo.RunTimeTicks = info.RunTimeTicks;
                _logger.Info("[TVHclient]         RunTimeTicks:               " + info.RunTimeTicks);

                mediaSourceInfo.Size = info.Size;
                _logger.Info("[TVHclient]         Size:                       " + info.Size);

                mediaSourceInfo.Timestamp = info.Timestamp;
                _logger.Info("[TVHclient]         Timestamp:                  " + info.Timestamp);

                mediaSourceInfo.Video3DFormat = info.Video3DFormat;
                _logger.Info("[TVHclient]         Video3DFormat:              " + info.Video3DFormat);

                mediaSourceInfo.VideoType = info.VideoType;
                _logger.Info("[TVHclient]         VideoType:                  " + info.VideoType);

                mediaSourceInfo.RequiresClosing = true;
                _logger.Info("[TVHclient]         RequiresClosing:            " + true);

                mediaSourceInfo.RequiresOpening = true;
                _logger.Info("[TVHclient]         RequiresOpening:            " + true);

                mediaSourceInfo.SupportsDirectPlay = true;
                _logger.Info("[TVHclient]         SupportsDirectPlay:         " + true);

                mediaSourceInfo.SupportsDirectStream = true;
                _logger.Info("[TVHclient]         SupportsDirectStream:       " + true);

                mediaSourceInfo.SupportsTranscoding = true;
                _logger.Info("[TVHclient]         SupportsTranscoding:        " + true);

                mediaSourceInfo.DefaultSubtitleStreamIndex = null;
                _logger.Info("[TVHclient]         DefaultSubtitleStreamIndex: n/a");

                if (!originalRuntime.HasValue)
                {
                    mediaSourceInfo.RunTimeTicks = null;
                    _logger.Info("[TVHclient]         Original runtime:           n/a");
                }

                var audioStream = mediaSourceInfo.MediaStreams.FirstOrDefault(i => i.Type == MediaBrowser.Model.Entities.MediaStreamType.Audio);
                if (audioStream == null || audioStream.Index == -1)
                {
                    mediaSourceInfo.DefaultAudioStreamIndex = null;
                    _logger.Info("[TVHclient]         DefaultAudioStreamIndex:    n/a");
                }
                else
                {
                    mediaSourceInfo.DefaultAudioStreamIndex = audioStream.Index;
                    _logger.Info("[TVHclient]         DefaultAudioStreamIndex:    '" + info.DefaultAudioStreamIndex + "'");
                }
            }
            else
            {
                _logger.Error("[TVHclient] Cannot probe {0} stream", source);
            }
        }