XDL Manual

XDL VideoView È°¿ë µÎ¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

 

 

NXVideoView¸¦ È°¿ëÇÏ¿© µ¿¿µ»ó Ç÷¹À̾ ±¸ÇöÇØ º¾´Ï´Ù.

±âº»ÀûÀÎ µ¿¿µ»ó Ç÷¹ÀÌ¾î ±â´ÉÀ» ¼öÇàÇÕ´Ï´Ù.

 

 

2017. 01.

¼öÁ¤ 2019. 02.

 

 

¸ñÂ÷

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 2010À» ½ÇÇàÇÑ´Ù.

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

1.1.3     [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚ¿¡¼­ ¿ÞÂÊÀÇ ÅÛÇø´ â¿¡¼­ ¡°Visual C#¡±À» ¼±ÅÃÇÏ°í, ´ëÈ­»óÀÚ Áß°£ÀÇ ¸ñ·Ï¿¡¼­ ¡°Windows Forms ÀÀ¿ë ÇÁ·Î±×·¥¡±À» ¼±ÅÃÇÑ´Ù. ÇÁ·ÎÁ§Æ®ÀÇ À̸§(XDL_VideoView2)À» ÀÔ·ÂÇÏ°í [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚÀÇ ¡°È®ÀΡ± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

1.1.4     [µµ±¸»óÀÚ]ÀÇ [Ç׸ñ¼±ÅÃ]À» ¼±ÅÃÇÑ´Ù.

[µµ±¸ »óÀÚ] âÀÇ ¡°ÀϹݡ±¿¡¼­ ¸¶¿ì½º ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ¿© »ý¼ºµÇ´Â Æ˾÷¸Þ´º¿¡¼­ ¡°Ç׸ñ ¼±Åá± ¸Þ´º¸¦ ¼±ÅÃÇÑ´Ù.

 

 

¸Þ´º¸¦ ¼±ÅÃÇÏ¸é ¾Æ·¡¿Í °°ÀÌ [µµ±¸ »óÀÚ Ç׸ñ ¼±ÅÃ] ´ëÈ­»óÀÚ°¡ ³ªÅ¸³ª¸ç, ´ëÈ­»óÀÚ ¾Æ·¡ÂÊ¿¡ ÀÖ´Â ¡°Ã£¾Æº¸±â¡± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

¿­±â ´ëÈ­»óÀÚ¿¡¼­ ¡°C:\Pixoneer\XDL1.2\bin\NXVideo.dll¡± ÆÄÀÏÀ» ¼±ÅÃÇÑ ÈÄ ¡°¿­±â¡±¸¦ Ŭ¸¯ÇÏ°í, [µµ±¸ »óÀÚ Ç׸ñ ¼±ÅÃ] ´ëÈ­»óÀÚÀÇ ¡°È®ÀΡ± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

 

.Net Framework ±¸¼º¿ä¼Ò ÅÇ¿¡ ´Ù¾çÇÑ ·¹À̾î¿Í NXVideoView°¡ ¼³Á¤µÈ´Ù. ¡°È®ÀΡ±¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

 [µµ±¸»óÀÚ] ¿¡ NXVideoLayerOverlay°ú NXVideoView°¡ Ãß°¡µÊÀ» È®ÀÎÇÑ´Ù.

 

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

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

 

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

 

1.2    Driverº¹»çÇϱâ

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

 

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

 

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

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

 

 

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

1.3.1      [µµ±¸»óÀÚ]ÀÇ  MenuStripÀ» ¼±ÅÃÇÏ°í Form1ÀÇ »ó´ÜºÎ¿¡ µå·¡±×ÇÏ¿© À§Ä¡½ÃŲ´Ù.

 

1.3.2      ¸Þ´º¿¡ ´ÙÀ½°ú °°ÀÌ [File]-[Open]À» ÀÔ·ÂÇÏ¿© »ý¼ºÇÑ´Ù.

 

1.4    PlayerÄÁÆ®·Ñ »ý¼ºÇϱâ

1.4.1     µ¿¿µ»ó Ç÷¹À̾ À§ÇØ Play, Stop, Pause±â´É°ú ÁøÇà·üÀ» Ç¥½ÃÇÏ´Â ½ºÅ©·Ñ ±â´ÉÀ» ±¸ÇöÇϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ µðÀÚÀÎÀ» ¼öÇàÇÑ´Ù. ¸ÕÀú TableLayoutPanelÀ» ÇϺο¡ Docking½ÃÅ°°í 3°³ÀÇ ColumnÀ¸·Î ±¸¼ºÇÏ¿© ¹öÆ°°ú ½ºÅ©·Ñ ¹× labelÀ» ÀÌ¿ëÇÏ¿© ´ÙÀ½°ú °°ÀÌ È­¸éÀ» ±¸¼ºÇÑ´Ù. È­¸éÀ» ±¸¼ºÇÏ´Â ¹æ¹ýÀº C# ÄÁÆ®·Ñ¿¡ ´ëÇÑ ³»¿ëÀ¸·Î ¿©±â¼­´Â »ý·«ÇÑ´Ù.

 

 

1.5    NXVideoViewÄÁÆ®·Ñ ¿Ã¸®±â

1.5.1     [µµ±¸»óÀÚ]-[ÀϹÝ]¿¡¼­ NXVideoView¸¦ µå·¡±×ÇÏ¿© Form1¿¡ ¿Ã·Á ³õ´Â´Ù. NXVideoViewÄÁÆ®·ÑÀÇ [ºÎ¸ðÄÁÅ×À̳ʿ¡¼­ µµÅ·]¹öÆ°À» ´­·¯ µµÅ·½ÃŲ´Ù. ¶ÇÇÑ NXVideoOverlayÄÁÆ®·ÑÀ» NXVideoView ÄÁÆ®·Ñ À§¿¡ µå·¡±×ÇÏ¿© ¿Ã·Á³õ´Â´Ù.

 

 

1.5.2     NXVideoView¸¦ [ºÎ¸ðÄÁÅ×À̳ʿ¡ µµÅ·]À» ´­·¯ FullÈ­¸éÀ¸·Î È®Àå½ÃŲ´Ù.

 

1.5.3     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. ¾Æ·¡¿Í °°ÀÌ NXVideoViewÄÁÆ®·ÑÀÌ Á¸ÀçÇÏ´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ´Ù.

 

 

1.5.4      ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù.

 

1.6    µ¿¿µ»ó ¿­±â ±â´É ±¸Çö

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

private void toolStripMenuOpen_Click(object sender, EventArgs e)
{

}

 

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

using Pixoneer.NXDL;
using Pixoneer.NXDL.NXVideo;

 

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

enum VideoAction { STOP, PLAYING, PAUSED }

struct VideoState
{
    public XVideo video;   // ÆÄÀÏÀ̳ª ³×Æ®¿öÅ©·ÎºÎÅÍ ÀԷµǴ 
// ½ºÆ®¸®¹Öµ¥ÀÌÅ͸¦ Á¦¾îÇÏ´Â ±â´ÉÀ» ¼öÇàÇÒ °´Ã¼ ¼±¾ð
    public XVideoChannel videoChannel;    // µ¿¿µ»ó °³Ã¼¿¡ Æ÷ÇÔµÈ Ã¤³Î °´Ã¼ ¼±¾ð
    public string videoFilePath;          // µ¿¿µ»ó ÆÄÀÏ °æ·Î 
public VideoAction action;            // ºñµð¿À Ç÷¹ÀÌ »óŸ¦ Á¤ÀÇÇÏ´Â °´Ã¼ ¼±¾ð
}

private XVideoIO m_videoIO = null;        // µ¿¿µ»óÀÇ ÀÔÃâ·ÂÀ» ´ã´çÇÒ °´Ã¼ ¼±¾ð
private VideoState VS;                      // ºñµð¿À »óŸ¦ °ü¸®ÇÏ´Â °´Ã¼ ¼±¾ð

 

1.6.4     Form1»ý¼ºÀÚ¿¡¼­ XVideoIOÀÇ °´Ã¼ »ý¼º ¹× VideoState¿¡ ´ëÇÑ ÃʱâÈ­¸¦ ¼öÇàÇÑ´Ù. ¶ÇÇÑ ÇÁ·Î±×·¥ Á¾·á½Ã¿¡ ¸Þ¸ð¸® °ü¸® µîÀ» À§ÇØ NXVideoViewÄÁÆ®·ÑÀÇ ÃʱâÈ­¸¦ ¼öÇàÇÑ´Ù.

public Form1()
{
    InitializeComponent();
    m_videoIO = new XVideoIO(); // VideoIO¸¦ »ý¼º
    
    VideoInit();
    nxVideoLayerOverlay1.LayerVisible = true;
}

private void VideoInit()
{
    // VideoStateÀÇ ÃʱâÈ­
    VS.video = null;   
    VS.videoChannel = null;    
    VS.videoFilePath = string.Empty;
    VS.action = VideoAction.STOP;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // µ¿¿µ»ó ä³Î Á¤º¸ ÃʱâÈ­
    nxVideoView1.ResetVideoChannel();

    if (VS.video != null)
    {
        // µ¿¿µ»ó °´Ã¼ Close
        VS.video.Close();
        VS.video = null;
    }

    if (m_videoIO != null)
    {
        // µ¿¿µ»ó ÀÔÃâ·Â °´Ã¼ Dispose
        m_videoIO.Dispose();
    }
}

 

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

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

    if (openFileDialog.ShowDialog() != DialogResult.OK) return;

    string videoPath = openFileDialog.FileName;

    // µ¿¿µ»ó ÆÄÀÏÀÇ Á¸Àç À¯¹« üũ
    if (System.IO.File.Exists(videoPath) == false)
    {
        MessageBox.Show(this, "ÇØ´ç °æ·Î¿¡ ¿µ»óÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.", "¿À·ù");
        return;
    }

// ÆÄÀÏ °æ·Î¸¦ ÀúÀåÇÑ´Ù.
    VS.videoFilePath = videoPath;

    // µÕ¿µ»óÀÇ Àç»ý»óÅ°¡ ÁßÁö°¡ ¾Æ´Ò °æ¿ì µ¿¿µ»ó Àç»ý ÁßÁö
    OnStop();

    // µ¿¿µ»ó ½ºÆ®¸®¹Ö ȯ°æÀ» »ý¼º½ÃŲ´Ù.
    OnOpen();

    // µ¿¿µ»óÀ» Play ½ÃŲ´Ù.
    OnPlay();
}

 

