private Task GetVideoCodecs() { var task = Task.Run(() => { #if NETFX_CORE var videoCodecList = WebRTC.GetVideoCodecs().OrderBy(CodecInfo => { switch (CodecInfo.Name) { case "VP8": return(1); case "VP9": return(2); case "H264": return(3); default: return(99); } }); lock (_videoLock) { foreach (var videoCodec in videoCodecList) { VideoCodecs.Add(videoCodec); } } #endif }); return(task); }
/// <summary> /// Initilializes Camerastream /// </summary> /// <param name="protocol"></param> /// <param name="resolution"></param> /// <param name="authorizationType"></param> /// <param name="videoCodec"></param> /// <param name="audioCodec"></param> public CameraStream(CameraProtocols protocol, Resolution resolution, CameraAuthorizationTypes authorizationType, VideoCodecs videoCodec, AudioCodecs audioCodec) { Protocol = protocol; Resolution = resolution; AuthorizationType = authorizationType; VideoCodec = videoCodec; AudioCodec = audioCodec; }
/// <summary> /// Initialises ResponseCameraStream /// </summary> /// <param name="uri"></param> /// <param name="expirationTime"></param> /// <param name="protocol"></param> /// <param name="resolution"></param> /// <param name="authorizationType"></param> /// <param name="videoCodec"></param> /// <param name="audioCodec"></param> /// <param name="idle"></param> public ResponseCameraStream(string uri, CameraProtocols protocol, Resolution resolution, CameraAuthorizationTypes authorizationType, VideoCodecs videoCodec, AudioCodecs audioCodec, int?idle = null, DateTime?expirationTime = null) : base(protocol, resolution, authorizationType, videoCodec, audioCodec) { URI = uri; ExpirationTime = expirationTime; IdleTimeoutSeconds = idle; }
/// <summary> /// Generate the necessary parameters /// </summary> public List <KeyValuePair <string, string> > GetParams() { var p = new List <KeyValuePair <string, string> >(); if (EnableTurn != null) { p.Add(new KeyValuePair <string, string>("EnableTurn", EnableTurn.Value.ToString().ToLower())); } if (Type != null) { p.Add(new KeyValuePair <string, string>("Type", Type.ToString())); } if (UniqueName != null) { p.Add(new KeyValuePair <string, string>("UniqueName", UniqueName)); } if (StatusCallback != null) { p.Add(new KeyValuePair <string, string>("StatusCallback", Serializers.Url(StatusCallback))); } if (StatusCallbackMethod != null) { p.Add(new KeyValuePair <string, string>("StatusCallbackMethod", StatusCallbackMethod.ToString())); } if (MaxParticipants != null) { p.Add(new KeyValuePair <string, string>("MaxParticipants", MaxParticipants.ToString())); } if (RecordParticipantsOnConnect != null) { p.Add(new KeyValuePair <string, string>("RecordParticipantsOnConnect", RecordParticipantsOnConnect.Value.ToString().ToLower())); } if (VideoCodecs != null) { p.AddRange(VideoCodecs.Select(prop => new KeyValuePair <string, string>("VideoCodecs", prop.ToString()))); } if (MediaRegion != null) { p.Add(new KeyValuePair <string, string>("MediaRegion", MediaRegion)); } return(p); }
/// <summary> /// Generate the necessary parameters /// </summary> public List <KeyValuePair <string, string> > GetParams() { var p = new List <KeyValuePair <string, string> >(); if (EnableTurn != null) { p.Add(new KeyValuePair <string, string>("EnableTurn", EnableTurn.Value.ToString())); } if (Type != null) { p.Add(new KeyValuePair <string, string>("Type", Type.ToString())); } if (UniqueName != null) { p.Add(new KeyValuePair <string, string>("UniqueName", UniqueName)); } if (StatusCallback != null) { p.Add(new KeyValuePair <string, string>("StatusCallback", StatusCallback.AbsoluteUri)); } if (StatusCallbackMethod != null) { p.Add(new KeyValuePair <string, string>("StatusCallbackMethod", StatusCallbackMethod.ToString())); } if (MaxParticipants != null) { p.Add(new KeyValuePair <string, string>("MaxParticipants", MaxParticipants.Value.ToString())); } if (RecordParticipantsOnConnect != null) { p.Add(new KeyValuePair <string, string>("RecordParticipantsOnConnect", RecordParticipantsOnConnect.Value.ToString())); } if (VideoCodecs != null) { p.Add(new KeyValuePair <string, string>("VideoCodecs", VideoCodecs.ToString())); } if (MediaRegion != null) { p.Add(new KeyValuePair <string, string>("MediaRegion", MediaRegion)); } return(p); }
/// <summary> /// 设置优先下载的视频编码 /// </summary> /// <param name="videoCodecs"></param> /// <returns></returns> public bool SetVideoCodecs(VideoCodecs videoCodecs) { appSettings.Video.VideoCodecs = videoCodecs; return(SetSettings()); }
private void TestResponseCameraStream(ResponseCameraStream s, string uri, DateTime expirationTime, int idleTimeout, CameraProtocols protocol, int width, int height, CameraAuthorizationTypes authorizationType, VideoCodecs videoCodec, AudioCodecs audioCodec) { Assert.Equal(uri, s.URI); Assert.Equal(expirationTime.ToUniversalTime(), s.ExpirationTime); Assert.Equal(idleTimeout, s.IdleTimeoutSeconds); TestRequestCameraStream(s, protocol, width, height, authorizationType, videoCodec, audioCodec); }
private void TestRequestCameraStream(CameraStream s, CameraProtocols protocol, int width, int height, CameraAuthorizationTypes authorizationType, VideoCodecs videoCodec, AudioCodecs audioCodec) { Assert.Equal(protocol, s.Protocol); Assert.NotNull(s.Resolution); Assert.Equal(width, s.Resolution.Width); Assert.Equal(height, s.Resolution.Height); Assert.Equal(authorizationType, s.AuthorizationType); Assert.Equal(videoCodec, s.VideoCodec); Assert.Equal(audioCodec, s.AudioCodec); }
/// <summary> /// 设置优先下载的视频编码 /// </summary> /// <param name="videoCodecs"></param> /// <returns></returns> public bool SetVideoCodecs(VideoCodecs videoCodecs) { settingsEntity.VideoCodecs = videoCodecs; return(SetEntity()); }
/// <summary> /// 从视频流更新VideoPage /// </summary> /// <param name="playUrl"></param> /// <param name="page"></param> internal static void VideoPageInfo(PlayUrl playUrl, VideoPage page) { if (playUrl == null) { return; } // 视频流信息 page.PlayUrl = playUrl; // 获取设置 UserInfoSettings userInfo = SettingsManager.GetInstance().GetUserInfo(); int defaultQuality = SettingsManager.GetInstance().GetQuality(); VideoCodecs videoCodecs = SettingsManager.GetInstance().GetVideoCodecs(); int defaultAudioQuality = SettingsManager.GetInstance().GetAudioQuality(); // 未登录时,最高仅720P if (userInfo.Mid == -1) { if (defaultQuality > 64) { defaultQuality = 64; } } // 非大会员账户登录时,如果设置的画质高于1080P,则这里限制为1080P if (!userInfo.IsVip) { if (defaultQuality > 80) { defaultQuality = 80; } } if (playUrl.Durl != null) { // 音质 // 画质 // 视频编码 // 时长 return; } if (playUrl.Dash != null) { // 如果video列表或者audio列表没有内容,则返回false if (playUrl.Dash.Video == null) { return; } if (playUrl.Dash.Video.Count == 0) { return; } // 音质 page.AudioQualityFormatList = GetAudioQualityFormatList(playUrl, defaultAudioQuality); if (page.AudioQualityFormatList.Count > 0) { page.AudioQualityFormat = page.AudioQualityFormatList[0]; } // 画质 & 视频编码 page.VideoQualityList = GetVideoQualityList(playUrl, userInfo, defaultQuality, videoCodecs); if (page.VideoQualityList.Count > 0) { page.VideoQuality = page.VideoQualityList[0]; } // 时长 page.Duration = Format.FormatDuration(playUrl.Dash.Duration); } }
/// <summary> /// 设置画质 & 视频编码 /// </summary> /// <param name="playUrl"></param> /// <param name="defaultQuality"></param> /// <param name="userInfo"></param> /// <param name="videoCodecs"></param> /// <returns></returns> private static List <VideoQuality> GetVideoQualityList(PlayUrl playUrl, UserInfoSettings userInfo, int defaultQuality, VideoCodecs videoCodecs) { List <VideoQuality> videoQualityList = new List <VideoQuality>(); if (playUrl.Dash.Video == null) { return(videoQualityList); } foreach (PlayUrlDashVideo video in playUrl.Dash.Video) { // 画质id大于设置画质时,跳过 if (video.Id > defaultQuality) { continue; } // 非大会员账户登录时 if (!userInfo.IsVip) { // 如果画质为720P60,跳过 if (video.Id == 74) { continue; } } string qualityFormat = string.Empty; PlayUrlSupportFormat selectedQuality = playUrl.SupportFormats.FirstOrDefault(t => t.Quality == video.Id); if (selectedQuality != null) { qualityFormat = selectedQuality.NewDescription; } // 寻找是否已存在这个画质 // 不存在则添加,存在则修改 string codecName = GetVideoCodecName(video.Codecs); VideoQuality videoQualityExist = videoQualityList.FirstOrDefault(t => t.Quality == video.Id); if (videoQualityExist == null) { List <string> videoCodecList = new List <string>(); if (codecName != string.Empty) { ListHelper.AddUnique(videoCodecList, codecName); } VideoQuality videoQuality = new VideoQuality() { Quality = video.Id, QualityFormat = qualityFormat, VideoCodecList = videoCodecList }; videoQualityList.Add(videoQuality); } else { if (!videoQualityList[videoQualityList.IndexOf(videoQualityExist)].VideoCodecList.Exists(t => t.Equals(codecName))) { if (codecName != string.Empty) { videoQualityList[videoQualityList.IndexOf(videoQualityExist)].VideoCodecList.Add(codecName); } } } // 设置选中的视频编码 VideoQuality selectedVideoQuality = videoQualityList.FirstOrDefault(t => t.Quality == video.Id); if (selectedVideoQuality == null) { continue; } if (videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList.Count == 1) { // 当获取的视频没有设置的视频编码时,执行 videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].SelectedVideoCodec = videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList[0]; } // 设置选中的视频编码 switch (videoCodecs) { case VideoCodecs.AVC: if (videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList.Contains("H.264/AVC")) { videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].SelectedVideoCodec = "H.264/AVC"; } break; case VideoCodecs.HEVC: if (videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList.Contains("H.265/HEVC")) { videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].SelectedVideoCodec = "H.265/HEVC"; } break; case VideoCodecs.NONE: break; default: break; } } return(videoQualityList); }
/// <summary> /// Builds the dlna URL. /// </summary> private static string BuildDlnaUrl(string deviceID, VideoCodecs? videoCodec, AudioCodecs? audioCodec, int? subtitleIndex, int? audiostreamIndex, int? videoBitrate, int? audiochannels, int? audioBitrate, long? startPositionTicks, string profile, string videoLevel) { var usCulture = new CultureInfo("en-US"); var dlnaparam = string.Format("Params={0};", deviceID); dlnaparam += videoCodec.HasValue ? videoCodec.Value + ";" : ";"; dlnaparam += audioCodec.HasValue ? audioCodec.Value + ";" : ";"; dlnaparam += audiostreamIndex.HasValue ? audiostreamIndex.Value.ToString(usCulture) + ";" : ";"; dlnaparam += subtitleIndex.HasValue ? subtitleIndex.Value.ToString(usCulture) + ";" : ";"; dlnaparam += videoBitrate.HasValue ? videoBitrate.Value.ToString(usCulture) + ";" : ";"; dlnaparam += audioBitrate.HasValue ? audioBitrate.Value.ToString(usCulture) + ";" : ";"; dlnaparam += audiochannels.HasValue ? audiochannels.Value.ToString(usCulture) + ";" : ";"; dlnaparam += startPositionTicks.HasValue ? startPositionTicks.Value.ToString(usCulture) + ";" : ";"; dlnaparam += profile + ";"; dlnaparam += videoLevel + ";"; return dlnaparam; }
private void LoadSettingsInternal() { cbxCaptureDevices.Items.Clear(); foreach (DsDevice ds in DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)) { cbxCaptureDevices.Items.Add(ds.Name); } List <SystemCodecEntry> systemCodecs = VideoCodecs.GetSupportedVideoCodecs(); foreach (SystemCodecEntry codec in systemCodecs) { RadioButton rbCodec = gbxCompression .Controls .Cast <Control>() .SingleOrDefault(x => x is RadioButton && string.Equals(x.Text, codec.DeviceName.ToString())) as RadioButton; if (rbCodec != null) { rbCodec.Enabled = codec.DeviceName != null && codec.IsInstalled; rbCodec.Tag = codec; rbCodec.Checked = codec.DeviceName == settings.PreferredCompressorDevice; } } cbxOtherCodecs.Items.Clear(); foreach (DsDevice ds in DsDevice.GetDevicesOfCat(FilterCategory.VideoCompressorCategory).Where(x => systemCodecs.All(y => y.DeviceName != x.Name))) { cbxOtherCodecs.Items.Add(ds.Name); if (ds.Name == settings.PreferredCompressorDevice) { cbxOtherCodecs.SelectedItem = ds.Name; rbCompressionUnsupported.Checked = true; } } if (cbxCaptureDevices.Items.Count > 0) { if (cbxCaptureDevices.Items.Contains(settings.PreferredCaptureDevice)) { cbxCaptureDevices.SelectedIndex = cbxCaptureDevices.Items.IndexOf(settings.PreferredCaptureDevice); } else { cbxCaptureDevices.SelectedIndex = 0; } } cbxSensorType.Items.Clear(); cbxSensorType.Items.Add(VideoFrameLayout.Monochrome); cbxSensorType.Items.Add(VideoFrameLayout.Color); //cbxSensorType.Items.Add(VideoFrameLayout.BayerRGGB); cbxSensorType.SelectedItem = settings.SimulatedImageLayout; cbxMonochromePixelsFrom.Items.Clear(); cbxMonochromePixelsFrom.Items.Add(LumaConversionMode.R); cbxMonochromePixelsFrom.Items.Add(LumaConversionMode.G); cbxMonochromePixelsFrom.Items.Add(LumaConversionMode.B); cbxMonochromePixelsFrom.Items.Add(LumaConversionMode.GrayScale); cbxMonochromePixelsFrom.SelectedItem = settings.LumaConversionMode; }