前言

曾有做过一个产品,有一个功能是视频监控模块,视频监控首先想到的是视频多画面切换功能,由于前端是用WPF开发的,所以当时就做了一个多画面切换组件,效果如下:

  功能设计前提:

  由于要使用海康大华天地伟业等视频厂家的视频,对接的方式是通过各个厂家提供的SDK(官网下载),由于播放视频的时候需要传递控件的句柄(Handle),所以要在WPF中使用System.Windows.Forms下的控件Panel

  具体实现:

  1、  实现多画面类MultiView,主要提供页面初始化、设置当前画面等功能

  1. public static class MultiView
  2. {
  3. public static int CurrentModel = ;
  4. public static Dictionary<int, CellPanel> DictPanel = null;
  5. private static Grid OriginalGrid = null;
  6. private static Grid TempGrid1 = new Grid();
  7. private static Grid TempGrid2 = new Grid();
  8. private static int MaxCellNums = ;
  9.  
  10. /// <summary>
  11. /// 初始化页面
  12. /// </summary>
  13. /// <param name="grid">主体</param>
  14. /// <param name="cellNums">最大画面数</param>
  15. public static void InitGrid(Grid grid, int cellNums)
  16. {
  17. MultiView.OriginalGrid = grid;
  18. MultiView.MaxCellNums = cellNums;
  19.  
  20. MultiView.DictPanel = new Dictionary<int, CellPanel>();
  21. for (int index = ; index <= MultiView.MaxCellNums; index++)
  22. {
  23. CellPanel cellPanel = new CellPanel();
  24. cellPanel.Index = index;
  25. MultiView.DictPanel.Add(index, cellPanel);
  26. }
  27. }
  28.  
  29. /// <summary>
  30. /// 设置当前画面数
  31. /// </summary>
  32. /// <param name="model"></param>
  33. public static void SetCurrentModel(int model)
  34. {
  35. switch (model)
  36. {
  37. case :
  38. MultiView.SetModelByColumnAndRow(, );
  39. break;
  40. case :
  41. MultiView.SetModel3();
  42. break;
  43. case :
  44. MultiView.SetModelByColumnAndRow(, );
  45. break;
  46. case :
  47. MultiView.SetModel6();
  48. break;
  49. case :
  50. MultiView.SetModel8();
  51. break;
  52. case :
  53. MultiView.SetModelByColumnAndRow(, );
  54. break;
  55. case :
  56. MultiView.SetModel10();
  57. break;
  58. case :
  59. MultiView.SetModelByColumnAndRow(, );
  60. break;
  61. case :
  62. MultiView.SetModelByColumnAndRow(, );
  63. break;
  64. }
  65.  
  66. MultiView.CurrentModel = model;
  67. }
  68. /// <summary>
  69. /// 获取当前画面
  70. /// </summary>
  71. /// <returns></returns>
  72. public static CellPanel CurrentCellPanel()
  73. {
  74. for (int index = ; index <= MultiView.MaxCellNums; index++)
  75. {
  76. if (MultiView.DictPanel[index].Selected)
  77. {
  78. return MultiView.DictPanel[index];
  79. }
  80. }
  81. return null;
  82. }
  83.  
  84. /// <summary>
  85. /// 通过行列数设置画面分割
  86. /// </summary>
  87. /// <param name="column">列</param>
  88. /// <param name="row">行</param>
  89. public static void SetModelByColumnAndRow(int column, int row)
  90. {
  91. MultiView.Clear();
  92. MultiView.CreateColumnAndRow(MultiView.OriginalGrid, row, column);
  93.  
  94. int num = ;
  95. for (int rowIndex = ; rowIndex < row; rowIndex++)
  96. {
  97. for (int columnIndex = ; columnIndex < column; columnIndex++)
  98. {
  99. CellPanel cellPanel = MultiView.DictPanel[num];
  100. Grid.SetColumn(cellPanel, columnIndex);
  101. Grid.SetRow(cellPanel, rowIndex);
  102. MultiView.OriginalGrid.Children.Add(cellPanel);
  103. num++;
  104. }
  105. }
  106. }
  107. /// <summary>
  108. /// 三画面
  109. /// </summary>
  110. public static void SetModel3()
  111. {
  112. MultiView.Clear();
  113. ColumnDefinition columnDefinition1 = new ColumnDefinition();
  114. ColumnDefinition columnDefinition2 = new ColumnDefinition();
  115. columnDefinition1.Width = new GridLength(0.618, GridUnitType.Star);
  116. columnDefinition2.Width = new GridLength(0.382, GridUnitType.Star);
  117. MultiView.OriginalGrid.ColumnDefinitions.Add(columnDefinition1);
  118. MultiView.OriginalGrid.ColumnDefinitions.Add(columnDefinition2);
  119. CellPanel cellPanel = MultiView.DictPanel[];
  120. Grid.SetColumn(cellPanel, );
  121. MultiView.OriginalGrid.Children.Add(cellPanel);
  122.  
  123. for (int index1 = ; index1 < ; ++index1)
  124. {
  125. cellPanel = MultiView.DictPanel[index1 + ];
  126. MultiView.TempGrid1.RowDefinitions.Add(new RowDefinition());
  127. Grid.SetRow(cellPanel, index1);
  128. MultiView.TempGrid1.Children.Add(cellPanel);
  129. }
  130.  
  131. Grid.SetColumn(MultiView.TempGrid1, );
  132. MultiView.OriginalGrid.Children.Add(MultiView.TempGrid1);
  133. }
  134. /// <summary>
  135. /// 六画面
  136. /// </summary>
  137. public static void SetModel6()
  138. {
  139. MultiView.Clear();
  140. MultiView.CreateColumnAndRow(MultiView.OriginalGrid, , );
  141. MultiView.OriginalGrid.ColumnDefinitions[].Width = new GridLength(0.66, GridUnitType.Star);
  142. MultiView.OriginalGrid.ColumnDefinitions[].Width = new GridLength(0.34, GridUnitType.Star);
  143. MultiView.OriginalGrid.RowDefinitions[].Height = new GridLength(0.67, GridUnitType.Star);
  144. MultiView.OriginalGrid.RowDefinitions[].Height = new GridLength(0.33, GridUnitType.Star);
  145.  
  146. CellPanel cellPanel = MultiView.DictPanel[];
  147. Grid.SetColumn(cellPanel, );
  148. Grid.SetRow(cellPanel, );
  149. MultiView.OriginalGrid.Children.Add(cellPanel);
  150.  
  151. //p2,p3 画面
  152. Grid.SetColumn(MultiView.TempGrid1, );
  153. Grid.SetRow(MultiView.TempGrid1, );
  154.  
  155. for (int index = ; index < ; ++index)
  156. {
  157. cellPanel = MultiView.DictPanel[index + ];
  158. MultiView.TempGrid1.RowDefinitions.Add(new RowDefinition());
  159. Grid.SetRow(cellPanel, index);
  160. MultiView.TempGrid1.Children.Add(cellPanel);
  161. }
  162. MultiView.OriginalGrid.Children.Add(MultiView.TempGrid1);
  163. //p4,p5 画面
  164. Grid.SetColumn(MultiView.TempGrid2, );
  165. Grid.SetRow(MultiView.TempGrid2, );
  166.  
  167. for (int index = ; index < ; ++index)
  168. {
  169. cellPanel = MultiView.DictPanel[index + ];
  170.  
  171. MultiView.TempGrid2.ColumnDefinitions.Add(new ColumnDefinition());
  172. Grid.SetColumn(cellPanel, index);
  173. MultiView.TempGrid2.Children.Add(cellPanel);
  174. }
  175. MultiView.OriginalGrid.Children.Add(MultiView.TempGrid2);
  176.  
  177. cellPanel = MultiView.DictPanel[];
  178. Grid.SetRow(cellPanel, );
  179. Grid.SetColumn(cellPanel, );
  180. MultiView.OriginalGrid.Children.Add(cellPanel);
  181. }
  182. /// <summary>
  183. /// 八画面
  184. /// </summary>
  185. public static void SetModel8()
  186. {
  187. MultiView.Clear();
  188. MultiView.CreateColumnAndRow(MultiView.OriginalGrid, , );
  189. MultiView.OriginalGrid.ColumnDefinitions[].Width = new GridLength(0.75, GridUnitType.Star);
  190. MultiView.OriginalGrid.ColumnDefinitions[].Width = new GridLength(0.25, GridUnitType.Star);
  191. MultiView.OriginalGrid.RowDefinitions[].Height = new GridLength(0.75, GridUnitType.Star);
  192. MultiView.OriginalGrid.RowDefinitions[].Height = new GridLength(0.25, GridUnitType.Star);
  193.  
  194. CellPanel cellPanel = MultiView.DictPanel[];
  195. Grid.SetColumn(cellPanel, );
  196. Grid.SetRow(cellPanel, );
  197. MultiView.OriginalGrid.Children.Add(cellPanel);
  198.  
  199. //p2,p3,p4 画面
  200. Grid.SetColumn(MultiView.TempGrid1, );
  201. Grid.SetRow(MultiView.TempGrid1, );
  202.  
  203. for (int index = ; index < ; ++index)
  204. {
  205. cellPanel = MultiView.DictPanel[index + ];
  206.  
  207. MultiView.TempGrid1.RowDefinitions.Add(new RowDefinition());
  208. Grid.SetRow(cellPanel, index);
  209. MultiView.TempGrid1.Children.Add(cellPanel);
  210. }
  211. MultiView.OriginalGrid.Children.Add(MultiView.TempGrid1);
  212. //p5,p6,p7 画面
  213. Grid.SetColumn(MultiView.TempGrid2, );
  214. Grid.SetRow(MultiView.TempGrid2, );
  215.  
  216. for (int index = ; index < ; ++index)
  217. {
  218. cellPanel = MultiView.DictPanel[index + ];
  219.  
  220. MultiView.TempGrid2.ColumnDefinitions.Add(new ColumnDefinition());
  221. Grid.SetColumn(cellPanel, index);
  222. MultiView.TempGrid2.Children.Add(cellPanel);
  223. }
  224. MultiView.OriginalGrid.Children.Add(MultiView.TempGrid2);
  225.  
  226. cellPanel = MultiView.DictPanel[];
  227. Grid.SetRow(cellPanel, );
  228. Grid.SetColumn(cellPanel, );
  229. MultiView.OriginalGrid.Children.Add(cellPanel);
  230. }
  231. /// <summary>
  232. /// 十画面
  233. /// </summary>
  234. public static void SetModel10()
  235. {
  236. MultiView.Clear();
  237. MultiView.CreateColumnAndRow(MultiView.OriginalGrid, , );
  238. MultiView.OriginalGrid.ColumnDefinitions[].Width = new GridLength(0.77, GridUnitType.Star);
  239. MultiView.OriginalGrid.ColumnDefinitions[].Width = new GridLength(0.23, GridUnitType.Star);
  240. MultiView.OriginalGrid.RowDefinitions[].Height = new GridLength(0.8, GridUnitType.Star);
  241. MultiView.OriginalGrid.RowDefinitions[].Height = new GridLength(0.2, GridUnitType.Star);
  242.  
  243. CellPanel cellPanel = MultiView.DictPanel[];
  244. Grid.SetColumn(cellPanel, );
  245. Grid.SetRow(cellPanel, );
  246. MultiView.OriginalGrid.Children.Add(cellPanel);
  247.  
  248. //p2,p3,p4,p5 画面
  249. Grid.SetColumn(MultiView.TempGrid1, );
  250. Grid.SetRow(MultiView.TempGrid1, );
  251.  
  252. for (int index = ; index < ; ++index)
  253. {
  254. cellPanel = MultiView.DictPanel[index + ];
  255.  
  256. MultiView.TempGrid1.RowDefinitions.Add(new RowDefinition());
  257. Grid.SetRow(cellPanel, index);
  258. MultiView.TempGrid1.Children.Add(cellPanel);
  259. }
  260. MultiView.OriginalGrid.Children.Add(MultiView.TempGrid1);
  261. //p6,p7,p8,p9 画面
  262. Grid.SetColumn(MultiView.TempGrid2, );
  263. Grid.SetRow(MultiView.TempGrid2, );
  264.  
  265. for (int index = ; index < ; ++index)
  266. {
  267. cellPanel = MultiView.DictPanel[index + ];
  268.  
  269. MultiView.TempGrid2.ColumnDefinitions.Add(new ColumnDefinition());
  270. Grid.SetColumn(cellPanel, index);
  271. MultiView.TempGrid2.Children.Add(cellPanel);
  272. }
  273. MultiView.OriginalGrid.Children.Add(MultiView.TempGrid2);
  274.  
  275. cellPanel = MultiView.DictPanel[];
  276. Grid.SetRow(cellPanel, );
  277. Grid.SetColumn(cellPanel, );
  278. MultiView.OriginalGrid.Children.Add(cellPanel);
  279. }
  280. /// <summary>
  281. /// 索引画面全屏
  282. /// </summary>
  283. /// <param name="index">画面索引</param>
  284. public static void SetFullScreen(int index)
  285. {
  286. MultiView.Clear();
  287. CellPanel cellPanel = MultiView.DictPanel[index];
  288. Grid.SetColumn(cellPanel, );
  289. Grid.SetRow(cellPanel, );
  290. MultiView.OriginalGrid.Children.Add(cellPanel);
  291. }
  292.  
  293. private static void Clear()
  294. {
  295. MultiView.OriginalGrid.RowDefinitions.Clear();
  296. MultiView.OriginalGrid.ColumnDefinitions.Clear();
  297. MultiView.OriginalGrid.Children.Clear();
  298. MultiView.TempGrid1.Children.Clear();
  299. MultiView.TempGrid1.RowDefinitions.Clear();
  300. MultiView.TempGrid1.ColumnDefinitions.Clear();
  301. MultiView.TempGrid2.Children.Clear();
  302. MultiView.TempGrid2.RowDefinitions.Clear();
  303. MultiView.TempGrid2.ColumnDefinitions.Clear();
  304.  
  305. }
  306.  
  307. private static void CreateColumnAndRow(Grid grid, int row, int column)
  308. {
  309. for (int index = ; index < row; ++index)
  310. {
  311. grid.RowDefinitions.Add(new RowDefinition());
  312. }
  313.  
  314. for (int index = ; index < column; ++index)
  315. {
  316. grid.ColumnDefinitions.Add(new ColumnDefinition());
  317. }
  318. }
  319. }

