WPF - XDL Tutorial

XDL VideoView È°¿ë ù¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

     

NXVideoView¸¦ È°¿ëÇÏ¿© ´Ù¾çÇÑ Æ÷¸ËÀÇ µ¿¿µ»óÀ»

µµ½ÃÇÏ´Â ±â´ÉÀ» ±¸ÇöÇÕ´Ï´Ù.

 

 

2019. 04.

 

 

¸ñÂ÷

XDL VideoView È°¿ë ù¹ø°... 1

1    »ç¿ëÇϱâ... 3

1.1    NXVideoView¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â... 3

1.2    Driverº¹»çÇϱâ... 4

1.3    ¸Þ´º »ý¼ºÇϱâ... 5

1.4    NXVideoViewÄÁÆ®·Ñ ¿Ã¸®±â... 6

1.5    µ¿¿µ»ó ¿­±â ±â´É... 6

 

 

 

 

1     »ç¿ëÇϱâ

 

1.1    NXVideoView¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â

1.1.1     Visual Studio 2015À» ½ÇÇàÇÑ´Ù.

1.1.2     ¸Þ´º [ÆÄÀÏ]-[»õ·Î ¸¸µé±â]-[ÇÁ·ÎÁ§Æ®]¸¦ ¼±ÅÃÇÑ´Ù.

 

 

