//--------------------------------------------------------------------------- #include #include "AppGlobalF.h" #include "FrmCameraPlayerF.h" #include "FrmCameraFullScreenF.h" #include "FrmCameraInfoF.h" #include "FrmCameraScreenF.h" #pragma hdrstop //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "dxGDIPlusClasses" #pragma link "PasLibVlcPlayerUnit" #pragma resource "*.dfm" TFrmCameraPlayer *FrmCameraPlayer = NULL; //--------------------------------------------------------------------------- __fastcall TFrmCameraPlayer::TFrmCameraPlayer(TComponent* Owner) : TForm(Owner) { IsTerm = false; FPlay = false; FUserStop = false; FConHandle = 0; FFullScreen = false; FParent = this->Parent; PnlCamera->Tag = (int)this; FTimeChangeTick = 0; TmrReset->Enabled = false; TmrTick->Enabled = false; SetResetTimer(); FIsResetVideo = false; //mmLog->Lines->Clear(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::SetResetTimer() { if (g_AppCfg.cmraViewerResetMin > 0) { TmrReset->Interval = g_AppCfg.cmraViewerResetMin * 60 * 1000; } } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::TmrShowTimer(TObject *Sender) { TmrShow->Enabled = false; if (IsTerm) { return; } if (Installed) { PopupMenu = PopupMenu1; ImgNoData->Visible = false; //PnlName->Caption = CTLR_NMBR + ": " + NAME; PnlName->Caption = " " + NAME; Play(); } else { PasLibVlcPlayer1->Visible = false; PopupMenu = NULL; PnlCamera->Caption = " " + NAME; LoadEmptyImage(); } } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::LoadEmptyImage() { try { #if 0 String sImageFile = g_AppCfg.sEmptyImg; if (sImageFile != "") { ImgNoData->Picture->LoadFromFile(sImageFile); ImgNoData->Align = alClient; } #endif ImgNoData->Visible = true; } catch(Exception &e) { ImgNoData->Visible = true; } } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::FormShow(TObject *Sender) { Refresh(); this->FLastBounds = this->BoundsRect; // TmrShow->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::FormClose(TObject *Sender, TCloseAction &Action) { try { FUserStop = false; TmrTick->Enabled = false; Stop(); } catch(...) {} Action = caFree; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::FormDestroy(TObject *Sender) { try { FUserStop = false; TmrTick->Enabled = false; Stop(); } catch(...) {} } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::MnuConnectClick(TObject *Sender) { FPlay = false; FUserStop = false; Application->ProcessMessages(); Play(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::MnuDisconnectClick(TObject *Sender) { PasLibVlcPlayer1->Visible = false; PasLibVlcPlayer1->Refresh(); PnlCamera->Refresh(); FUserStop = true; Application->ProcessMessages(); Stop(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::AutoPlay() { TmrShow->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::CameraLog(String ALogMsg) { PnlCamera->Caption = ALogMsg; PnlCamera->Refresh(); Application->ProcessMessages(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::CameraInfo(String ALogInfo) { //lblRate->Caption = ALogInfo; //lblRate->Refresh(); Application->ProcessMessages(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::Play() { if (FPlay) return; if (PasLibVlcPlayer1->Visible) { PasLibVlcPlayer1->Visible = false; } Stop(); if (STRM_ADDR == "") { CameraLog("### ¿µ»óÁ¤º¸°¡ ¾ø½À´Ï´Ù ###"); return; } CameraLog("--- ¿µ»ó ¿¬°á Áß ---"); try { ///--udp-caching=500 --tcp-caching=500 --realrtsp-caching=500 //ffplay.exe rtsp://224.1.1.1:8086 -fflags nobuffer -flags low_delay -avioflags direct -fflags discardcorrupt //PasLibVlcPlayer1->VLC->Path = "plugins"; //PasLibVlcPlayer1->VLC->AddOption("http-caching=300"); PasLibVlcPlayer1->VLC->AddOption("live-capture-caching=300"); PasLibVlcPlayer1->VLC->AddOption("file-caching=300"); PasLibVlcPlayer1->VLC->AddOption("disk-caching=300"); PasLibVlcPlayer1->VLC->AddOption("network-caching=300"); //PasLibVlcPlayer1->VLC->AddOption("avcodec-hw=none"); //PasLibVlcPlayer1->VLC->AddOption("avcodec-hw={any,d3d11va,dxva2,none}"); //PasLibVlcPlayer1->VLC->AddOption("avcodec-threads=0"); //PasLibVlcPlayer1->VLC->AddOption("no-sout-all"); //PasLibVlcPlayer1->VLC->AddOption("sout-keep"); //PasLibVlcPlayer1->VLC->AddOption(":file-caching=300"); //PasLibVlcPlayer1->VLC->AddOption(":network-caching=300"); //PasLibVlcPlayer1->VLC->AddOption(":avcodec-hw=none"); //PasLibVlcPlayer1->VLC->AddOption("--avcodec-threads=0"); //PasLibVlcPlayer1->VLC->AddOption(":no-sout-all"); //PasLibVlcPlayer1->VLC->AddOption(":sout-keep"); PasLibVlcPlayer1->Play(STRM_ADDR); FConHandle = 1; Application->ProcessMessages(); AdjustVideoFit(); if (FConHandle > 0) { if (ImgNoData->Visible == true) { ImgNoData->Visible = false; } } //PnlName->Caption = libvlc_get_install_path(); Application->ProcessMessages(); } catch(Exception &e) { } FPlay = true; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::Stop() { TmrReset->Enabled = false; TmrTick->Enabled = false; if (!FPlay) return; FPlay = false; if (STRM_ADDR == "") { return; } CameraLog("--- ¿µ»ó ¿¬°á ÇØÁ¦ ---"); try { if (FConHandle > 0) { PasLibVlcPlayer1->Stop(); } Application->ProcessMessages(); FConHandle = 0; } catch(Exception &e) { } CameraLog("*** ¿µ»ó ¿¬°á Á¾·á ***"); FConHandle = 0; FPlay = false; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::AdjustVideoFit() { try { if (FConHandle > 0 && PasLibVlcPlayer1->IsPlay()) { String ratioData = IntToStr(PasLibVlcPlayer1->Width) + ":" + IntToStr(PasLibVlcPlayer1->Height); PasLibVlcPlayer1->SetVideoAspectRatio(ratioData); } } catch(Exception &e) { } } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::Term() { IsTerm = true; Stop(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::InitCamera(bool AInstalled, String ACtlrNmbr, String AName, String AStrmAddr, String AFullStrmAddr, int AViewMode) { Installed = AInstalled; CTLR_NMBR = ACtlrNmbr; NAME = AName; STRM_ADDR = AStrmAddr; FULL_STRM_ADDR = AFullStrmAddr; VIEW_MODE = AViewMode; Caption = NAME; PnlName->Caption = NAME; PnlCamera->Caption = AStrmAddr; FUserStop = false; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1DblClick(TObject *Sender) { FrmCameraScreen->TmrFullScreen->Enabled = false; FrmCameraScreen->FFullScreenIdx = Tag; FrmCameraScreen->TmrFullScreen->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::MnuInfoClick(TObject *Sender) { FrmCameraInfo = new TFrmCameraInfo(this); FrmCameraInfo->Edit1->Text = CTLR_NMBR; FrmCameraInfo->Edit2->Text = NAME; FrmCameraInfo->Edit3->Text = STRM_ADDR; FrmCameraInfo->Edit4->Text = FULL_STRM_ADDR; FrmCameraInfo->ShowModal(); delete FrmCameraInfo; FrmCameraInfo = NULL; } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerOpening(TObject *Sender) { // 1. Opening if (PasLibVlcPlayer1->Visible == false) { PasLibVlcPlayer1->Visible = true; PnlCamera->Refresh(); AdjustVideoFit(); } if (ImgNoData->Visible == true) { ImgNoData->Visible = false; } FTimeChangeTick = 0; //CameraInfo("PlayerOpening"); // ¿µ»óÀÌ ¿¬°áµÊ //AdjustVideoFit(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender) { // 2. Playing //CameraInfo("PlayerPlaying"); FTimeChangeTick = 0; FUserStop = false; TmrTick->Enabled = false; AdjustVideoFit(); TmrReset->Enabled = false; FIsResetVideo = false; if (g_AppCfg.cmraViewerDelaySec > 0) { TmrTick->Enabled = true; } if (g_AppCfg.cmraViewerResetMin > 0) { SetResetTimer(); TmrReset->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerTimeChanged(TObject *Sender, __int64 time) { // 3. TimeChanged FTimeChangeTick = GetTickCount(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerMediaChanged(TObject *Sender, UnicodeString mrl) { // ½ºÆ®¸®¹Ö º¯°æµÊ CameraLog("@@@ ¿µ»ó ¿¬°á Áß.. @@@"); //AdjustVideoFit(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerEncounteredError(TObject *Sender) { // ¿¡·¯°¡ ¹ß»ýÇϰí PlayerStopped À̺¥Æ®°¡ ¹ß»ýµÊ if (PasLibVlcPlayer1->Visible) { PasLibVlcPlayer1->Visible = false; } CameraLog("@@@ ¿µ»ó Ç¥Ãâ ¿À·ù @@@"); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerStopped(TObject *Sender) { if (FIsResetVideo == false) { CameraLog("@@@ ¿µ»ó Ç¥ÃâÀÌ Á¾·áµÊ @@@"); } if (FUserStop) { if (PasLibVlcPlayer1->Visible) { PasLibVlcPlayer1->Visible = false; } } FPlay = false; if (FIsResetVideo == false && FUserStop == false) { TmrShow->Enabled = false; TmrShow->Interval = 1000; TmrShow->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::TmrResetTimer(TObject *Sender) { TmrReset->Enabled = false; //CameraInfo("TmrReset"); if (FUserStop == false) { ResetVideoCamera(); } } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::ResetVideoCamera() { TmrReset->Enabled = false; FIsResetVideo = true; try { PasLibVlcPlayer1->Stop(); Application->ProcessMessages(); } catch(Exception &e) { } Application->ProcessMessages(); Application->ProcessMessages(); Application->ProcessMessages(); Application->ProcessMessages(); Application->ProcessMessages(); Application->ProcessMessages(); FTimeChangeTick = 0; try { PasLibVlcPlayer1->Play(STRM_ADDR); FConHandle = 1; } catch(Exception &e) { } Application->ProcessMessages(); Application->ProcessMessages(); } //--------------------------------------------------------------------------- void __fastcall TFrmCameraPlayer::TmrTickTimer(TObject *Sender) { TmrTick->Enabled = false; if (FUserStop == false && g_AppCfg.cmraViewerDelaySec > 0 && FTimeChangeTick > 0) { //CameraInfo("TmrTickTimer: " + String(GetTickCount() - FTimeChangeTick)); if ((GetTickCount() - FTimeChangeTick) > (g_AppCfg.cmraViewerDelaySec * 1000)) { ResetVideoCamera(); return; } } if (FUserStop == false && g_AppCfg.cmraViewerDelaySec > 0 && FTimeChangeTick > 0) { TmrTick->Enabled = true; } } //--------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position) #if 0 if (PasLibVlcPlayer1->Visible == false) { PasLibVlcPlayer1->Visible = true; PnlCamera->Refresh(); AdjustVideoFit(); } if (ImgNoData->Visible == true) { ImgNoData->Visible = false; } CameraInfo("Changed: " + String(position) + ", " + String(PasLibVlcPlayer1->GetState())); #endif #if 0 case PasLibVlcPlayer1.GetState() of plvPlayer_NothingSpecial: stateName := 'Idle'; plvPlayer_Opening: stateName := 'Opening'; plvPlayer_Buffering: stateName := 'Buffering'; plvPlayer_Playing: stateName := 'Playing'; plvPlayer_Paused: stateName := 'Paused'; plvPlayer_Stopped: stateName := 'Stopped'; plvPlayer_Ended: stateName := 'Ended'; plvPlayer_Error: stateName := 'Error'; else stateName := 'Unknown'; end; var info : string; sar_num, sar_den : LongWord; begin info := 'Aspect ratio = ' + PasLibVlcPlayer1.GetVideoAspectRatio(); if (PasLibVlcPlayer1.GetVideoSampleAspectRatio(sar_num, sar_den)) then begin info := info + ', SampleAspectRatio = ' + IntToStr(sar_num) + ':' + IntToStr(sar_den); end; MessageDlg( info, mtInformation, [mbOK], 0); end; main libvlc debug: configured with /builds/videolan/vlc/extras/package/win32/../../../configure '--enable-update-check' '--enable-lua' '--enable-faad' '--enable-flac' '--enable-theora' '--enable-avcodec' '--enable-merge-ffmpeg' '--enable-dca' '--enable-mpc' '--enable-libass' '--enable-schroedinger' '--enable-realrtsp' '--enable-live555' '--enable-shout' '--enable-goom' '--enable-sse' '--enable-mmx' '--enable-libcddb' '--enable-zvbi' '--disable-telx' '--enable-nls' '--host=i686-w64-mingw32' '--with-contrib=../contrib/i686-w64-mingw32' '--with-breakpad=https://win.crashes.videolan.org' '--enable-qt' '--enable-skins2' '--enable-dvdread' '--enable-caca' 'host_alias=i686-w64-mingw32' 'CFLAGS= -D_WIN32_WINNT=0x0502 -DWINVER=0x502 -D__MSVCRT_VERSION__=0x700 ' 'CXXFLAGS= -D_WIN32_WINNT=0x0502 -DWINVER=0x502 -D__MSVCRT_VERSION__=0x700 ' 'PKG_CONFIG=pkg-config' 'PKG_CONFIG_LIBDIR=/usr/i686-w64-mingw32/lib/pkgconfig:/usr/lib/i686-w64-mingw32/pkgconfig' #endif