示例#1
0
 public VideoGridImage(VideoMetadata video, VideoPreviewImageViewModel vm, List<MediaThumb> thumbs) :
     base(vm.MaxPreviewImageWidth,vm.NrRows, vm.NrColumns, getImages(thumbs), vm.BackgroundColor, vm.FontColor)
 {                                 
     Video = video;
     Vm = vm;
     Thumbs = thumbs;
 }
        public YoutubeVideoStreamedItem(NameValueCollection info, String name) 
            : base(info["url"], name, MediaItemState.LOADED)
        {
            /*foreach (string v in info)
            {
                System.Diagnostics.Debug.Print(v + ": " + info[v]);
            }*/

            VideoMetadata videoMetadata = new VideoMetadata();
                                
            videoMetadata.MimeType = info["type"];
            if (videoMetadata.MimeType != null)
            {
                int pos = videoMetadata.MimeType.IndexOf(';');

                if (pos != -1)
                {
                    videoMetadata.MimeType = videoMetadata.MimeType.Substring(0, pos);
                }

            }
            //FallbackHost = info["fallback_host"];

            string fpsString = info["fps"];
            if (fpsString != null)
            {
                videoMetadata.FramesPerSecond = int.Parse(fpsString);
            }

            int iTag;

            bool success = int.TryParse(info["itag"], out iTag);

            if (success && itagFormatInfo.ContainsKey(iTag))
            {
                StreamFormatInfo formatInfo = itagFormatInfo[iTag];

                if (formatInfo.Width.HasValue && formatInfo.Height.HasValue)
                {
                    videoMetadata.Width = formatInfo.Width.Value;
                    videoMetadata.Height = formatInfo.Height.Value;
                }

                videoMetadata.SamplesPerSecond = formatInfo.AudioBitrate;

                StreamType = formatInfo.StreamType;               
            }
            else
            {
                StreamType = StreamType.UNKNOWN;
                
                if (success)
                {
                    Logger.Log.Error("Unknown itag in videostreaminfo: " + iTag);
#if DEBUG
                    throw new Exception("Unknown itag in videostreaminfo: " + iTag);
#endif
                }

            }

            Metadata = videoMetadata;
        }
