본문 바로가기

C++(oF)

[of] LIB VLC 사용하기

0. 왜 VLC 인가? 

우선 윈도우용 0.9.X(3)  까지 의 내장된 ofVideoPlayer는 극히 성능이 저질이다. 720P 정도도 온전한 재생이 힘들다.

물론 대안으로 HAP 이 있다. 퍼포먼스는 보장 하지만 HAP 영상파일 자체는 매우 파일이 거대? 하며 용량이 무압축에 가깝다. 퍼포먼스를 위해 감내해야 하는 비용이 상당하다. 또한 윈도우용 WMF 코덱을 이용하는 방법이 있다. 하지만 보다 범용적이고, 그래픽 성능을 모두 발휘 할 수 있는 VLC는 잘 다루면 스트리밍 서버/ 클라이언트 까지 구현이 가능 하며, 호환성이 좋기 때문에 응용하기에 따라 맥, 리눅스 에서도 무사히 사용이 가능 하다. 심지어 관련 정보도 많이 있다. 





1. vlc 를 다운 받는다. 대상 버전은, 현재 안정 버전인 2.0.5 이다.

1) http://www.videolan.org/vlc/#download




2. vlc 에드온 https://github.com/jnakanojp/ofxVLCVideoPlayer 을 다운받는다.

1) 설명에 적혀 있듯, 몇몇 파일들이 필요 하다. 필자의 경우 원본 훼손 우려를 피하기 위해 별도의 폴더에 필요한 파일을 옮기고 필요하다면 코드를 수정한다.

- 필요항목

* plugins 폴더

* sdk 폴더

* dll 들 : axvlc.dll , libvlc.dll , libvlccore.dll , npvlc.dll (사실 libvlc 와 libvlccore 만 있어도 됨)




3. ofxVLCVideoPlayer를 포함한 openframeworks 프로젝트를 생성 한다. 

1) 빌드를 한다음 bin 폴더에 이전에 따로 보관했던 [plugins 폴더]와 [  libvlc.dll , libvlccore.dll ] 을 복사한다.




4. 생성된 프로젝트에 Properties를 열어 VLC 라이브러리를 붙여 본다. 

(필자의 경우 [C:\CppLibs\vlc] 에 sdk 를 복사해서 사용 하였다. )


1) [C/C++] -> [Additional Include Directories] : 

* C:\CppLibs\vlc\sdk\include 추가

* C:\CppLibs\vlc\sdk\include\vlc\plugins 추가


2) [Linker] -> [Additional Library Directories] 

* C:\CppLibs\vlc\sdk\lib


3) [Linker] -> [Additional Library Directories] -> [input] -> [Additional Dependencies]

* libvlc.dll 기입

* libvlccore.dll 기입




5. 빌드를 해보자. 

ofApp.h 에 [ #include "ofxVLCVideoPlayer.h" ] 를 기록 하고 빌드를 해보자. 아마 수 많은 에러로 인하여 빌드가 되지 않을 것이다.




6. 이 문제를 해결하여 보자. 

아마 다른 플랫폼 혹은, 예전 컴파일러와 개발환경에 맞추어 져 있는 몇몇 코드들 때문에 원활히 빌드가 안되는것으로 예상한다. sdk 중 몇몇 코드를 수정 해야 한다.  (OF .0.9.3 기준, VisualStudio 2015 기준)


1) plugins/vlc_meta.h , plugins/vlc_epg.h , vlc_input_item.h , 

* #include <vlc_common.h> 추가


2) plugins/vlc_arrays.h

* strdup 을 -> _strdup 으로 수정한다. 

- Line 515 , 532 



7. ofxVLCVideoPlayer 의 일부 코드도 변경이 필요 하다. 

1) 94 ~ 97 줄 주석(//) 처리

2) 115 ~ 126 줄 주석(//) 처리



8. 마지막으로 SAFESSH 를 비활성화 한다.

1) [Linker] -> [Advanced] -> [Image Has Safe Exception Handlers] -> No 




9. 예제 코드 


ofApp.h

#include "ofMain.h"
#include "ofxVLCVideoPlayer.h"

class ofApp: public ofBaseApp{
    
    public:
        
        void setup();
        void update();
        void draw();
        
        void keyPressed(int key);   
        
        float   counter;
        bool    bSmooth;

        ofVideoPlayer player2;
        ofxVLCVideoPlayer player;

        ofImage testImage;
};



ofApp.cpp


#include "testApp.h"


//--------------------------------------------------------------
void ofApp::setup(){
player.loadMovie("test.mp4"); } //-------------------------------------------------------------- void ofApp::update(){
player.update(); } //-------------------------------------------------------------- void ofApp::draw(){
player.draw(0,0); } //-------------------------------------------------------------- void ofApp::keyPressed (int key){
if (key == ' ') { player.play(); } }






10. 성능과 마무리 

ofxVLCVideoPlayer 는 아직 정리가 덜된듯 하다. 그러나 1920x1080 영상은 매우 매끄럽게 돌아간다. 하지만 QHD , 4K 는 vlc 의 온전한 성능을 못내는것 같다.

아마 vlc 에서 콜백으로 픽셀을 받고 치환 하는 과정에서 무언가 비효율이 발생 하는듯 한데 조만간 ofxVLCVideoPlayer 를 참고하여 온전한 vlc 성능을 내는 에드온을 만들어야 하겠음.



참고로 원래 vlc 플레이어는 4K 영상이 온전히 돌아간다. 



(7/25) 만들었음 : http://scripter.co.kr/356