本文原文地址:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html

阿里云栖社区也有相关的视频开发案例:https://yq.aliyun.com/articles/51182

注意

本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)

系列

1.     C# 视频监控系列(1):准备

2.     C# 视频监控系列(2):客户端——封装API

3.     C# 视频监控系列(3):客户端——连接服务器

4.     C# 视频监控系列(4):客户端——音频接收和抓图

5.     C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)

6.     C# 视频监控系列(6):服务器端——封装API(上) [HikServer.dll]

7.     C# 视频监控系列(7):服务器端——封装API(下) [DS40xxSDK.dll]

8.     C# 视频监控系列(8):服务器端——预览和可被客户端连接

9.     C# 视频监控系列(9):服务器端——数据捕获(抓图 + 录像)

10.     C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号

11.     C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]

12.     C# 视频监控系列(12):H264播放器——播放录像文件

13.     C# 视频监控系列(13):H264播放器——控制播放和截图

正文

一、控制播放

1.1     暂停/播放/停止

VC++ Code:

  1.  
  2. ////////////////////////////////////////////////////////////////////////////////
  3.  
  4. //Funtion:Play or change the play speed to normal;
  5.  
  6. ///////////////////////////////////////////////////////////////////////////////
  7.  
  8. void CPlayerDlg::OnPlay() 
  9.  
  10. {
  11.  
  12.     // TODO: Add your control notification handler code here
  13.  
  14.     Play();
  15.  
  16. }
  17.  
  18. void CPlayerDlg::Play()
  19.  
  20. {
  21.  
  22.     m_nSpeed=0;
  23.  
  24.     OnThrow0();
  25.  
  26. //#ifdef _TEST_CALLBACK
  27.  
  28.     if(m_bConvert)       
  29.  
  30.        Hik_PlayM4_SetDecCallBack(PORT,DecCBFun);
  31.  
  32.     else
  33.  
  34.         m_pMainMenu->EnableMenuItem(ID_FILE_CLOSE, FALSE);
  35.  
  36. //#endif
  37.  
  38.     if(m_bPlaying)
  39.  
  40.     {
  41.  
  42.         Hik_PlayM4_Play(PORT,GetDlgItem(IDC_SHOW)->m_hWnd);
  43.  
  44.     }
  45.  
  46.     else
  47.  
  48.     {
  49.  
  50.         if(m_bStreamType)
  51.  
  52.         {
  53.  
  54.             ::SetFilePointer(m_hStreamFile,m_nHeadSize,0,FILE_BEGIN);
  55.  
  56.             Hik_PlayM4_ResetSourceBuffer(PORT);
  57.  
  58.             SetEvent(m_hEventInput);
  59.  
  60.         }
  61.  
  62.         m_bPlaying = Hik_PlayM4_Play(PORT,GetDlgItem(IDC_SHOW)->m_hWnd);
  63.  
  64.         m_bSound=Hik_PlayM4_PlaySound(PORT);
  65.  
  66.         if(m_bPlaying)
  67.  
  68.             SetTimer(PLAY_TIMER,500,NULL);
  69.  
  70.         
  71.  
  72.     }
  73.  
  74.     if(m_bPlaying)
  75.  
  76.         SetPlayState();
  77.  
  78.     else
  79.  
  80.     {
  81.  
  82.         CString csError;
  83.  
  84.         csError.Format("Play the file faild.(%d)",Hik_PlayM4_GetLastError(PORT));
  85.  
  86.         AfxMessageBox(csError);
  87.  
  88.     }
  89.  
  90.     
  91.  
  92. }
  93.  
  94. //////////////////////////////////////////////////////////////////////////////
  95.  
  96. //Funtion:pause.
  97.  
  98. //////////////////////////////////////////////////////////////////////////////
  99.  
  100. void CPlayerDlg::OnPause() 
  101.  
  102. {
  103.  
  104.     // TODO: Add your control notification handler code here
  105.  
  106.     if(m_bPlaying)
  107.  
  108.     {
  109.  
  110.         m_bPause=!m_bPause;
  111.  
  112.         Pause(m_bPause);
  113.  
  114.     }
  115.  
  116. }
  117.  
  118. void CPlayerDlg::Pause(BOOL bPause)
  119.  
  120. {
  121.  
  122.     if(m_bPaused == bPause)
  123.  
  124.         return;
  125.  
  126.     m_bPaused=bPause;
  127.  
  128.     Hik_PlayM4_Pause(PORT,bPause);
  129.  
  130.     TRACE("PAUSE %d\n",m_bPaused);
  131.  
  132. }
  133.  
  134. /////////////////////////////////////////////////////////////////////////////
  135.  
  136. //Function: Stop
  137.  
  138. /////////////////////////////////////////////////////////////////////////////
  139.  
  140. void CPlayerDlg::OnStop() 
  141.  
  142. {
  143.  
  144.     // TODO: Add your control notification handler code here
  145.  
  146.     
  147.  
  148.     if(m_bPlaying)
  149.  
  150.     {
  151.  
  152.         Stop();
  153.  
  154.     }
  155.  
  156.     if(m_bConvert)
  157.  
  158.     {
  159.  
  160.        if(outFile!=NULL)
  161.  
  162.           closeWriffFiles();    
  163.  
  164.        if(yuvBuf!=NULL)
  165.  
  166.        {
  167.  
  168.            free(yuvBuf);
  169.  
  170.            yuvBuf=NULL;
  171.  
  172.        }
  173.  
  174.        m_bConvert=0;    
  175.  
  176.        //
  177.  
  178.     }
  179.  
  180. }
  181.  
  182. void CPlayerDlg::Stop()
  183.  
  184. {
  185.  
  186.     CButton *pButton;
  187.  
  188.     if(!m_bPlaying)
  189.  
  190.         return;
  191.  
  192.     KillTimer(PLAY_TIMER);
  193.  
  194.     if(Hik_PlayM4_StopSound())
  195.  
  196.     {
  197.  
  198.         m_bSound=FALSE;
  199.  
  200.         pButton = (CButton *)GetDlgItem(IDC_SOUND);
  201.  
  202.         pButton->SetIcon(m_hSoundStopIcon);
  203.  
  204.     }
  205.  
  206.     //continue before stop.Add by lgl at 9-19;
  207.  
  208.     m_bPause=FALSE;
  209.  
  210.     
  211.  
  212.     //stop
  213.  
  214.     m_bPlaying = !Hik_PlayM4_Stop(PORT);
  215.  
  216.     if(!m_bPlaying)    
  217.  
  218.     {
  219.  
  220.         SetStopState();
  221.  
  222.         if(m_bStreamType)
  223.  
  224.             ResetEvent(m_hEventInput);
  225.  
  226.     }
  227.  
  228.     
  229.  
  230. }