1.1.3     [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚ¿¡¼­ ¿ÞÂÊÀÇ ÅÛÇø´ â¿¡¼­ ¡°Visual C#¡±À» ¼±ÅÃÇÏ°í, ´ëÈ­»óÀÚ Áß°£ÀÇ ¸ñ·Ï¿¡¼­ ¡°WPF ÀÀ¿ë ÇÁ·Î±×·¥¡±À» ¼±ÅÃÇÑ´Ù.

»ç¿ëÀÚ°¡ ¿øÇÏ´Â °æ·Î¸¦ ¼±ÅÃÇÑ ´ÙÀ½ ÇÁ·ÎÁ§Æ® À̸§À» ¡°XDL_VideoView1¡± À¸·Î ÀÔ·ÂÇÏ°í [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚÀÇ ¡°È®ÀΡ± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. ÀÌ ¹®¼­¿¡¼­´Â ´ëÈ­»óÀÚ ¿À¸¥ÂÊ ¾Æ·¡¿¡ ÀÖ´Â ¡°¼Ö·ç¼Ç¿ë µð·ºÅ͸® ¸¸µé±â¡±´Â ¼±ÅÃÇÏÁö ¾Ê°Ú´Ù. ¡°È®ÀΡ± ¹öÆ°À» ´©¸£¸é ÇÁ·ÎÁ§Æ®°¡ ±âº»ÀûÀ¸·Î »ý¼ºµÇ°í È­¸é¿¡ WindowÀ» µðÀÚÀÎÇÒ ¼ö ÀÖ´Â È­¸éÀÌ ¶á´Ù. ¸¸¾à ¾Æ·¡¿Í °°Àº Window âÀÌ »ý¼ºµÇÁö ¾ÊÀ¸¸é, [¼Ö·ç¼Ç Ž»ö±â] â¿¡¼­ MainWindow.xaml¡±¸¦ ¸¶¿ì½º ´õºíŬ¸¯À» ÇÏ¿© âÀ» ¿¬´Ù.

 

1.1.4     ¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ÇϺÎÀÇ [ÂüÁ¶]ÀÇ ¿À¸¥ÂÊ ¸¶¿ì½º Ŭ¸¯À» ÅëÇØ [ÂüÁ¶Ãß°¡]¸¦ ¼±ÅÃÇÑ´Ù.

 

 

1.1.5     [ã¾Æº¸±â]ÅÇÀ¸·Î À̵¿ÇÑ ÈÄ ¡°C:\Pixoneer\XDL1.2\bin\¡±°æ·Î·Î À̵¿ÇÑ´Ù. CtrlÅ°¸¦ ´©¸¥ ä ¡°NXDL.dll¡±, ¡°NXVideo.dll¡±À» ¼±ÅÃÇÑ ÈÄ ¡°È®ÀΡ±¹öÆ°À» ¼±ÅÃÇÑ´Ù.

1.1.6     ¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ÇϺÎÀÇ [ÂüÁ¶]Ç׿¡ NXDL, NXVideo°¡ Ãß°¡µÇ¾úÀ½À» È®ÀÎÇÑ´Ù.

1.1.7     NXVideo¸¦ È°¿ëÇϱâ À§ÇØ MainWindow.xaml â¿¡¼­ namespace¸¦ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù.

1.2    Driverº¹»çÇϱâ

Driver´Â ÇöÀç µ¥¸ð ¹öÀü¿¡¼­´Â ¼³Ä¡µÈ °æ·Î·ÎºÎÅÍ ½ÇÇà °æ·Î ÇϺηΠÁ÷Á¢ º¹»çÇÏ¿© ³Ö¾î¾ß ÇÑ´Ù. Â÷±â ¹öÀüÀº º¹»ç¸¦ ÇÏÁö ¾Ê¾Æµµ ½ÇÇàµÉ ¼ö ÀÖµµ·Ï ±¸¼ºµÈ´Ù.

 

1.2.1     XDL ¶óÀ̺귯¸®°¡ ¼³Ä¡µÈ °æ·Î(C:\Pixoneer\XDL1.2\bin)·Î À̵¿ÇÑ´Ù.

 

1.2.2     VDDriversÆú´õ¸¦ Åë°·Î º¹»çÇÏ¿© ÇöÀç ÇÁ·ÎÁ§Æ®ÀÇ ¡°¡¦..\XDL_VideoView1\bin\Debug¡±Æú´õ ÇϺο¡ º¹»çÇÏ¿© ³Ö´Â´Ù.

1.2.3     F5Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÈ´Ù.

 

1.3    ¸Þ´º »ý¼ºÇϱâ

1.3.1     MainWindow.xamlâ¿¡¼­ ±âº»À¸·Î »ý¼ºµÈ Grid ·¹À̾ƿô¿¡ Grid.RowDefinitionÀ» ÀÌ¿ëÇÏ¿© µÎ °³ÀÇ RowÀ» »ý¼ºÇÑ´Ù. µµ±¸ »óÀÚ¿¡¼­ MenuÄÁÆ®·ÑÀ» ²ø¾î´Ù°¡ ù ¹ø° Cell¿¡ ¹èÄ¡ÇÏ°í ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ¿© MenuItem Ãß°¡ÇÑ´Ù.


 

MenuItemÀÌ Ãß°¡µÈ °ÍÀ» È®ÀÎÇÑ µÚ [¼Ó¼º]â¿¡¼­ Header¿¡ ¡°File¡±°ú ¡°Tools¡±¸¦ °¢°¢ ÀÔ·ÂÇÑ´Ù

 

 

¾Æ·¡¿Í °°Àº ¸Þ´º¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

 

 

[File] ÇϺο¡ Ãß°¡ÀûÀ¸·Î ¸Þ´º¸¦ »ý¼ºÇÏ·Á°í ÇÑ´Ù. [File]¿¡ ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ°í MenuItemÀ» Ãß°¡ÇÑ´Ù. [File] ÇϺο¡ MenuItemÀÌ »ý¼ºµÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

 

»ý¼ºµÈMenuItemÀÇ [¼Ó¼º]â¿¡¼­ HeaderÀ» ¡°Open¡±À¸·Î ÀÔ·ÂÇÑ´Ù. MenuItemÀÇ À̸§Àº ¾Æ·¡ÀÇ Ç¥¸¦ Âü°íÇÏ¿© ÀÔ·ÂÇÑ´Ù.

 

 

¾Æ·¡¿Í °°Àº ¸Þ´º°¡ ±¸¼ºµÇ¾úÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

 

¾Æ·¡ÀÇ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇϵµ·Ï ÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_File

 

MenuItem

_Open

openFileMenuItem

 

1.3.2      À̾ ¸Þ´º¿¡ µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î MenuItemÀ» »ç¿ëÇØ [Tool] – [Play], [Pause], [Stop], [Resume]À» »ý¼ºÇÏ°í À̸¦ È®ÀÎÇÑ´Ù.

 

 

¾Æ·¡ÀÇ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

_Tools

 

MenuItem

_Play

playToolsMenuItem

MenuItem

_Pause

pauseToolsMenuItem

MenuItem

_Stop

stopToolsMenuItem

MenuItem

_Resume

resumeToolsMenuItem

 

¶ÇÇÑ XAMLâÀÌ ¾Æ·¡¿Í °°ÀÌ »ý¼ºµÊÀ» ¾Ë ¼ö ÀÖ´Ù..

 

<Grid>
      <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"/>
      </Grid.RowDefinitions>
        <Menu Grid.Row="0">
            <MenuItem Header="_File" Margin="5,5,4,5">
                <MenuItem x:Name="openFileMenuItem" Header="_Open"/>
            </MenuItem>
            <MenuItem Header="_Tools">
                <MenuItem x:Name="playToolsMenuItem" Header="_Play"/>
                <MenuItem x:Name="pauseToolsMenuItem" Header="_Pause"/>
                <MenuItem x:Name="stopToolsMenuItem" Header="_Stop"/>
                <MenuItem x:Name="resumeToolsMenuItem" Header="_Resume"/>
            </MenuItem>
        </Menu>
</Grid>

 

1.4    NXVideoViewÄÁÆ®·Ñ Ãß°¡Çϱâ

1.4.1     µÎ ¹ø° Cell¿¡ Grid¸¦ ¹èÄ¡ÇÏ°í WindowsFormsHost ÄÁÆ®·ÑÀ» µµ±¸»óÀڷκÎÅÍ ²ø¾î¼­ »ý¼ºÇϰųª XAML â¿¡ ÀÔ·ÂÇÏ¿© »ý¼ºÇÑ´Ù. ÀÌ´Â Window forms¸¦ Hosting ÇØÁÖ´Â °³Ã¼À̸ç Window Forms ControlÀ» »ç¿ëÇÒ ¶§ ÀÌ¿ëµÈ´Ù. (WindowFormIntegration¿Í System.Window.FormsÀ» ¾î¼Àºí¸®¿¡ ´ëÇÑ ÂüÁ¶ Ãß°¡¸¦ ÇÑ´Ù.)

 

 

»¡°£»ö ¿øÀ» Ŭ¸¯ÇÑ »óÅ·ΠWindowFormsHostâÀÇ Å©±â¸¦ º¯È­½ÃÄÑ µÎ ¹ø° Row Gridâ¿¡ ¸Â°Ô ¼³Á¤ÇÑ´Ù. ´ÙÀ½°ú °°Àº Window âÀ» ¾òÀ» ¼ö ÀÖ´Ù..

 

 

1.4.2     ¾Õ¼­ Ãß°¡ÇÑ namespaceÀÎ nxVideo¸¦ ÀÌ¿ëÇÏ¿© NXVideoViewÄÁÆ®·ÑÀ» ºÒ·¯¿Â´Ù. ÀÌ NXVideoViewÀÇ À̸§(Name)Àº nxVideoView1À¸·Î ÇÑ´Ù.

 

<Grid Grid.Row="1">
       <WindowsFormsHost  Margin="3,0,0,3">
           <nxVideo:NXVideoView x:Name="nxVideoView1">
       </WindowsFormsHost>
</Grid>

 

1.4.3     [F5]¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù.

 

 

1.5    µ¿¿µ»ó ¿­±â ±â´É

1.5.1     µðÀÚÀÎâ¿¡¼­ [File]-[Open]À» ´õºí Ŭ¸¯ÇÏ¿© ÇÔ¼ö¸¦ ÀÚµ¿ »ý¼ºÇÑ´Ù.

 

 

private void openFileMenuItem_Click(object sender, RoutedEventArgs e)
{

}

 

1.5.2     NXVideo°´Ã¼µéÀ» »ç¿ëÇϱâ À§Çؼ­ ´ÙÀ½°ú °°ÀÌ NXVideo ³×ÀÓ½ºÆäÀ̽º¸¦ Ãß°¡ÇÑ´Ù.

using Pixoneer.NXDL.NXVideo;

 

1.5.3     NXVideoView±¸Çö½Ã ÇÊ¿äÇÑ XVideoIO, XVideo, XVideoChannel°´Ã¼¸¦ ¼±¾ðÇÑ´Ù.

XVideoIO m_VideoIO; // VideoÀÔÃâ·Â¿¡ °üÇÑ °´Ã¼¸¦ »ý¼º. 
// XVideoIO°´Ã¼´Â XVideo°´Ã¼¸¦ »ý¼ºÇÑ´Ù.

XVideo m_Video; // XVideo°´Ã¼´Â ½ÇÁúÀûÀ¸·Î ºñµð¿À ½ºÆ®¸®¹ÖÀ» ¹Þ¾Æ¼­ ó¸®ÇÏ´Â °´Ã¼ÀÌ´Ù. 
XVideoChannel m_channel;  
// XVideoChannelÀº º¸Åë 1°³ÀÇ ÆÄÀÏ¿¡´Â 1°³ÀÇ ½ºÆ®¸®¹ÖÀÌ Á¸ÀçÇÏÁö¸¸, 
// MPEG2TS¿Í °°ÀÌ MultiChannelÀ» Áö¿øÇÏ´Â °Íµµ Á¸ÀçÇÑ´Ù.
// °á±¹ XVideoChannelÀÌ ½ºÆ®¸®¹Ö¿¡ ´ëÇÑ ÆÄ½Ì ¹× µµ½Ã¸¦ À§ÇÑ 
// ºñµð¿À Frame µ¥ÀÌÅÍ °ü¸®¸¦ ¼öÇàÇÑ´Ù.

 

1.5.4     MainWindow »ý¼ºÀÚ¿¡¼­ XVideoIOÀÇ °´Ã¼ »ý¼ºÀ» ¼öÇàÇÑ´Ù.

public MainWindow()
{
       InitializeComponent();
       m_VideoIO = new XVideoIO(); // VideoIO¸¦ »ý¼º
}

 

1.5.5     [File]-[Open]À» ´­·¶À» ¶§ »ý¼ºµÉ Open ´ëÈ­»óÀÚ¿Í ¼±ÅÃµÈ ÆÄÀÏ¿¡ ´ëÇÑ XVideo°´Ã¼¸¦ »ý¼ºÇÑ´Ù. ¶ÇÇÑ, XVideo°´Ã¼¿¡ ½ÇÁ¦ ½ºÆ®¸®¹ÖÀ» ´ã´çÇÏ´Â XVideoChannel°´Ã¼¸¦ È°¼ºÈ­(Activate) ½ÃÄÑ FrameÀ» ³»ºÎÀûÀ¸·Î »ý¼ºÇϵµ·Ï Áö½ÃÇÑ´Ù.

 

private void openFileMenuItem_Click(object sender, RoutedEventArgs e)
{
      // ÆÄÀÏ OpenÀ» ¼öÇàÇÑ´Ù.
      OpenFileDialog openFileDialog = new OpenFileDialog();
      openFileDialog.Filter = "TS file(*.ts)|*.ts||";
      openFileDialog.RestoreDirectory = true;

      Nullable<bool> result = openFileDialog.ShowDialog();      
      if (result != true) return;

// XVideoIO °´Ã¼·ÎºÎÅÍ XVideo °´Ã¼¸¦ »ý¼ºÇÑ´Ù.
      string strError = null;
      m_Video = m_VideoIO.OpenFile(openFileDialog.FileName, "XFFMPDRIVER", 
out strError);

      if (m_Video == null)
      {
            MessageBox.Show(strError);
            return;
      }

      // XVideoView °´Ã¼¿¡ XVideo °´Ã¼¿Í Muti ChannelÀÎ °æ¿ì¸¦ °í·ÁÇÏ¿© XVideo °´Ã¼
// ¾ÈÀÇ Channel¿¡ ´ëÇÑ À妽º¸¦ ¼³Á¤ÇÑ´Ù.
      int nIdxChannel = 0;
      nxVideoView1.SetVideoChannel(m_Video, nIdxChannel);

      // XVideo°´Ã¼·ÎºÎÅÍ Æ¯Á¤ À妽º¿¡ ÇØ´çÇÏ´Â ChannelÀ» ²¨³½´Ù.
      m_channel = m_Video.GetChannel(nIdxChannel);

      if (m_channel == null)
      {
            MessageBox.Show("Channel is not valid");
       }

       // ChannelÀ» È°¼ºÈ­ ½ÃÅ°°í Play½ÃŲ´Ù.
       m_channel.Activate();
}

 

1.5.6     ¸Þ´º¿¡¼­ [Play], [Pause], [Resume], [Stop]¹öÆ°À» ÅëÇØ ÀÚµ¿À¸·Î ÇÔ¼ö¸¦ »ý¼ºÇÑ´Ù.

private void playToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
      if (m_channel == null)
      {
           MessageBox.Show(" Àç»ýÀ» À§ÇÑ FileÀ» Ãß°¡ ÇϽʽÿÀ.");
      }
      else
      {
           m_channel.Play();
      }
}

private void pauseToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
      if (m_channel == null)
      {
           MessageBox.Show("Àç»ýÀ» À§ÇÑ FileÀ» Ãß°¡ ÇϽʽÿÀ.");
      }
      else
      {
           m_channel.Pause();
      }
}

