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 @@
-
+
网络调控策略
-
+
+
+ 摄像头画质
+
+
+
+
+
+
+
+ 屏幕分享画质
+
+
+
+
+
+