C#     Code:

  1.  
  2.         //是否暂停
  3.  
  4.         private bool isPause;
  5.  
  6.         /// <summary>
  7.  
  8.         /// 播放
  9.  
  10.         /// </summary>
  11.  
  12.         /// <param name="sender"></param>
  13.  
  14.         /// <param name="e"></param>
  15.  
  16.         private void btnPlay_Click(object sender, EventArgs e)
  17.  
  18.         {
  19.  
  20.             if (!string.IsNullOrEmpty(m_strPlayFileName))
  21.  
  22.             {
  23.  
  24.                 //是否暂停->播放
  25.  
  26.                 if (isPause)
  27.  
  28.                 {
  29.  
  30.                     HikPlayer.Hik_PlayM4_Pause(PORT, false);
  31.  
  32.                     isPause = false;
  33.  
  34.                 }
  35.  
  36.                 else
  37.  
  38.                     OpenFile();
  39.  
  40.             }
  41.  
  42.         }
  43.  
  44.         /// <summary>
  45.  
  46.         /// 暂停
  47.  
  48.         /// </summary>
  49.  
  50.         /// <param name="sender"></param>
  51.  
  52.         /// <param name="e"></param>
  53.  
  54.         private void btnPause_Click(object sender, EventArgs e)
  55.  
  56.         {
  57.  
  58.             HikPlayer.Hik_PlayM4_Pause(PORT, true);
  59.  
  60.             isPause = true;
  61.  
  62.         }
  63.  
  64.         /// <summary>
  65.  
  66.         /// 停止
  67.  
  68.         /// </summary>
  69.  
  70.         /// <param name="sender"></param>
  71.  
  72.         /// <param name="e"></param>
  73.  
  74.         private void btnStop_Click(object sender, EventArgs e)
  75.  
  76.         {
  77.  
  78.             HikPlayer.Hik_PlayM4_Stop(PORT);
  79.  
  80.             HikPlayer.Hik_PlayM4_CloseFile(PORT);
  81.  
  82.             HikPlayer.Hik_PlayM4_RealeseDDraw();
  83.  
  84.             pVideo.Invalidate(true);
  85.  
  86.         }