2、 实现单通道画面控件CellPanel

1) 前台页面

  1. <UserControl x:Class="MultiviewControl.CellPanel"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
  5. xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
  6. BorderThickness="" BorderBrush="Silver">
  7. <Grid Background="Black">
  8. <wfi:WindowsFormsHost >
  9. <wf:Panel x:Name="panel" AutoSize="true" Dock="Fill"/>
  10. </wfi:WindowsFormsHost>
  11. </Grid>
  12. </UserControl>

2) 后台实现

  1. public partial class CellPanel : System.Windows.Controls.UserControl
  2. {
  3. public int Index;
  4. public bool Selected;
  5.  
  6. private bool isFull = false;
  7. private SolidColorBrush SelectedColor = new SolidColorBrush(Colors.YellowGreen);
  8. private SolidColorBrush MouseEnterColor = new SolidColorBrush(Colors.Red);
  9. private SolidColorBrush NormalColor = new SolidColorBrush(Colors.Silver);
  10.  
  11. public CellPanel()
  12. {
  13. this.InitializeComponent();
  14. this.panel.Click += new EventHandler(this.panel_Click);
  15. this.panel.DoubleClick += new EventHandler(this.panel_DoubleClick);
  16. this.panel.MouseEnter += new EventHandler(this.panel_MouseEnter);
  17. this.panel.MouseLeave += new EventHandler(this.panel_MouseLeave);
  18. this.panel.SizeChanged += new EventHandler(this.panel_SizeChange);
  19. this.Selected = false;
  20. }
  21.  
  22. public void panel_Click(object sender, EventArgs e)
  23. {
  24. foreach (CellPanel cellPanel in MultiView.DictPanel.Values)
  25. {
  26. cellPanel.Selected = false;
  27. cellPanel.BorderBrush = NormalColor;
  28. }
  29. this.Selected = true;
  30. this.BorderBrush = SelectedColor;
  31. }
  32. public void panel_DoubleClick(object sender, EventArgs e)
  33. {
  34. if (this.isFull)
  35. {
  36. MultiView.SetCurrentModel(MultiView.CurrentModel);
  37. }
  38. else
  39. {
  40. MultiView.SetFullScreen(this.Index);
  41. }
  42.  
  43. this.isFull = !this.isFull;
  44. }
  45. private void panel_MouseEnter(object sender, EventArgs e)
  46. {
  47. if (!this.Selected)
  48. {
  49. this.BorderBrush = MouseEnterColor;
  50. }
  51. }
  52.  
  53. private void panel_MouseLeave(object sender, EventArgs e)
  54. {
  55. if (!this.Selected)
  56. {
  57. this.BorderBrush = NormalColor;
  58. }
  59. }
  60. private void panel_SizeChange(object sender, EventArgs e)
  61. {
  62. this.panel.Size = new System.Drawing.Size((int)this.Width - , (int)this.Height - );
  63. }
  64.  
  65. }

  3、新建一个窗体MainWindow,调用MutiView类

     1) 前台页面

  1. <Window x:Class="MultiviewControl.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="" Width="">
  5. <Grid>
  6. <Grid.RowDefinitions>
  7. <RowDefinition Height="*" />
  8. <RowDefinition Height="" />
  9. </Grid.RowDefinitions>
  10. <Grid x:Name="grid" />
  11. <StackPanel Orientation="Horizontal" Grid.Row="">
  12. <Button Content="1画 面" Tag="" Click="btn_Click" Margin="" Width=""/>
  13. <Button Content="3画 面" Tag="" Click="btn_Click" Margin="" Width=""/>
  14. <Button Content="4画 面" Tag="" Click="btn_Click" Margin="" Width=""/>
  15. <Button Content="6画 面" Tag="" Click="btn_Click" Margin="" Width=""/>
  16. <Button Content="8画 面" Tag="" Click="btn_Click" Margin="" Width=""/>
  17. <Button Content="9画 面" Tag="" Click="btn_Click" Margin="" Width=""/>
  18. <Button Content="10画 面" Tag="" Click="btn_Click" Margin="" Width=""/>
  19. </StackPanel>
  20. </Grid>
  21. </Window>