1.6.6     OnOpenÇÔ¼ö¿¡ µ¿¿µ»óÀ» PlayÇϱâ À§ÇØ VS.videoFilePath¿¡ ¼³Á¤µÈ ÆÄÀÏ °æ·Î¸¦ ÅëÇØ NXVideoViewÄÁÆ®·ÑÀ» XVideoChannel·Î ÃʱâÈ­ ½ÃŲ´Ù.

// µ¿¿µ»ó ÆÄÀÏ ¿­±â
public void OnOpen()
{
    try
    {
        string strError = null;
        // µ¿¿µ»ó ½ºÆ®¸² Á¤º¸ °¡Á®¿À±â
        VS.video = m_videoIO.OpenFile(VS.videoFilePath, "XFFMPDRIVER", 
out strError);

        if (VS.video == null)
        {
            MessageBox.Show(this, "µ¿¿µ»ó Àç»ý¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. ÆÄÀÏÀ» È®ÀÎÇØÁֽʽÿÀ.",
 "ÆÄÀÏ ¿­±â");
            return;
        }

        // ´ÙÁß Ã¤³ÎÀ» °¡Áø µ¿¿µ»ó °´Ã¼ÀÇ Channel À妽º
        int nIdxChannel = 0;

        // µ¿¿µ»ó ºä¿¡ Àç»ýÇÒ µ¿¿µ»ó ä³ÎÀ» ¼ºÁ¤
        nxVideoView1.SetVideoChannel(VS.video, nIdxChannel);

        // ÀÔ·Â À妽º¿¡ ÇØ´çÇÏ´Â ChannelÀ» °¡Á®¿À±â
        VS.videoChannel = VS.video.GetChannel(nIdxChannel);

        // GetChannel¿¡ ½ÇÆÐÇÒ °æ¿ì Null °´Ã¼°¡ returnµÇ¸ç, ±×¿¡ ´ëÇÑ ¿¹¿Üó¸®
        if (VS.videoChannel == null)
        {
            MessageBox.Show(this, "µ¿¿µ»ó Àç»ý¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. ÆÄÀÏÀ» È®ÀÎÇØÁֽʽÿÀ.",
 "ÆÄÀÏ ¿­±â");
            return;
        }

        // µ¿¿µ»ó °´Ã¼¿¡ Æ÷ÇÔµÈ Channel °´Ã¼ Áß ÇØ´ç Channel °´Ã¼¸¦ È°¼ºÈ­
        // È°¼ºÈ­µÈ °´Ã¼¸¸ ½ºÆ®¸®¹ÖÀÌ ¼öÇà
        VS.videoChannel.Activate();

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
        MessageBox.Show(this, "Àç»ý ½ÇÆÐ!", "µ¿¿µ»ó");
        VS.action = VideoAction.STOP;
    }
}

 