代码说明:

1.     关于变量PORT、m_strPlayFileName和方法OpenFile可以看上篇文章的代码。

2.     注意Hik_PlayM4_Pause的第二个参数用法。

1.2     快进/慢进

VC++ Code:

  1.  
  2. //////////////////////////////////////////////////////////////////////////////
  3.  
  4. //Funtion: Fast
  5.  
  6. //////////////////////////////////////////////////////////////////////////////
  7.  
  8. void CPlayerDlg::OnFastForward() 
  9.  
  10. {
  11.  
  12.     // TODO: Add your control notification handler code here
  13.  
  14.     //Throw B-Frame ,improve the performance;
  15.  
  16.     
  17.  
  18.     if(Hik_PlayM4_Fast(PORT))
  19.  
  20.     {
  21.  
  22.         m_nSpeed++;
  23.  
  24.         if(m_nSpeed>0)
  25.  
  26.             OnThrow2();
  27.  
  28.         SetFastForwardState();        
  29.  
  30.     }    
  31.  
  32. }
  33.  
  34. //////////////////////////////////////////////////////////////////////////////
  35.  
  36. //Funtion: Slow;
  37.  
  38. //////////////////////////////////////////////////////////////////////////////
  39.  
  40. void CPlayerDlg::OnFastBackward() 
  41.  
  42. {
  43.  
  44.     // TODO: Add your control notification handler code here
  45.  
  46.     if(Hik_PlayM4_Slow(PORT))
  47.  
  48.     {
  49.  
  50.         m_nSpeed--;
  51.  
  52.         if(m_nSpeed<=0)
  53.  
  54.             OnThrow0();
  55.  
  56.         SetFastBackWardState();
  57.  
  58.     }
  59.  
  60. }

C#     Code:

  1.  
  2.         int m_nSpeed;
  3.  
  4.         /// <summary>
  5.  
  6.         /// 快进
  7.  
  8.         /// </summary>
  9.  
  10.         /// <param name="sender"></param>
  11.  
  12.         /// <param name="e"></param>
  13.  
  14.         private void btnFastForward_Click(object sender, EventArgs e)
  15.  
  16.         {
  17.  
  18.             if (HikPlayer.Hik_PlayM4_Fast(PORT))
  19.  
  20.             {
  21.  
  22.                 m_nSpeed++;
  23.  
  24.                 if (m_nSpeed > 0)
  25.  
  26.                     OnThrow2();
  27.  
  28.             }
  29.  
  30.         }
  31.  
  32.         /// <summary>
  33.  
  34.         /// 慢放
  35.  
  36.         /// </summary>
  37.  
  38.         /// <param name="sender"></param>
  39.  
  40.         /// <param name="e"></param>
  41.  
  42.         private void btnFastBackward_Click(object sender, EventArgs e)
  43.  
  44.         {
  45.  
  46.             //慢速播放
  47.  
  48.             if (HikPlayer.Hik_PlayM4_Slow(PORT))
  49.  
  50.             {
  51.  
  52.                 //timer1.Interval
  53.  
  54.                 m_nSpeed--;
  55.  
  56.                 if (m_nSpeed <= 0)
  57.  
  58.                     OnThrow0();
  59.  
  60.             }
  61.  
  62.         }
  63.  
  64.         public void OnThrow0()
  65.  
  66.         {
  67.  
  68.             HikPlayer.Hik_PlayM4_ThrowBFrameNum(PORT, 0);
  69.  
  70.         }
  71.  
  72.         public void OnThrow2()
  73.  
  74.         {
  75.  
  76.             HikPlayer.Hik_PlayM4_ThrowBFrameNum(PORT, 2);
  77.  
  78.         }

