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; }
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; }