private void stopToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
      if (m_channel == null)
      {
           MessageBox.Show("Àç»ýÀ» À§ÇÑ FileÀ» Ãß°¡ ÇϽʽÿÀ.");
      }
      else
      {
           m_channel.Stop();
      }
}

private void resumeToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
      if (m_channel == null)
      {
          MessageBox.Show("Àç»ýÀ» À§ÇÑ FileÀ» Ãß°¡ ÇϽʽÿÀ.");
      }
      else
      {
          m_channel.Resume();
      }
}

 

1.5.7     Á¾·á½Ã¿¡ XVideo°´Ã¼¿Í XVideoView¿Í °ü°è¸¦ ²÷±â À§Çؼ­ WindowÀÇ ¼Ó¼º¿¡¼­ WindowÀÇ Close¸¦ À§ÇÑ ÇÔ¼ö¸¦ ÀÚµ¿ »ý¼ºÇÑ´Ù.

 

 

 

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
      // Video Á¾·á½Ã¿¡ XVideoView¿Í XVideo¿ÍÀÇ °ü°è¸¦ Á¤¸®ÇÑ´Ù.
      nxVideoView1.ResetVideoChannel();
      if (m_Video != null)
           m_Video.Close();
}

1.5.8     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. ȨÆäÀÌÁö¿¡¼­ »ùÇÿµ»óÀ» ´Ù¿î ¹Þ´Â´Ù. [File]-[Open]¸Þ´º¸¦ ´­·¯ football.tsÆÄÀÏÀ» ¿¬´Ù. [Tool]-[Play], [Tool]-[Pause], [Tool]-[Resume], [Tool]-[Stop]À» ´­·¯ ±â´ÉÀ» È®ÀÎÇÑ´Ù.