代码说明:

1.     注意关于这两个函数API的说明:

Hik_PlayM4_Fast:快速播放,每次调用将使当前播放速度加快一倍,最多调用4次;要恢复正常播放调用Hik_PlayM4_Play(),从当前位置开始正常播放。

Hik_PlayM4_Slow:慢速播放,每次调用将使当前播放速度慢一倍;最多调用4次;要恢复正常播放调用Hik_PlayM4_Play。

1.3     开始/末尾

VC++ Code:

  1.  
  2. ///////////////////////////////////////////////////////////////////////////////
  3.  
  4. //Funtion:Locate to the file head.
  5.  
  6. //////////////////////////////////////////////////////////////////////////////
  7.  
  8. void CPlayerDlg::OnGotoStart() 
  9.  
  10. {
  11.  
  12.     // TODO: Add your control notification handler code here
  13.  
  14.     if(m_bFileRefCreated)
  15.  
  16.         Hik_PlayM4_SetCurrentFrameNum(PORT,0);
  17.  
  18.     else
  19.  
  20.         Hik_PlayM4_SetPlayPos(PORT,0);
  21.  
  22. }
  23.  
  24. ///////////////////////////////////////////////////////////////////////////////
  25.  
  26. //Funtion:Locate to the end.
  27.  
  28. //////////////////////////////////////////////////////////////////////////////
  29.  
  30. void CPlayerDlg::OnGotoEnd() 
  31.  
  32. {
  33.  
  34.     // TODO: Add your control notification handler code here
  35.  
  36.     if(m_bFileRefCreated)
  37.  
  38.     {
  39.  
  40.         //Note: May create many WM_FILE_END message. The best way is to synchronize the option;
  41.  
  42.         
  43.  
  44.         int nEndFrame=m_nTotalFrames;
  45.  
  46.         while(!Hik_PlayM4_SetCurrentFrameNum(PORT,nEndFrame--))
  47.  
  48.         {
  49.  
  50.             //TRACE("FrameNum is :%d\n",nEndFrame);
  51.  
  52.             if(nEndFrame==0)
  53.  
  54.                 break;
  55.  
  56.         }
  57.  
  58.     }
  59.  
  60.     else
  61.  
  62.         Hik_PlayM4_SetPlayPos(PORT,1);
  63.  
  64. }

C#     Code:

  1.  
  2.         /// <summary>
  3.  
  4.         /// 开始位置
  5.  
  6.         /// </summary>
  7.  
  8.         /// <param name="sender"></param>
  9.  
  10.         /// <param name="e"></param>
  11.  
  12.         private void btnGotoStart_Click(object sender, EventArgs e)
  13.  
  14.         {
  15.  
  16.             HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 0);
  17.  
  18.         }
  19.  
  20.         /// <summary>
  21.  
  22.         /// 末尾位置
  23.  
  24.         /// </summary>
  25.  
  26.         /// <param name="sender"></param>
  27.  
  28.         /// <param name="e"></param>
  29.  
  30.         private void btnGotoEnd_Click(object sender, EventArgs e)
  31.  
  32.         {
  33.  
  34.             HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 1);
  35.  
  36.         }