2) 后台实现

  1. public partial class MainWindow : Window
  2. {
  3. public MainWindow()
  4. {
  5. InitializeComponent();
  6. MultiView.InitGrid(this.grid, );
  7. MultiView.SetCurrentModel();
  8. }
  9.  
  10. private void btn_Click(object sender, RoutedEventArgs e)
  11. {
  12. Button btn = sender as Button;
  13. int index = ;
  14. if(btn.Tag != null)
  15. {
  16. MultiView.SetCurrentModel(Convert.ToInt32( btn.Tag));
  17. }
  18.  
  19. }
  20.  
  21. }

多画面切换就OK了!希望能对大家有用!

使用WPF制作视频监控多画面切换的更多相关文章

  1. Qt编写视频监控画面分割界面(开源)

    其实qt应用在安防领域还是蛮多的,尤其是视频监控系统,但是网上几乎没有看到qt做的最基础的视频监控画面分割的demo,今天特意花几分钟提取出来,开源放出来.欢迎大家多多点赞!源码下载:点击打开链接 运 ...

  2. Qt编写安防视频监控系统7-全屏切换

    一.前言 全屏切换这个功能点属于简单的,一般会做到右键菜单中,也提供了快捷键比如alt+enter来触发,恢复全屏则按esc即可,全屏处理基本上都是隐藏通道面板以外的窗体,保持最大化展示,由于采用了模 ...

  3. Qt编写安防视频监控系统1-通道切换

    一.前言 通道切换在视频监控系统中是最基础的必备功能,一般都会提供1通道+4通道+6通道+8通道+9通道+16通道这几个通道切换,可能做得比较好的还会提供24通道+32通道的,这个可能对电脑的配置就有 ...

  4. [视频监控]用状态机图展示Layout切换关系

    监控系统通常会提供多种Layout给用户,用于满足不同需求,如:高清显示单路视频或者同时观察多路监控情况. 文中系统只提供了单路.2x2(2行2列共4路).8路(4行4列布局,从左上角算起,有个核心显 ...

  5. C# 实现IP视频监控(摄像头)画面推送(简单的不能再简单的DEMO)

    最近继续在家休息,在完成上一个Python抓取某音乐网站爬虫后,琢磨着实现一个基于HTTP推送的 IP视频监控,比如外出的时候,在家里 开启一个监控端(摄像头+服务端),可以看到实时画面,如果再加上自 ...

  6. Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)

    一.自定义控件大全 (一).控件介绍 超过160个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...

  7. Qt编写安防视频监控系统(界面很漂亮)

    一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...

  8. Qt编写安防视频监控系统18-云台控制

    一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...

  9. Qt编写安防视频监控系统15-远程回放

    一.前言 远程回放有两种处理方式,一种是采用NVR厂家提供的SDK开发包来登录到NVR上,然后根据SDK的函数接口指定的视频文件,当然也有接口查询视频文件列表等:一种是采用视频监控行业的国标GB281 ...

