示例#1
0
        internal static void Check(this MediaBase media)
        {
            if (media.MediaType == TMediaType.Movie || media.MediaType == TMediaType.Unknown)
            {
                int startTickCunt = Environment.TickCount;
                using (FFMpegWrapper ffmpeg = new FFMpegWrapper(media.FullPath))
                {
                    Rational       r             = ffmpeg.GetFrameRate();
                    RationalNumber frameRate     = new RationalNumber(r.Num, r.Den);
                    var            videoDuration = (TimeSpan)ffmpeg.GetVideoDuration();
                    var            audioDuration = (TimeSpan)ffmpeg.GetAudioDuration();
                    var            mediaDuration = ((videoDuration > audioDuration) && (audioDuration > TimeSpan.Zero) ? audioDuration : videoDuration).Round(frameRate);
                    if (mediaDuration == TimeSpan.Zero)
                    {
                        mediaDuration = (TimeSpan)ffmpeg.GetFileDuration();
                    }
                    media.Duration = mediaDuration;
                    if (media.DurationPlay == TimeSpan.Zero || media.DurationPlay > mediaDuration)
                    {
                        media.DurationPlay = mediaDuration;
                    }
                    int        w     = ffmpeg.GetWidth();
                    int        h     = ffmpeg.GetHeight();
                    FieldOrder order = ffmpeg.GetFieldOrder();
                    Rational   sar   = ffmpeg.GetSAR();
                    if (h == 608 && w == 720)
                    {
                        media.HasExtraLines = true;
                        h = 576;
                    }
                    else
                    {
                        media.HasExtraLines = false;
                    }
                    string timecode = ffmpeg.GetTimeCode();
                    if (timecode != null &&
                        timecode.IsValidSMPTETimecode(frameRate))
                    {
                        media.TcStart = timecode.SMPTETimecodeToTimeSpan(frameRate);
                        if (media.TcPlay < media.TcStart)
                        {
                            media.TcPlay = media.TcStart;
                        }
                    }

                    RationalNumber sAR = (h == 576 && ((sar.Num == 608 && sar.Den == 405) || (sar.Num == 1 && sar.Den == 1) || (sar.Num == 118 && sar.Den == 81))) ? VideoFormatDescription.Descriptions[TVideoFormat.PAL_FHA].SAR
                        : (sar.Num == 152 && sar.Den == 135) ? VideoFormatDescription.Descriptions[TVideoFormat.PAL].SAR
                        : new RationalNumber(sar.Num, sar.Den);

                    var vfd = VideoFormatDescription.Match(new System.Drawing.Size(w, h), frameRate, sAR, order != FieldOrder.PROGRESSIVE);
                    media.VideoFormat = vfd.Format;
                    if (media is IngestMedia ingestMedia)
                    {
                        ingestMedia.StreamInfo = ffmpeg.GetStreamInfo();
                    }
                    if (media is TempMedia tempMedia)
                    {
                        tempMedia.StreamInfo = ffmpeg.GetStreamInfo();
                    }

                    Debug.WriteLine("FFmpeg check of {0} finished. It took {1} milliseconds", media.FullPath, Environment.TickCount - startTickCunt);

                    if (videoDuration > TimeSpan.Zero)
                    {
                        media.MediaType = TMediaType.Movie;
                        if (Math.Abs(videoDuration.Ticks - audioDuration.Ticks) >= TimeSpan.TicksPerSecond &&
                            audioDuration != TimeSpan.Zero)
                        {
                            // when more than 0.5 sec difference
                            media.MediaStatus = TMediaStatus.ValidationError;
                        }
                        media.MediaStatus = TMediaStatus.Available;
                    }
                    media.MediaStatus = TMediaStatus.ValidationError;
                }
            }
            media.MediaStatus = TMediaStatus.Available;
        }