From a63abac88a9cc59ad8546c38ea4d8e93294db7bb Mon Sep 17 00:00:00 2001 From: lxmou666 <772765102@qq.com> Date: Sun, 3 Jan 2021 22:18:39 +0800 Subject: [PATCH] 123 --- JianGongYun/JianGongYun.csproj | 2 +- JianGongYun/TRTC/LiveClassroom.cs | 37 +- JianGongYun/TRTC/Models/LiveLevelEnum.cs | 16 + .../TRTC/ViewModels/LiveWindowViewModel.cs | 2 +- .../TRTC/ViewModels/SettingWindowViewModel.cs | 381 +++++++++++------- JianGongYun/TRTC/Windows/SettingWindow.xaml | 20 +- 6 files changed, 306 insertions(+), 152 deletions(-) create mode 100644 JianGongYun/TRTC/Models/LiveLevelEnum.cs diff --git a/JianGongYun/JianGongYun.csproj b/JianGongYun/JianGongYun.csproj index 354b709..55aa31d 100644 --- a/JianGongYun/JianGongYun.csproj +++ b/JianGongYun/JianGongYun.csproj @@ -8,7 +8,7 @@ $(NoWarn);0067 logo.ico WinExe - + AnyCPU;x64;x86 diff --git a/JianGongYun/TRTC/LiveClassroom.cs b/JianGongYun/TRTC/LiveClassroom.cs index 333ddf5..0515ccc 100644 --- a/JianGongYun/TRTC/LiveClassroom.cs +++ b/JianGongYun/TRTC/LiveClassroom.cs @@ -17,6 +17,7 @@ using Window = System.Windows.Window; using System.Collections.Concurrent; using System.Windows.Data; using System.Drawing; +using System.Diagnostics; namespace JianGongYun.TRTC { @@ -99,12 +100,6 @@ namespace JianGongYun.TRTC { lTRTCCloud.stopSystemAudioLoopback(); } - var encParams = settingWindowViewModel.EncParams; - var qosParams = settingWindowViewModel.QosParams; - var renderParams = settingWindowViewModel.RenderParams; - lTRTCCloud.setVideoEncoderParam(ref encParams); - lTRTCCloud.setNetworkQosParam(ref qosParams); - lTRTCCloud.setLocalRenderParams(ref renderParams); //设备完结 //liveWinMode.LoadAllScreen(); @@ -148,6 +143,12 @@ namespace JianGongYun.TRTC { if (!liveWinMode.CameraRunning) { + var encParams = settingWindowViewModel.MainEncParams; + var qosParams = settingWindowViewModel.MainQosParams; + var renderParams = settingWindowViewModel.MainRenderParams; + lTRTCCloud.setVideoEncoderParam(ref encParams); + lTRTCCloud.setNetworkQosParam(ref qosParams); + lTRTCCloud.setLocalRenderParams(ref renderParams); lTRTCCloud.startLocalPreview(IntPtr.Zero); liveWinMode.CameraRunning = true; var view = AddCustomVideoView(parent, CurrentClassroomEntity.TeacherId, TRTCVideoStreamType.TRTCVideoStreamTypeBig, true); @@ -186,7 +187,7 @@ namespace JianGongYun.TRTC { liveWinMode.ScreenRunning = true; SelectVieoSub(); - lTRTCCloud.startScreenCapture(IntPtr.Zero, TRTCVideoStreamType.TRTCVideoStreamTypeSub, settingWindowViewModel.EncParams); + lTRTCCloud.startScreenCapture(IntPtr.Zero, TRTCVideoStreamType.TRTCVideoStreamTypeSub, settingWindowViewModel.SubEncParams); var view = AddCustomVideoView(parent, CurrentClassroomEntity.TeacherId, TRTCVideoStreamType.TRTCVideoStreamTypeSub, true); if (liveWinMode.IsLive) { @@ -234,7 +235,7 @@ namespace JianGongYun.TRTC { liveWinMode.AudioRecordRunning = true; var time = Util.TimeStr(); - var pars = new TRTCAudioRecordingParams { filePath = Path.Combine(RecoderDir, $"{time}audio.pcm") }; + var pars = new TRTCAudioRecordingParams { filePath = Path.Combine(RecoderDir, $"{time}audio.wav") }; var res = lTRTCCloud.startAudioRecording(ref pars); Console.WriteLine(res); } @@ -272,10 +273,15 @@ namespace JianGongYun.TRTC public static void VedioRecordTask(TXLiteAVVideoView view, TRTCVideoStreamType streamType) { var end = false; + Stopwatch sw1 = new Stopwatch(); + Stopwatch sw2 = new Stopwatch(); ConcurrentQueue bitmaps = new ConcurrentQueue(); view.OnRenderVideoFrameHandler += (b) => { + sw1.Restart(); bitmaps.Enqueue(b.ToMat()); + sw1.Stop(); + //Debug.Print("a" + sw1.Elapsed.TotalMilliseconds.ToString()); }; view.OnViewRemove += () => { @@ -289,6 +295,13 @@ namespace JianGongYun.TRTC var videoFile = Path.Combine(_recoderDir, $"{Util.TimeStr()}_{streamType}.avi"); VideoWriter vw = new VideoWriter(); bool videoWriterInit = false; + var frameCount = 0; + Timer timer = new Timer((a) => + { + //Console.WriteLine($"{streamType} fps {frameCount}"); + Debug.Print($"{streamType} fps {frameCount}"); + Interlocked.Exchange(ref frameCount, 0); + }, null, 0, 1000); while (!end || bitmaps.Count > 0) { if (bitmaps.Count == 0) @@ -298,6 +311,7 @@ namespace JianGongYun.TRTC } if (bitmaps.TryDequeue(out var mat)) { + sw2.Restart(); //mat.SaveImage(imgTemp); //mat.Dispose(); //mat = Cv2.ImRead(imgTemp, ImreadModes.AnyColor); @@ -305,11 +319,13 @@ namespace JianGongYun.TRTC //Cv2.WaitKey(1); if (!videoWriterInit) { - vw.Open(videoFile, FourCC.H264, settingWindowViewModel.EncParams.videoFps, mat.Size()); + vw.Open(videoFile, FourCC.H264, settingWindowViewModel.LiveFps, mat.Size()); videoWriterInit = true; } vw.Write(mat); mat.Dispose(); + Interlocked.Increment(ref frameCount); + //Debug.Print("b"+sw2.Elapsed.TotalMilliseconds.ToString()); } else { @@ -322,6 +338,7 @@ namespace JianGongYun.TRTC { File.Delete(imgTemp); } + timer.Dispose(); Console.WriteLine($"VedioRecordTask End {streamType}"); }, TaskCreationOptions.LongRunning); } @@ -333,7 +350,7 @@ namespace JianGongYun.TRTC { TXLiteAVVideoView videoView = new TXLiteAVVideoView(); videoView.RegEngine(userId, streamType, lTRTCCloud, local); - videoView.SetRenderMode(streamType == TRTCVideoStreamType.TRTCVideoStreamTypeBig ? settingWindowViewModel.RenderParams.fillMode : TRTCVideoFillMode.TRTCVideoFillMode_Fit); + videoView.SetRenderMode(streamType == TRTCVideoStreamType.TRTCVideoStreamTypeBig ? settingWindowViewModel.MainRenderParams.fillMode : settingWindowViewModel.SubRenderParams.fillMode); //videoView.Width = parent.ActualWidth; videoView.SetBinding(TXLiteAVVideoView.WidthProperty, new Binding("ActualWidth") { Source = parent }); //videoView.Height = parent.ActualHeight; diff --git a/JianGongYun/TRTC/Models/LiveLevelEnum.cs b/JianGongYun/TRTC/Models/LiveLevelEnum.cs new file mode 100644 index 0000000..f0d672a --- /dev/null +++ b/JianGongYun/TRTC/Models/LiveLevelEnum.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JianGongYun.TRTC.Models +{ + /// + /// 直播画质 + /// + public enum LiveLevelEnum + { + Low = 0, + Mormal, + High + } +} diff --git a/JianGongYun/TRTC/ViewModels/LiveWindowViewModel.cs b/JianGongYun/TRTC/ViewModels/LiveWindowViewModel.cs index 2efc91c..0a4c399 100644 --- a/JianGongYun/TRTC/ViewModels/LiveWindowViewModel.cs +++ b/JianGongYun/TRTC/ViewModels/LiveWindowViewModel.cs @@ -73,7 +73,7 @@ namespace JianGongYun.TRTC.ViewModels public LiveWindowViewModel() { - timer = new DispatcherTimer(); + timer = new DispatcherTimer(DispatcherPriority.Render); timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += new EventHandler((a, b) => LiveTimeCount = ""); } diff --git a/JianGongYun/TRTC/ViewModels/SettingWindowViewModel.cs b/JianGongYun/TRTC/ViewModels/SettingWindowViewModel.cs index 2800b30..166ea84 100644 --- a/JianGongYun/TRTC/ViewModels/SettingWindowViewModel.cs +++ b/JianGongYun/TRTC/ViewModels/SettingWindowViewModel.cs @@ -308,125 +308,125 @@ namespace JianGongYun.TRTC.ViewModels #region 录屏属性 - /// - /// 视频帧率(fps) - /// - private string _ScreenRecordingFps = "60"; - public string ScreenRecordingFps - { - get - { - var screenRecordingFps = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_FPS);//本地缓存 - if (string.IsNullOrEmpty(screenRecordingFps)) - { - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_FPS, _ScreenRecordingFps);//生成初始数据 - } - else - { - _ScreenRecordingFps = screenRecordingFps; - } - return _ScreenRecordingFps; - } - set - { - _ScreenRecordingFps = value; - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_FPS, value);//生成保存本地 - if (PropertyChanged != null) - { - PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingFps")); - } - } - } + ///// + ///// 视频帧率(fps) + ///// + //private string _ScreenRecordingFps = "60"; + //public string ScreenRecordingFps + //{ + // get + // { + // var screenRecordingFps = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_FPS);//本地缓存 + // if (string.IsNullOrEmpty(screenRecordingFps)) + // { + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_FPS, _ScreenRecordingFps);//生成初始数据 + // } + // else + // { + // _ScreenRecordingFps = screenRecordingFps; + // } + // return _ScreenRecordingFps; + // } + // set + // { + // _ScreenRecordingFps = value; + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_FPS, value);//生成保存本地 + // if (PropertyChanged != null) + // { + // PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingFps")); + // } + // } + //} - /// - /// 音频码率 - /// - private string _ScreenRecordingAudioBitrate = "320000"; - public string ScreenRecordingAudioBitrate - { - get - { - var screenRecordingAudioBitrate = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE);//本地缓存 - if (string.IsNullOrEmpty(screenRecordingAudioBitrate)) - { - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE, _ScreenRecordingAudioBitrate);//生成初始数据 - } - else - { - _ScreenRecordingAudioBitrate = screenRecordingAudioBitrate; - } - return _ScreenRecordingAudioBitrate; - } - set - { - _ScreenRecordingAudioBitrate = value; - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE, value);//生成保存本地 - if (PropertyChanged != null) - { - PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingAudioBitrate")); - } - } - } + ///// + ///// 音频码率 + ///// + //private string _ScreenRecordingAudioBitrate = "320000"; + //public string ScreenRecordingAudioBitrate + //{ + // get + // { + // var screenRecordingAudioBitrate = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE);//本地缓存 + // if (string.IsNullOrEmpty(screenRecordingAudioBitrate)) + // { + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE, _ScreenRecordingAudioBitrate);//生成初始数据 + // } + // else + // { + // _ScreenRecordingAudioBitrate = screenRecordingAudioBitrate; + // } + // return _ScreenRecordingAudioBitrate; + // } + // set + // { + // _ScreenRecordingAudioBitrate = value; + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE, value);//生成保存本地 + // if (PropertyChanged != null) + // { + // PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingAudioBitrate")); + // } + // } + //} - /// - /// 音频采样率 - /// - private string _ScreenRecordingAudioFreq = "48000"; - public string ScreenRecordingAudioFreq - { - get - { - var screenRecordingAudioFreq = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_FREQ);//本地缓存 - if (string.IsNullOrEmpty(screenRecordingAudioFreq)) - { - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_FREQ, _ScreenRecordingAudioFreq);//生成初始数据 - } - else - { - _ScreenRecordingAudioFreq = screenRecordingAudioFreq; - } - return _ScreenRecordingAudioFreq; - } - set - { - _ScreenRecordingAudioFreq = value; - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_FREQ, value);//生成保存本地 - if (PropertyChanged != null) - { - PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingAudioFreq")); - } - } - } + ///// + ///// 音频采样率 + ///// + //private string _ScreenRecordingAudioFreq = "48000"; + //public string ScreenRecordingAudioFreq + //{ + // get + // { + // var screenRecordingAudioFreq = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_FREQ);//本地缓存 + // if (string.IsNullOrEmpty(screenRecordingAudioFreq)) + // { + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_FREQ, _ScreenRecordingAudioFreq);//生成初始数据 + // } + // else + // { + // _ScreenRecordingAudioFreq = screenRecordingAudioFreq; + // } + // return _ScreenRecordingAudioFreq; + // } + // set + // { + // _ScreenRecordingAudioFreq = value; + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_AUDIO_FREQ, value);//生成保存本地 + // if (PropertyChanged != null) + // { + // PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingAudioFreq")); + // } + // } + //} - /// - /// 编码级别 - /// - private string _ScreenRecordingProfileLevel = "-profile:v high -level 5.1"; - public string ScreenRecordingProfileLevel - { - get - { - var screenRecordingProfileLevel = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL);//本地缓存 - if (string.IsNullOrEmpty(screenRecordingProfileLevel)) - { - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL, _ScreenRecordingProfileLevel);//生成初始数据 - } - else - { - _ScreenRecordingProfileLevel = screenRecordingProfileLevel; - } - return _ScreenRecordingProfileLevel; - } - set - { - _ScreenRecordingProfileLevel = value; - storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL, value);//生成保存本地 - if (PropertyChanged != null) - { - PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingProfileLevel")); - } - } - } + ///// + ///// 编码级别 + ///// + //private string _ScreenRecordingProfileLevel = "-profile:v high -level 5.1"; + //public string ScreenRecordingProfileLevel + //{ + // get + // { + // var screenRecordingProfileLevel = storage.GetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL);//本地缓存 + // if (string.IsNullOrEmpty(screenRecordingProfileLevel)) + // { + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL, _ScreenRecordingProfileLevel);//生成初始数据 + // } + // else + // { + // _ScreenRecordingProfileLevel = screenRecordingProfileLevel; + // } + // return _ScreenRecordingProfileLevel; + // } + // set + // { + // _ScreenRecordingProfileLevel = value; + // storage.SetValue(INI_ROOT_KEY, INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL, value);//生成保存本地 + // if (PropertyChanged != null) + // { + // PropertyChanged(this, new PropertyChangedEventArgs("ScreenRecordingProfileLevel")); + // } + // } + //} /// /// 录制倒计时 @@ -536,7 +536,7 @@ namespace JianGongYun.TRTC.ViewModels var liveFps = storage.GetValue(INI_ROOT_KEY, INI_KEY_LIVE_FPS);//本地缓存 if (string.IsNullOrEmpty(liveFps)) { - storage.SetValue(INI_ROOT_KEY, INI_KEY_LIVE_MAIN_FPS, _LiveFps.ToString());//生成初始数据 + storage.SetValue(INI_ROOT_KEY, INI_KEY_LIVE_FPS, _LiveFps.ToString());//生成初始数据 } else { @@ -556,10 +556,42 @@ namespace JianGongYun.TRTC.ViewModels } } /// - /// 摄像画面级别 + /// 网络调控策略 /// - private TRTCVideoQosPreference _LiveMainLevel = TRTCVideoQosPreference.TRTCVideoQosPreferenceClear; - public TRTCVideoQosPreference LiveMainLevel + private TRTCVideoQosPreference _LiveMainQos = TRTCVideoQosPreference.TRTCVideoQosPreferenceClear; + public TRTCVideoQosPreference LiveMainQos + { + get + { + var liveMainQos = storage.GetValue(INI_ROOT_KEY, INI_KEY_LIVE_MAIN_QOS);//本地缓存 + if (string.IsNullOrEmpty(liveMainQos)) + { + storage.SetValue(INI_ROOT_KEY, INI_KEY_LIVE_MAIN_QOS, _LiveMainQos.ToString());//生成初始数据 + } + else + { + _LiveMainQos = (TRTCVideoQosPreference)Enum.Parse(typeof(TRTCVideoQosPreference), liveMainQos); + } + return _LiveMainQos; + } + set + { + _LiveMainQos = value; + storage.SetValue(INI_ROOT_KEY, INI_KEY_LIVE_MAIN_QOS, value.ToString());//生成保存本地 + //var pars = MainQosParams; + //LiveClassroom.lTRTCCloud.setNetworkQosParam(ref pars);//重设参数 + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs("LiveMainQos")); + } + } + } + + /// + /// 摄像头画质 + /// + private LiveLevelEnum _LiveMainLevel = LiveLevelEnum.High; + public LiveLevelEnum LiveMainLevel { get { @@ -570,7 +602,7 @@ namespace JianGongYun.TRTC.ViewModels } else { - _LiveMainLevel = (TRTCVideoQosPreference)Enum.Parse(typeof(TRTCVideoQosPreference), liveMainLevel); + _LiveMainLevel = (LiveLevelEnum)Enum.Parse(typeof(LiveLevelEnum), liveMainLevel); } return _LiveMainLevel; } @@ -578,14 +610,41 @@ namespace JianGongYun.TRTC.ViewModels { _LiveMainLevel = value; storage.SetValue(INI_ROOT_KEY, INI_KEY_LIVE_MAIN_LEVEL, value.ToString());//生成保存本地 - var pars = QosParams; - LiveClassroom.lTRTCCloud.setNetworkQosParam(ref pars);//重设参数 if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("LiveMainLevel")); } } } + /// + /// 屏幕分享画质 + /// + private LiveLevelEnum _LiveSubLevel = LiveLevelEnum.High; + public LiveLevelEnum LiveSubLevel + { + get + { + var liveSubLevel = storage.GetValue(INI_ROOT_KEY, INI_KEY_LIVE_SUB_LEVEL);//本地缓存 + if (string.IsNullOrEmpty(liveSubLevel)) + { + storage.SetValue(INI_ROOT_KEY, INI_KEY_LIVE_SUB_LEVEL, _LiveSubLevel.ToString());//生成初始数据 + } + else + { + _LiveSubLevel = (LiveLevelEnum)Enum.Parse(typeof(LiveLevelEnum), liveSubLevel); + } + return _LiveSubLevel; + } + set + { + _LiveSubLevel = value; + storage.SetValue(INI_ROOT_KEY, INI_KEY_LIVE_SUB_LEVEL, value.ToString());//生成保存本地 + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs("LiveSubLevel")); + } + } + } ///// ///// 摄像画面帧率 @@ -711,27 +770,71 @@ namespace JianGongYun.TRTC.ViewModels #endregion #region 参数 - public TRTCVideoEncParam EncParams + public TRTCVideoEncParam MainEncParams { get { - return new TRTCVideoEncParam { enableAdjustRes = false, resMode = TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape, videoBitrate = LiveMainBitrate, videoFps = LiveMainFps }; + var videoResolution = TRTCVideoResolution.TRTCVideoResolution_1280_720; + uint videoBitrate = 1600; + switch (LiveMainLevel) + { + case LiveLevelEnum.Low: + videoResolution = TRTCVideoResolution.TRTCVideoResolution_640_480; + videoBitrate = 600; + break; + case LiveLevelEnum.Mormal: + videoResolution = TRTCVideoResolution.TRTCVideoResolution_960_720; + videoBitrate = 1000; + break; + case LiveLevelEnum.High: + break; + } + return new TRTCVideoEncParam { enableAdjustRes = false, resMode = TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape, videoResolution = videoResolution, minVideoBitrate = videoBitrate, videoBitrate = videoBitrate, videoFps = LiveFps }; } } - public TRTCNetworkQosParam QosParams + public TRTCVideoEncParam SubEncParams { get { - return new TRTCNetworkQosParam { preference = LiveMainLevel }; + var videoResolution = TRTCVideoResolution.TRTCVideoResolution_1920_1080; + uint videoBitrate = 2000; + switch (LiveMainLevel) + { + case LiveLevelEnum.Low: + videoResolution = TRTCVideoResolution.TRTCVideoResolution_960_540; + videoBitrate = 850; + break; + case LiveLevelEnum.Mormal: + videoResolution = TRTCVideoResolution.TRTCVideoResolution_1280_720; + videoBitrate = 1600; + break; + case LiveLevelEnum.High: + break; + } + return new TRTCVideoEncParam { enableAdjustRes = false, resMode = TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape, videoResolution = videoResolution, minVideoBitrate = videoBitrate, videoBitrate = videoBitrate, videoFps = LiveFps }; } } - public TRTCRenderParams RenderParams + public TRTCNetworkQosParam MainQosParams + { + get + { + return new TRTCNetworkQosParam { preference = LiveMainQos }; + } + } + public TRTCRenderParams MainRenderParams { get { return new TRTCRenderParams { fillMode = TRTCVideoFillMode.TRTCVideoFillMode_Fill, mirrorType = TRTCVideoMirrorType.TRTCVideoMirrorType_Enable, rotation = TRTCVideoRotation.TRTCVideoRotation0 }; } } + public TRTCRenderParams SubRenderParams + { + get + { + return new TRTCRenderParams { fillMode = TRTCVideoFillMode.TRTCVideoFillMode_Fit, mirrorType = TRTCVideoMirrorType.TRTCVideoMirrorType_Enable, rotation = TRTCVideoRotation.TRTCVideoRotation0 }; + } + } #endregion #region 磁盘剩余空间 @@ -788,24 +891,26 @@ namespace JianGongYun.TRTC.ViewModels private const string INI_KEY_CHOOSE_MIC = "INI_KEY_CHOOSE_MIC";//当前麦克风 private const string INI_KEY_CHOOSE_CAMERA = "INI_KEY_CHOOSE_CAMERA";//当前摄像头 private const string INI_KEY_AUDIO_MIC_VOLUME = "INI_KEY_AUDIO_MIC_VOLUME";//麦克风音量 - private const string INI_KEY_AUDIO_SPEAKER_VOLUME = "INI_KEY_AUDIO_SOURCE";//播放音量 + //private const string INI_KEY_AUDIO_SPEAKER_VOLUME = "INI_KEY_AUDIO_SOURCE";//播放音量 private const string INI_KEY_AUDIO_SOURCE = "INI_KEY_AUDIO_SOURCE";//音频来源 private const string INI_KEY_AUDIO_SYSTEM_GATHER_VOLUME = "INI_KEY_AUDIO_SYSTEM_GATHER_VOLUME";//麦克风音量 //录屏 - private const string INI_KEY_SCREEN_RECORDING_FPS = "INI_KEY_SCREEN_RECORDING_FPS";//视频帧率(fps) - private const string INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE = "INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE";//音频码率 - private const string INI_KEY_SCREEN_RECORDING_AUDIO_FREQ = "INI_KEY_SCREEN_RECORDING_AUDIO_FREQ";//音频采样率 - private const string INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL = "INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL";//编码级别 + //private const string INI_KEY_SCREEN_RECORDING_FPS = "INI_KEY_SCREEN_RECORDING_FPS";//视频帧率(fps) + //private const string INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE = "INI_KEY_SCREEN_RECORDING_AUDIO_BITRATE";//音频码率 + //private const string INI_KEY_SCREEN_RECORDING_AUDIO_FREQ = "INI_KEY_SCREEN_RECORDING_AUDIO_FREQ";//音频采样率 + //private const string INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL = "INI_KEY_SCREEN_RECORDING_PROFILE_LEVEL";//编码级别 private const string INI_KEY_SCREEN_RECORDING_COUNTDOWN = "INI_KEY_SCREEN_RECORDING_COUNTDOWN";//录制倒计时 private const string INI_KEY_SCREEN_RECORDING_DIR = "INI_KEY_SCREEN_RECORDING_DIR";//录制保存路径 //直播 private const string INI_KEY_LIVE_AUDIO_LEVEL = "INI_KEY_LIVE_AUDIO_LEVEL";//直播音频等级 private const string INI_KEY_LIVE_FPS = "INI_KEY_LIVE_FPS";//直播帧率 - private const string INI_KEY_LIVE_MAIN_FPS = "INI_KEY_LIVE_MAIN_FPS";//直播主帧率 - private const string INI_KEY_LIVE_MAIN_BITTRATE = "INI_KEY_LIVE_MAIN_BITTRATE";//直播主码率 - private const string INI_KEY_LIVE_MAIN_LEVEL = "INI_KEY_LIVE_MAIN_LEVEL";//主画面级别 - private const string INI_KEY_LIVE_SUB_FPS = "INI_KEY_LIVE_SUB_FPS";//屏幕分享帧率 - private const string INI_KEY_LIVE_SUB_BITTRATE = "INI_KEY_LIVE_SUB_BITTRATE";//屏幕分享码率 + //private const string INI_KEY_LIVE_MAIN_FPS = "INI_KEY_LIVE_MAIN_FPS";//直播主帧率 + //private const string INI_KEY_LIVE_MAIN_BITTRATE = "INI_KEY_LIVE_MAIN_BITTRATE";//直播主码率 + private const string INI_KEY_LIVE_MAIN_QOS = "INI_KEY_LIVE_MAIN_QOS";//网络调控策略 + private const string INI_KEY_LIVE_MAIN_LEVEL = "INI_KEY_LIVE_MAIN_LEVEL";//摄像头画质 + private const string INI_KEY_LIVE_SUB_LEVEL = "INI_KEY_LIVE_SUB_LEVEL";//屏幕画质 + //private const string INI_KEY_LIVE_SUB_FPS = "INI_KEY_LIVE_SUB_FPS";//屏幕分享帧率 + //private const string INI_KEY_LIVE_SUB_BITTRATE = "INI_KEY_LIVE_SUB_BITTRATE";//屏幕分享码率 #endregion diff --git a/JianGongYun/TRTC/Windows/SettingWindow.xaml b/JianGongYun/TRTC/Windows/SettingWindow.xaml index a5d2380..cca645e 100644 --- a/JianGongYun/TRTC/Windows/SettingWindow.xaml +++ b/JianGongYun/TRTC/Windows/SettingWindow.xaml @@ -139,16 +139,32 @@ - + 网络调控策略 - + + + 摄像头画质 + + + + + + + + 屏幕分享画质 + + + + + +