代码说明:

1.     注意Hik_PlayM4_SetPlayPos的第二个参数取值范围是0-1之间,即可以理解0是开始位置,1是结束位置;但是有一点比较奇怪,每次都会延迟3秒,即到末尾后还播放3秒钟!

二、截图

VC++ Code:

//////////////////////////////////////////////////////////////////
//Function:The call back funtion for capture image!
/////////////////////////////////////////////////////////////////
void CALLBACK DisplayCBFun(long nPort,\
                           char * pBuf,long nSize,\
                           long nWidth,long nHeight,\
                           long nStamp,long nType,long nReceaved)
{
    if(!g_bCapPic)
        return;
    CString csFile;
    csFile.Format("capture%02d.bmp",pic);
    /*    switch(nType)
    {
    case T_UYVY:
    csFile="uyvy.bmp";
    break;
    case T_YV12:
    csFile="yv12.bmp";
    break;
    case T_RGB32:
    csFile="rgb.bmp";
    break;
    default: 
    return ;
}*/
    //Note:this funtion is slow,so if you want to save as a .bmp file,don't call! 
    if(!Hik_PLayM4_ConvertToBmpFile(pBuf,nSize,nWidth,nHeight,nType,csFile.GetBuffer(csFile.GetLength())))
    {
        CString csErr;
        csErr.Format("Convert to bmp faild(%d).",Hik_PlayM4_GetLastError(nPort));
        AfxMessageBox(csErr);
    }
    pic++;
    g_bCapPic=FALSE;
    
}

C#     Code:

  1.  
  2.         DisplayCBFun DisCB;
  3.  
  4.         /// <summary>
  5.  
  6.         /// 截图
  7.  
  8.         /// </summary>
  9.  
  10.         /// <param name="sender"></param>
  11.  
  12.         /// <param name="e"></param>
  13.  
  14.         private void btnCapImage_Click(object sender, EventArgs e)
  15.  
  16.         {
  17.  
  18.             DisCB = new DisplayCBFun(DisplayCBFun);
  19.  
  20.             HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, DisCB);
  21.  
  22.         }
  23.  
  24.         /// <summary>
  25.  
  26.         /// 截图回调函数
  27.  
  28.         /// </summary>
  29.  
  30.         /// <param name="nPort"></param>
  31.  
  32.         /// <param name="pBuf"></param>
  33.  
  34.         /// <param name="nSize"></param>
  35.  
  36.         /// <param name="nWidth"></param>
  37.  
  38.         /// <param name="nHeight"></param>
  39.  
  40.         /// <param name="nStamp"></param>
  41.  
  42.         /// <param name="nType"></param>
  43.  
  44.         /// <param name="nReceaved"></param>
  45.  
  46.         public void DisplayCBFun(int nPort, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved)
  47.  
  48.         {
  49.  
  50.             if (HikPlayer.Hik_PLayM4_ConvertToBmpFile(pBuf, nSize, nWidth, nHeight, nType, string.Format("C:\\capture{0}.bmp", nPort)))
  51.  
  52.             {
  53.  
  54.                 MessageBox.Show("转换bmp失败!");
  55.  
  56.             }
  57.  
  58.             //停止回调
  59.  
  60.             HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, null);
  61.  
  62.         }

代码说明:

1.     这里和源代码有点出入,他用的是g_bCapPic变量来控制是否捕获图片,我用的是设置委托实例和null来达到。API说明:设置抓图回调函数;注意要尽快返回,如果要停止回调,可以把回调函数指针DisplayCBFun设为NULL。

结束

现在在做语音部分,受阻中...