1.6.7     µ¿¿µ»óÀ» Play½ÃÅ°µµ·Ï Áö½ÃÇÏ´Â OnPlay, PlayµÇ°í ÀÖ´Â µµÁß¿¡ ºñµð¿À¸¦ ¸ØÃß°í ÃʱâÈ­ ½ÃÅ°´Â OnStop, PlayµÇ°í ÀÖ´Â µµÁß¿¡ Pause ½ÃÅ°´Â OnPauseÇÔ¼ö¸¦ ±¸ÇöÇÑ´Ù.

private void OnPlay()
{
    if (VS.action == VideoAction.PAUSED)  // µ¿¿µ»óÀÌ ÁßÁö »óÅ°¡ ¾Æ´Ò °æ¿ì
    {
         VS.videoChannel.Resume();        // µ¿¿µ»ó ä³Î Resume
         VS.action = VideoAction.PLAYING;
    }
    else  if (VS.action == VideoAction.STOP)   // µ¿¿µ»óÀÌ ÁßÁö »óÅÂÀÏ °æ¿ì
    {
        // µ¿¿µ»ó ChannelÀ» óÀ½ºÎÅÍ Àç»ýÇϵµ·Ï Play ½ÅÈ£ ¼³Á¤
        VS.videoChannel.Play();
        VS.action = VideoAction.PLAYING;
    }
}

