private void AssignDlnaMetadata(MetadataContainer info, int edition) { if (info == null) { return; } List <string> profileList = new List <string>(); if (TranscodingParameter == null) { Metadata = info.Metadata[edition]; Video = info.Video[edition]; Audio = info.Audio[edition]; Image = info.Image[edition]; Subtitles = info.Subtitles[edition]; } else { if (IsImage) { ImageTranscoding image = (ImageTranscoding)TranscodingParameter; TranscodedImageMetadata metadata = MediaConverter.GetTranscodedImageMetadata(image); Metadata = new MetadataStream { Mime = info.Metadata[edition].Mime, ImageContainerType = metadata.TargetImageCodec, Size = Client.EstimateTransodedSize ? info.Metadata[edition].Size : 0, }; Image = new ImageStream { Height = metadata.TargetMaxHeight, Orientation = metadata.TargetOrientation, PixelFormatType = metadata.TargetPixelFormat, Width = metadata.TargetMaxWidth }; } else if (IsAudio) { AudioTranscoding audio = (AudioTranscoding)TranscodingParameter; TranscodedAudioMetadata metadata = MediaConverter.GetTranscodedAudioMetadata(audio); Metadata = new MetadataStream { Mime = info.Metadata[edition].Mime, AudioContainerType = metadata.TargetAudioContainer, Bitrate = metadata.TargetAudioBitrate > 0 ? metadata.TargetAudioBitrate : null, Duration = info.Metadata[edition].Duration, Size = Client.EstimateTransodedSize ? (metadata.TargetAudioBitrate > 0 ? Convert.ToInt64((metadata.TargetAudioBitrate * 1024 * info.Metadata[edition].Duration) / 8.0) : (long?)null) : null, }; AudioStream audioStream = new AudioStream(); audioStream.Bitrate = metadata.TargetAudioBitrate; audioStream.Channels = metadata.TargetAudioChannels; audioStream.Codec = metadata.TargetAudioCodec; audioStream.Frequency = metadata.TargetAudioFrequency; Audio = new List <AudioStream> { audioStream }; } else if (IsVideo) { VideoTranscoding video = (VideoTranscoding)TranscodingParameter; TranscodedVideoMetadata metadata = MediaConverter.GetTranscodedVideoMetadata(video); Metadata = new MetadataStream { Mime = info.Metadata[edition].Mime, VideoContainerType = metadata.TargetVideoContainer, Bitrate = metadata.TargetAudioBitrate > 0 && metadata.TargetVideoBitrate > 0 ? metadata.TargetAudioBitrate + metadata.TargetVideoBitrate : null, Duration = info.Metadata[edition].Duration, Size = Client.EstimateTransodedSize ? (metadata.TargetAudioBitrate > 0 && info.Metadata[edition].Duration > 0 ? Convert.ToInt64((metadata.TargetAudioBitrate * 1024 * info.Metadata[edition].Duration) / 8.0) : (long?)null) : null, }; Video = new VideoStream { AspectRatio = metadata.TargetVideoAspectRatio, Bitrate = metadata.TargetVideoBitrate, Codec = metadata.TargetVideoCodec, Framerate = metadata.TargetVideoFrameRate, HeaderLevel = metadata.TargetLevel, ProfileType = metadata.TargetProfile, RefLevel = metadata.TargetLevel, Height = metadata.TargetVideoMaxHeight, PixelAspectRatio = metadata.TargetVideoPixelAspectRatio, PixelFormatType = metadata.TargetVideoPixelFormat, TimestampType = metadata.TargetVideoTimestamp, Width = metadata.TargetVideoMaxWidth, }; AudioStream audioStream = new AudioStream(); audioStream.Bitrate = metadata.TargetAudioBitrate; audioStream.Channels = metadata.TargetAudioChannels; audioStream.Codec = metadata.TargetAudioCodec; audioStream.Frequency = metadata.TargetAudioFrequency; Audio = new List <AudioStream> { audioStream }; } } if (IsImage) { profileList = DlnaProfiles.ResolveImageProfile(Metadata.ImageContainerType, Image.Width, Image.Height); } else if (IsAudio) { var audio = Audio.FirstOrDefault(); profileList = DlnaProfiles.ResolveAudioProfile(Metadata.AudioContainerType, audio?.Codec ?? AudioCodec.Unknown, audio?.Bitrate, audio?.Frequency, audio?.Channels); } else if (IsVideo) { var audio = Audio.FirstOrDefault(); profileList = DlnaProfiles.ResolveVideoProfile(Metadata.VideoContainerType, Video.Codec, audio?.Codec ?? AudioCodec.Unknown, Video.ProfileType, Video.HeaderLevel, Video.Framerate, Video.Width, Video.Height, Video.Bitrate, audio?.Bitrate, Video.TimestampType); } string profile = ""; string mime = info.Metadata[edition].Mime; if (DlnaProfiles.TryFindCompatibleProfile(Client, profileList, ref profile, ref mime)) { DlnaMime = mime; DlnaProfile = profile; } }
public static Task <Stream> CreatePlaylistManifestAsync(VideoTranscoding video, SubtitleStream sub) { if (ServiceRegistration.IsRegistered <IMediaConverter>()) { IMediaConverter converter = ServiceRegistration.Get <IMediaConverter>(); TranscodedVideoMetadata metaData = converter.GetTranscodedVideoMetadata(video); double bitrate = 10000000; if (metaData.TargetVideoBitrate.HasValue && metaData.TargetAudioBitrate.HasValue) { bitrate += metaData.TargetVideoBitrate.Value; bitrate += metaData.TargetAudioBitrate.Value; bitrate = bitrate * 1024; //Bitrate in bits/s } int width = 1920; int height = 1080; if (metaData.TargetVideoMaxHeight.HasValue && metaData.TargetVideoMaxWidth.HasValue) { width = metaData.TargetVideoMaxHeight.Value; height = metaData.TargetVideoMaxWidth.Value; } string codec = "avc1.66.30,mp4a.40.2"; //H264 Baseline 3.0 and AAC if (metaData.TargetVideoCodec == VideoCodec.H264) { codec = "avc1."; if (metaData.TargetProfile == EncodingProfile.Baseline) { codec += "66."; } else if (metaData.TargetProfile == EncodingProfile.Main) { codec += "77."; } else //High { codec += "100."; } codec += ((metaData.TargetLevel ?? 0) * 10).ToString("0"); if (metaData.TargetAudioCodec == AudioCodec.Ac3) { codec += ",ac-3"; } else { codec += ",mp4a.40."; if (metaData.TargetAudioCodec == AudioCodec.Aac) { codec += "2"; } else if (metaData.TargetAudioCodec == AudioCodec.Mp3) { codec += "34"; } else //HE-ACC { codec += "5"; } } } StringBuilder manifestBuilder = new StringBuilder(); using (StringWriter writer = new StringWriter(manifestBuilder)) { writer.WriteLine("#EXTM3U"); writer.WriteLine(); if (sub != null) { CultureInfo culture = new CultureInfo(sub.Language); writer.WriteLine(string.Format("#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"subs\",NAME=\"{0}\",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE=\"{1}\",URI=\"{2}\"", culture.DisplayName, culture.TwoLetterISOLanguageName.ToLowerInvariant(), URL_PLACEHOLDER + converter.HLSSubtitlePlayListName)); writer.WriteLine(); } writer.WriteLine(string.Format("#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH={0},RESOLUTION={1},CODECS=\"{2}\"{3}", bitrate.ToString("0"), width + "x" + height, codec, sub != null ? ",SUBTITLES=\"subs\"" : "")); writer.WriteLine(URL_PLACEHOLDER + converter.HLSMediaPlayListName); writer.WriteLine(); } var memStream = new MemoryStream(Encoding.UTF8.GetBytes(manifestBuilder.ToString())); memStream.Position = 0; return(Task.FromResult <Stream>(memStream)); } return(Task.FromResult <Stream>(null)); }