【转】C# 视频监控系列(13):H264播放器——控制播放和截图的更多相关文章

  1. C# 视频监控系列:学习地址汇总

    原文地址:http://www.cnblogs.com/over140/archive/2009/04/07/1429308.html 前言 对于视频监控系统大家应该是不陌生的,实施的路况信息.地铁. ...

  2. 【转】C# 视频监控系列(12):H264播放器——播放录像文件

    原文地址:http://www.cnblogs.com/over140/archive/2009/03/23/1419643.html?spm=5176.100239.blogcont51182.16 ...

  3. 百度播放器SDK 播放MP4格式视频有声音无画面问题解决

    此处为记录解决过程. 所链接使用的MP4格式视频为codec id是mp4v-20.使用手机自带播放器可以播放,使用百度云媒体播放器不能无画面.经调试,Android Baidu-Cloud-Play ...

  4. java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。

    public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...

  5. phongap开发中安卓平台上如何调用第三方播放器来播放HLS视频

    前文曾经讲了关于在安卓平台上利用phonegap开发播放HLS的解决方案,其实最好的方案就是自己针对HLS视频开发自己的播放器,但是开发播放器是一个浩大的工程,必须对原生安卓开发非常熟悉,并且对视频播 ...

  6. iOS 多个播放器同时播放,双击全屏,单击退出全屏

    前言:公司需求如下:点击一个按钮播放一个视频,最多同时播放4个:双击某视频让其全屏,单击再恢复原来的样子.IOS的播放器有两种,MPMoviePlayerController,AVAudioPlaye ...

  7. IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流

    因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP.近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起! ...

  8. 利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_75 众所周知,在视频直播领域,有不同的商家提供各种的商业解决方案,其中比较靠谱的服务商有阿里云直播,腾讯云直播,以及又拍云和网易云 ...

  9. 解决Ubuntu14.04下Clementine音乐播放器不能播放wma文件的问题

    参考:Ubuntu 14.04 安装深度音乐的方法 问题描述:播放wma文件时提示"GStreamer插件未安装". 解决方法:安装gstreamer-ffmpeg插件即可解决问题 ...

随机推荐

  1. BZOJ 1123 [POI2008]BLO(Tarjan算法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1123 [题目大意] Byteotia城市有n个towns,m条双向roads. 每条r ...

  2. 【Trie】【kd-tree】计蒜客17122 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 I. Barty's Computer

    题意:2种操作:①往集合里添加一个串 ②给你四个小串a b c d,问你集合里有几个串S满足S=a+S1+b+c+S2+d的形式.S1 S2可以为空,并且a+S1+b=c+S2+d. 就搞四颗Trie ...

  3. 中间件和auth模块

    中间件 1.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用 ...

  4. 激活Debian 7 的桌面(把图标放在桌面上)

    转:http://www.acyoo.com/archives/3017.html Debian 7的默认桌面是Gnome 3,  刚装好时无法在桌面进行任何操作,不过只需要设置一下就可以了: 左上角 ...

  5. ER TO SQL语句

    ER TO SQL语句的转换,在数据库设计生命周期的位置如下所示. 一.转换的类别 从ER图转化得到关系数据库中的SQL表,一般可分为3类: 1)转化得到的SQL表与原始实体包含相同信息内容.该类转化 ...

  6. checkbox复选框居中

    选项框居中 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  7. IIS_未能映射路径“/”。

      解决方法: 使用托管管道默认是为[经典]的应用程序池

  8. !!! # @ --- ODATA 云驱动 --- 数据库发布 RESTFUL API

    Cloud Drivers   ODATA 云驱动   http://www.cdata.com/cloud/ Makes on-premise & cloud data sources ea ...

  9. Java9 modules (Jigsaw)模块化迁移

    要点 通过模块化的方式开发应用程序,实现更好的设计,如关注点分离和封装性. 通过Java平台模块化系统(JPMS),开发者可以定义他们的应用程序模块,决定其他模块如何调用他们的模块,以及他们的模块如何 ...

  10. iOS:UIResponser控件的介绍(响应者)

    UIResponser响应者控件   知识: 在iOS中不是任何对象都能处理事件,只有继承了UIResponser的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication,UIV ...