// µ¿¿µ»ó ¸ØÃã ¹öÆ° Ŭ¸¯ À̺¥Æ®
private void OnPause()
{
    if (VS.action == VideoAction.PLAYING)
    {
        VS.videoChannel.Pause();         // µ¿¿µ»ó ä³Î Pause
        VS.action = VideoAction.PAUSED;
    }
}

// µ¿¿µ»ó Á¤Áö¹öưŬ¸¯ À̺¥Æ®
public void OnStop()
{
    if (VS.videoChannel != null)
    {
        // Àç»ý Frame Buffer¸¦ »èÁ¦
        VS.videoChannel.ClearFrameBuffer();
        // µ¿¿µ»ó Àç»ý ½ºÅ©¸°À» °»½ÅÇÑ´Ù.
        nxVideoView1.RefreshScreen();
        // µ¿¿µ»ó Àç»ý ÁßÁö
        VS.videoChannel.Stop();
    }

    // µ¿¿µ»ó ä³Î Á¤º¸ ÃʱâÈ­
    nxVideoView1.ResetVideoChannel();

    if (VS.video != null)
    {
        // µ¿¿µ»ó °´Ã¼ Close
        VS.video.Close();
        VS.video = null;
    }

    VS.action = VideoAction.STOP;
}

 

1.6.8     Form1¿¡ ÀÖ´Â button_Play, button_Pause, button_StopÀ» ´­·¶À» ¶§ ¼öÇàµÇ´Â Event±â´ÉÀ» ±¸ÇöÇÑ´Ù.

private void button_Play_Click(object sender, EventArgs e)
{
    // ºñµð¿À°¡ StopÀÎ »óÅÂÀÎ °æ¿ì ´Ù½Ã ºñµð¿À¸¦ ÀúÀåµÈ ÆÄÀÏ °æ·Î·ÎºÎÅÍ OpenÇؼ­ ¼³Á¤ÇÑ´Ù. 
    if (VS.action == VideoAction.STOP)
    {
        OnOpen();
    }

    // ¼³Á¤µÈ ºñµð¿À¸¦ PlayÇÑ´Ù.
    OnPlay();
}

private void button_Pause_Click(object sender, EventArgs e)
{
    // PlayµÇ°í ÀÖ´Â ºñµð¿À¸¦ Pause½ÃŲ´Ù.
    OnPause();
}

private void button_Stop_Click(object sender, EventArgs e)
{
    // PlayµÇ°í ÀÖ´Â ºñµð¿À¸¦ Stop½ÃŲ´Ù.
    OnStop();
}

 

1.6.9      [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. [File]-[Open]¸Þ´º¸¦ ´­·¯ stream.tsÆÄÀÏÀ» ¿¬´Ù. button_Play, button_Pause, button_Stop¹öÆ°À» ´­·¯ ±â´ÉÀ» È®ÀÎÇÑ´Ù.