随机推荐

  1. 我的MVP呢?

    Ladies and gentelmen, welcome the MVP of NBA 16-2017 Season:... 呃,等下,好像哪里不对.那是因为,我要说的MVP根本就不是Most Va ...

  2. 2017/2/16:自己ajax+json习惯性写法 代码拼接的写法 +json用post提交乱码的原因

    1.先导入jquery的包 2.ajax的写法跟注意点 返回一个list的写法 代码拼接写法: html层: 2.script处 4:在你前面传递参数的时候没有遇到乱码问题的情况下,你使用json并且 ...

  3. curl命令整理

    ##curl命令 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件. #####1. 下载单个文件,默认将输出打印到标准输出中(STDOUT)中``` c ...

  4. codeforces C. Functions again

    题意:给定了一个公式,让你找到一对(l,r),求解出公式给定的F值. 当时没有想到,我把(-1)^(i-l)看成(-1)^i,然后思路就完全错了.其实这道题是个简单的dp+最长连续子序列. O(n)求 ...

  5. 812. Largest Triangle Area

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  6. centos 下备份oracle数据

    一.在xshell下root用户登录服务器 1.新建oracle数据库备份目录 mkdir -p /casnw/backup/oradata6910bak 2.设置目录权限为oinstall用户组的o ...

  7. c# 产生随机数 程序所在路径

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. BZOJ 2301 [HAOI2011]Problem b (分块 + 莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 6519  Solved: 3026[Submit] ...

  9. 关于WEB前端,你必须了解的发展方向

    一.职业方向定位 首先,只有确定好自己的职业方向,才能做好职业规划.在我看来,做WEB前端技术能够找到的职业方向有以下几种: (1)资深WEB前端工程师 这个方向算是一个WEB前端最基本的选择了,在国 ...

  10. VIP之FrameBuffer

     2.VIP Frame Buffer 1.原来我是一直存在一个疑惑,demo上说VIP Frame Buffer输出是固定的60fps,但是在NiosII的程序中我没有找到设置输出为60fps的设置 ...