示例#3
0
        void getVideoProperties(ObservableCollection<Tuple<String, String>> p, VideoMetadata video)
        {
           
            p.Add(new Tuple<string, string>("", "VIDEO"));            
            p.Add(new Tuple<string, string>("Video Codec", video.VideoCodec));

            foreach (Tuple<string, string> item in FormatMetaData.formatProperties(video))
            {
                p.Add(item);
            }

            p.Add(new Tuple<string, string>("Resolution", video.Width.ToString() + " x " + video.Height.ToString()));                        
            p.Add(new Tuple<string, string>("Pixel Format", video.PixelFormat));
            p.Add(new Tuple<string, string>("Bits Per Pixel", video.BitsPerPixel.ToString()));
            p.Add(new Tuple<string, string>("Frames Per Second", video.FramesPerSecond.ToString("0.##")));

            if (video.VideoBitRate.HasValue)
            {
                p.Add(new Tuple<string, string>("Video Rate", MiscUtils.formatSizeBytes(video.VideoBitRate.Value / 8) + "/s")); 
            }

            if (!String.IsNullOrEmpty(video.AudioCodec))
            {
                p.Add(new Tuple<string, string>("", "AUDIO"));
                p.Add(new Tuple<string, string>("Audio Codec", video.AudioCodec));
                p.Add(new Tuple<string, string>("Bits Per Sample", video.BitsPerSample.ToString()));
                p.Add(new Tuple<string, string>("Samples Per Second", video.SamplesPerSecond.ToString()));
                p.Add(new Tuple<string, string>("Nr Channels", video.NrChannels.ToString()));

                if (video.AudioBitRate.HasValue)
                {
                    p.Add(new Tuple<string, string>("Audio Rate", MiscUtils.formatSizeBytes(video.AudioBitRate.Value / 8) + "/s"));
                }
            }

            p.Add(new Tuple<string, string>("", "FILE"));
            p.Add(new Tuple<string, string>("Container", video.VideoContainer));
            p.Add(new Tuple<string, string>("Duration", MiscUtils.formatTimeSeconds(video.DurationSeconds)));

        }
        public void generateThumbnail(MediaProbe mediaProbe, VideoMetadata video,
            CancellationToken token, int timeoutSeconds, int nrThumbnails)
        {
            video.Thumbnail = null;
         
            List<MediaThumb> coverBitmaps = mediaProbe.grabAttachedImages(Constants.MAX_THUMBNAIL_WIDTH,
                 Constants.MAX_THUMBNAIL_HEIGHT, token, timeoutSeconds);

            if (coverBitmaps.Count > 0)
            {
                video.Thumbnail = new Thumbnail(coverBitmaps[0].Thumb);
            }

            if (coverBitmaps.Count == 0 || nrThumbnails > 1)
            {

                List<MediaThumb> thumbBitmaps = mediaProbe.grabThumbnails(Constants.MAX_THUMBNAIL_WIDTH,
                     Constants.MAX_THUMBNAIL_HEIGHT, 0, nrThumbnails, 0.025, token, timeoutSeconds, null);
              
                if (thumbBitmaps.Count > 0 && coverBitmaps.Count == 0)
                {
                    video.Thumbnail = new Thumbnail(thumbBitmaps[0].Thumb);
                }
                
            }

        }
        private bool supportsXMPMetadata(VideoMetadata video, List<string> fsMetaData)
        {

            // XMP Metadata does not support matroska
            if (video.MimeType.Equals("video/x-matroska") || video.MimeType.Equals("video/webm"))
            {
                return (false);
            }
            else if (video.MimeType.Equals("video/mp4"))
            {
                // mp4 versions incompatible with XMP metadata

                if (fsMetaData.Contains("major_brand: isom") &&
                    fsMetaData.Contains("minor_version: 1"))
                {
                    return (false);
                }

                if (fsMetaData.Contains("major_brand: mp42") &&
                    fsMetaData.Contains("minor_version: 0"))
                {

                    if (fsMetaData.Contains("compatible_brands: isom"))
                    {
                        return (false);
                    }

                    if (fsMetaData.Contains("compatible_brands: 000000964375"))
                    {
                        return (false);
                    }
                }

            }
            else if (video.MimeType.Equals("video/avi"))
            {

                if (video.VideoCodec.Equals("mpeg2video"))
                {

                    return (false);
                }
            }

            return (true);
        }
        void parseFFMpegMetaData(List<string> fsMetaData, VideoMetadata video)
        {
            if (fsMetaData == null) return;

            foreach (String info in fsMetaData)
            {
                string[] temp = info.Split(new char[] { ':' }, 2);

                if (temp != null)
                {
                    String param = temp[0].ToLower();
                    String value = temp[1].Trim();

                    if (String.IsNullOrEmpty(value) || String.IsNullOrWhiteSpace(value)) continue;

                    // Note that when setting the title like this, if the user clears the (XMP) title it will 
                    // revert to the title stored in the ffmpeg metadata. This will be confusing for the user
                    // and should probably be fixed.
                    if (video.Title == null && param.Equals("title"))
                    {
                        video.Title = value;
                    }
                    else if (video.Description == null && descriptionMatch.Any(s => s.Equals(param)))
                    {
                        video.Description = value;
                    }
                    else if (video.Author == null && authorMatch.Any(s => s.Equals(param)))
                    {
                        video.Author = value;
                    }
                    else if (video.Copyright == null && param.Equals("copyright"))
                    {
                        video.Copyright = value;
                    }
                    else if (video.Software == null && encoderMatch.Any(s => s.Equals(param)))
                    {
                        video.Software = value;
                    }
                    else if (param.Equals("major_brand"))
                    {
                        video.MajorBrand = value;
                    }
                    else if (param.Equals("minor_version"))
                    {
                        int minorVersion;
                        if (int.TryParse(value, out minorVersion))
                        {

                            video.MinorVersion = minorVersion;
                        }
                    }
                    else if (param.Equals("wmfsdkversion"))
                    {
                        video.WMFSDKVersion = value;
                    }
                    else if (param.Equals("isvbr"))
                    {
                        bool isVBR;
                        if (bool.TryParse(value, out isVBR))
                        {
                            video.IsVariableBitRate = isVBR;
                        }
                    }

                }
            }
        }
        public static BaseMetadata read(String location, MetadataFactory.ReadOptions options, CancellationToken token, int timeoutSeconds)
        {
            BaseMetadata metadata = new UnknownMetadata(FileUtils.getPathWithoutFileName(location));
            metadata.Name = Path.GetFileName(location);

            Logger.Log.Info("Reading metadata for: " + location);

            int timeoutMs = timeoutSeconds * 1000;

            Stream data = FileUtils.waitForFileAccess(location, FileAccess.Read, timeoutMs, token);

            MediaProbe mediaProbe = new MediaProbe();

            try
            {
                mediaProbe.open(location, token);

                switch (mediaProbe.MediaType)
                {
                    case MediaType.AUDIO_MEDIA:
                        {
                            metadata = new AudioMetadata(location, data);                          
                            AudioFileMetadataReader reader = new AudioFileMetadataReader();
                            reader.readMetadata(mediaProbe, data, options, metadata, token, timeoutSeconds);
                            break;
                        }
                    case MediaType.IMAGE_MEDIA:
                        {
                            metadata = new ImageMetadata(location, data);                        
                            ImageFileMetadataReader reader = new ImageFileMetadataReader();
                            reader.readMetadata(mediaProbe, data, options, metadata, token, timeoutSeconds);
                            break;
                        }                
                    case MediaType.VIDEO_MEDIA:
                        {
                            metadata = new VideoMetadata(location, data);                       
                            VideoFileMetadataReader reader = new VideoFileMetadataReader();
                            reader.readMetadata(mediaProbe, data, options, metadata, token, timeoutSeconds);
                            break;
                        }
                    default:
                        break;
                }                

                FileInfo info = new FileInfo(location);
                info.Refresh();

                if (info.Attributes.HasFlag(FileAttributes.ReadOnly))
                {
                    metadata.IsReadOnly = true;
                }

                if (!options.HasFlag(MetadataFactory.ReadOptions.LEAVE_STREAM_OPENED_AFTER_READ))
                {
                    metadata.close();
                }

            }
            catch (Exception e)
            {
                metadata.MetadataReadError = e;                
            }
            finally
            {                
                mediaProbe.close();
                mediaProbe.Dispose();                
            }
                        
            return metadata;
        }