우선 Airsonic에 대해서 설명하자면

Airsonic은 Subsonic에서 파생된 프로그램으로 Subsonic은 간단히 말해 미디어 서버 프로그램이다.

Subsonic은 서버내의 음악파일을 외부 클라이언트로 공유하여 들을 수 있도록 다양한 기능을 제공하는 서버 프로그램으로 버전 6 이전까지는 무료였다가 이후에는 유료로 변경되었다고 한다.

Airsonic은 Subsonic의 유료화에 반발하여 분리된 프로젝트로 Subsonic의 기능과 API 등을 가지고도 무료로 사용할 수 있는 서버 프로그램이다.

때문에 Subsonic과 연동되는 클라이언트 프로그램은 Airsonic에도 연결할 수 있다.

https://github.com/airsonic/airsonic

 

airsonic/airsonic

:satellite: :cloud: :notes:Airsonic, a Free and Open Source community driven media server (fork of Subsonic and Libresonic) - airsonic/airsonic

github.com

Subsonic은 클라이언트에서 사용할 수 있는 다양한 API를 제공하는데

http://www.subsonic.org/pages/api.jsp

 

Subsonic

maxBitRate No (Since 1.13.0) The maximum bit rate (in Kbps) for the user. Audio streams of higher bit rates are automatically downsampled to this bit rate. Legal values: 0 (no limit), 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320.

www.subsonic.org

Airsonic 또한 Subsonic의 API를 대부분 사용할 수 있다.

그 중에서도 이번에 수정해볼 API는 이것이다.

가사를 얻어오는 API인데

이전 포스트에서도 설명했지만 저 API를 실행시키면

Airsonic은 파라미터로 보내진 artist, title 정보를 이용해서

String url = "http://api.chartlyrics.com/apiv1.asmx/SearchLyricDirect?artist=" + artist + "&song=" + song; String xml = executeGetRequest(url); lyrics = parseSearchResult(xml);

이런 위의 URL을 통해 가사를 가져온다.

즉 저 사이트에 가사 정보가 없으면 가사를 가져오지 못한다는 뜻이다.

하지만 Airsonic은 오픈소스 프로젝트이므로 내가 코드를 수정해서 사용하는것이 가능하다.

이번에는 저 코드를 수정해서 Airsonic이 getLyric API를 요청받았을 때

저 URL이 아닌 로컬 환경에서 가사를 가져오도록 수정할 예정이다.

우선 Airsonic을 컴파일할 환경을 구성해야 한다.

환경을 구성하는 방법은 아래 사이트에서 설명해주고 있다.

https://airsonic.github.io/docs/install/source/

 

Airsonic

Airsonic, a Free and Open Source community driven media server, providing ubiquitous access to your music.

airsonic.github.io

계획은 단순한데

Airsonic에서 제공하는 getLyrics API를 실행하면

Airsonic이 자신의 musicDirectory에서 title 파라미터값을 이용해 파일을 검색해 가사 파일을 찾아내는 것이다.

만약 가사파일을 찾으면 가사파일을 읽어서 API를 요청한 클라이언트한테 보내주면 된다.

Airsonic 서버가 로컬 가사파일을 읽어서 클라이언트에게 가사를 전송하도록 수정할 것이다.

나는 윈도우 환경에서 MVN, JDK 버전등을 맞추고 컴파일을 시도해 보았더니

윈도우 환경에서는 컴파일 할 수 없다는 메세지가 출력되어서 Virtualbox 가상머신에 MX 리눅스를 설치했다.

이후 설명 페이지에 나와있는대로 환경을 구성하고 소스코드를 수정하지 않은 상태에서 컴파일하여 .war 파일을 생성하여 테스트 해보았다.

tomcat 9버전대에 올려보니 정상동작하는것을 확인할 수 있었다.

참고로 컴파일에는 한 20분정도 시간이 걸렸는데 실제 컴파일하는데는 5분이면 되는것 같은데

Airsonic 컴파일을 할 때 실행되는 기능 테스트 동작하는데에만 한 15분이 넘게 걸리는 것 같다.

어쨋든 컴파일이 된것을 확인하고 나서는 코드를 수정해 주었다.

참고로 코드 규칙이 정말 까다롭게 되어있는데

탭문자쓰면 탭문자 쓰지 말라고 에러나고 띄어쓰기 한개때문에 에러나고 if , for 문 앞뒤로 한칸씩 띄어쓰라고 에러나고 대괄호 내려썼다고 에러나고 == 쓰지말고 equals 쓰라고 에러나고

얼마나 깐깐하게 만들었는지 알 수 있었다.

그렇게 코드를 수정하고 리눅스 환경에서 Airsonic에 getLyrics API를 날려보니

 

SERVER='http://127.0.0.1:8080/airsonic'
CLIENT='CLI'
USERNAME='admin'
PASSWORD='admin'
SALT="$(openssl rand -hex 20)"
TOKEN="$(echo -n "${PASSWORD}${SALT}" | md5sum | awk '{ print $1 }')"
echo ${SALT}
echo ${TOKEN}
curl "${SERVER}/rest/getLyrics.view?u=${USERNAME}&t=${TOKEN}&s=${SALT}&v=1.15.0&c=${CLIENT}&artist=&title=Anemone"

 

가사가 정상적으로 출력되었다.

안드로이드 클라이언트에서도 가사가 정상적으로 출력되는것을 확인했다.

다만 lrc 파일 특유의 시간표시가 남아있는데

저 시간정보를 이용하려면 서버 프로그램이 아닌 클라이언트 프로그램을 수정해야만 한다.

Subsonic API는 가사정보가 LRC 형식이 아닌 그냥 단순 텍스트로 전송되기때문에

저 시간정보를 이용할 수 있는 클라이언트가 없다.

만약 저걸 이용하려면 클라이언트 기능까지 직접 만들어야된다는건데...

일단은 저 시간정보를 빼고 깔끔하게 보이는 텍스트 가사로 출력하는것에 만족해야겠다.

시간정보를 제거한 가사 출력

이번에 추가한 코드는 아래와 같다.

 

 @RequestMapping("/getLyrics")
    public void getLyrics(HttpServletRequest request, HttpServletResponse response) {
        request = wrapRequest(request);
        String artist = request.getParameter("artist");
        String title = request.getParameter("title");

        Lyrics result = new Lyrics();
        result.setArtist(artist);
        result.setTitle(title);
        result.setContent(getContentMain(title));

        Response res = createResponse();
        res.setLyrics(result);
        jaxbWriter.writeResponse(request, response, res);
    }

    public String getContentMain(String title) {
        for (org.airsonic.player.domain.MusicFolder folder: settingsService.getAllMusicFolders()) {
            File[] fileList = folder.getPath().listFiles();
            for (int i = 0; i < fileList.length; i++) {
                File file = fileList[i];
                if (file.isFile() && file.getName().contains(title) && file.getName().toLowerCase().contains(".lrc")) {
                    String str = "";
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8"));
                        br.readLine();
                        br.readLine();
                        br.readLine();
                        String line = br.readLine();
                        while (str != null) {
                            str += line.substring(10) + "\n";
                            line = br.readLine();
                        }
                        br.close();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    return str;
                } else if (file.isDirectory()) {
                    String r = getContentSub(file, title);
                    if (!r.isEmpty()) {
                        return r;
                    }
                }
            }
        }
        return "";
    }

    public String getContentSub(File subdir, String title) {
        File[] fileList = subdir.listFiles();
        for (int i = 0; i < fileList.length; i++) {
            File file = fileList[i];
            if (file.isFile() && file.getName().contains(title) && file.getName().toLowerCase().contains(".lrc")) {
                String str = "";
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8"));
                    br.readLine();
                    br.readLine();
                    br.readLine();
                    String line = br.readLine();
                    while (line != null) {
                        str += line.substring(10) + "\n";
                        line = br.readLine();
                    }
                    br.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return str;
            } else if (file.isDirectory()) {
                String r = getContentSub(file, title);
                if (!r.isEmpty()) {
                    return r;
                }
            }
        }
        return "";
    }

 

getLyrics 함수를 수정하고 getContentMain, getContentSub 함수를 추가해주었다.

새벽 늦게까지 했지만 기능을 완성하니 뿌듯하고 기분이 좋다.

컴파일 시간이 짧았으면 좀 더 빨리 끝났을것 같은데 테스트를 스킵하는 명령이 있는지 찾아볼걸 그랬다 싶다.

아무튼 이로써 무료 음악 스트리밍 서버를 이용하면서 노래의 가사까지 볼 수 있게 되었다.

집에 음악 스트리밍 서버를 구축하기 위해서 내가 기존에 조사했던 자료이다.

각 프로그램의 전체 기능을 비교한 것이 아닌 음악을 재생 기능만을 비교한 것이다.

대부분이 음악 재생기능이 메인이 아닌 영화 등의 동영상 매체를 메인으로 하다보니 음악재생에 있어서는 부족한 부분이 한두가지씩 있어서 어떤 프로그램을 사용해야 좋을지 한눈에 보기 위해서 정리했던 자료이다.

나는 외부에서 음악을 듣기 위해서 Jellyfin 서버를 설치했는데 막상 사용해보니 조금 문제점이 있었다.

일단 첫번째로 Jellyfin은 가사 출력 기능이 없다.

나는 가사를 출력하기 위해서 음악파일에 대응되는 lrc 파일들을 많이 만들어놨는데 Jellyfin은 온라인 가사 출력기능도, 로컬 가사 출력기능도 없었다.

두번째로는 기본적으로 동영상이 메인이기 때문인지 다음에 재생될 음악 등을 미리 다운로드 하는 기능이 없다.

나같은 경우는 전철 1호선을 타고 갈때 온수 ~ 구로 사이에서 이상하게 LTE 속도가 느려지는 점이 있어서 음악을 미리 다운로드해서 캐시에 넣어놓는 기능이 없으면 다음 파일이 바로 재생되지 않는 문제점이 있었다.

결국 가사 출력이 가능하면서 미리 다운로드하는 기능이 있는 서버 + 클라인트 프로그램을 찾고있었는데

찾기가 생각보다 쉽지 않았다.

그래서 계속 찾아보다보니 Subsonic에 getLrics 라는 기능이 있는것을 알 수 있었다.

딱 봐도 가사를 얻어오는 기능인것 같긴 한데 어떤 동작을 해서 가사를 얻어오는지 알 수가 없었다.

Subsonic과 연결되는 안드로이드 클라이언트를 가능한 한 확인해보았더니

Ultrasonic과 Subsonic에 가사를 받아오는 기능이 있는것을 확인했고 다른 클라이언트 어플리케이션에서는 기능을 찾지 못했다.

Ultrasonic; Subsonic용 안드로이드 클라이언트 어플리케이션

subsonic; Subsonic용 안드로이드 클라이언트 어플리케이션,. 공식 클라이언트인것 같다.

그런데 가사를 받아오는 기능을 사용해도 전혀 가사를 받아올 수 없었다.

그 이유를 알기 위해 Airsonic 코드가 올라와있는 Github에서 관련 코드를 찾아보았다.

https://github.com/airsonic/airsonic

 

airsonic/airsonic

:satellite: :cloud: :notes:Airsonic, a Free and Open Source community driven media server (fork of Subsonic and Libresonic) - airsonic/airsonic

github.com

그렇게 찾은 코드가 글쎄

 

public LyricsInfo getLyrics(String artist, String song) {
        LyricsInfo lyrics = new LyricsInfo();
        try {

            artist = StringUtil.urlEncode(artist);
            song = StringUtil.urlEncode(song);

            String url = "http://api.chartlyrics.com/apiv1.asmx/SearchLyricDirect?artist=" + artist + "&song=" + song;
            String xml = executeGetRequest(url);
            lyrics = parseSearchResult(xml);

        } catch (HttpResponseException x) {
            LOG.warn("Failed to get lyrics for song '{}'. Request failed: {}", song, x.toString());
            if (x.getStatusCode() == 503) {
                lyrics.setTryLater(true);
            }
        } catch (SocketException | ConnectTimeoutException x) {
            LOG.warn("Failed to get lyrics for song '{}': {}", song, x.toString());
            lyrics.setTryLater(true);
        } catch (Exception x) {
            LOG.warn("Failed to get lyrics for song '" + song + "'.", x);
        }
        return lyrics;
    }

 

 

이렇게 되어있었다.

Subsonic 종류의 미디어 서버 프로그램은 코드상에 api.chartlyrics.com 라는 URL을 하드코딩으로 박아넣고

저 사이트에서 가사를 받아오고 있었던 것이다.

그러니 당연히 가사를 찾을수가 없었던 것이다.

하지만 코드가 저렇게 간단하게 되어있으니 수정도 쉬울것이라는 생각이 들었다.

이 다음에는 Airsonic의 코드를 수정해서

로컬환경의 lrc 파일을 읽어 클라이언트로 전송하도록 동작을 바꿔보도록 하겠습니다.

2020. 8. 9. 16:50

 

이번에 핸드폰을 새로 구매했는데 돈을 좀 아껴보겠다고 64GB짜리 작은 용량의 스마트폰을 구매하고 마이크로 SD 카드 128GB 짜리를 하나 주문했다.

그런데 핸드폰 배송이 완료되고 확인해보니 이럴수가 내가 구입한 스마트폰은 마이크로 SD카드를 사용할 수 없는 스마트폰이었던 것이엇따.

그동안 스마트폰에 넣고다니던 음악파일들을 들고다닐 수 없게된 나는 이 참담한 심정을 조금이나마 위로받고싶어 인터넷 커뮤니티에 토로하였으나 돌아온 답변은

 

 

 

요즘 음악 다 스트리밍으로 듣지 어던 찐따가 음악파일 들고다니냐ㅋㅋㅋ 하는 이야기 뿐이었다.

여러가지 고민을 했지만 결국 집에서 사용중인 홈서버용 컴퓨터에 미디어 서버를 설치해서 사용하기로 결정했다.

그 후로 FTP 서버를 깔아서 안드로이드용 FTP 플레이어도 설치해보고 여러가지 서버 프로그램 등도 설치해서 비교해보았는데 그중에 가장 괜찮은게 Jellyfin 미디어 서버였다.

결국 Jellyfin을 설치하였는데 내가 본 Jellyfin의 장점은 우선

1. 설치가 정말 쉬었다.

airsonic을 설치할때는 도커를 깔아서 버추얼박스용 가상머신을 만들어서 네트워크세팅해주고 컨테이너를 다운받고 런한다음에 포트열어주고 외부폴더 연결해주는 등 복잡한 작업을 해주었는데, Jellyfin은 전혀 그런게 없다.

그냥 다운받은다음에 설치해주면 끝이었다.

2. 동영상 파일도 올리고 재생이 가능

subsonic, airsonic처럼 음악 서버가 아니라 미디어서버이다 보니 영화나 애니메이션, 드라마 등의 파일도 넣고 스트리밍으로 재생을 할 수가 있었다.

3. 인터페이스와 디자인이 깔끔하고 각종 설정이 가능

웹페이지와 안드로이드 앱등을 살펴보았을 때, 그동안 설치해본 airsonic이나 FTP 서버와 연결하기 위해 설치한 foobar2000 안드로이드 앱 등과 비교하면 정말 아름답게 보였다.

또한 유저를 추가하여 특정 라이브러리에만 접근 권한을 주거나 접속로그를 보거나 하는 등의 상용 프로그램 못지 않은 기능을 가지고 있다.

 

관리 페이지도 깔끔하다

5. 개발이 활발하다.

Jellyfin 웹페이와 git 페이지등에 찾아가보니 최근에도 개선작업 등이 활발하게 이루어기는것을 볼 수 있었다.

나같은경우도 github 이슈페이지에 안드로이드앱에 캐시기능이 없다고 넣어달라고 글을 올렸더니 2분만에 답장이와서 중복된 이슈가 있다고 내 글을 close 시켜버렸다.

5. 오픈소스 무료 프로젝트다.

무료보다 좋은건 없다.

이런 장점이 있다는것을 느낄 수 있었고

단점도 몇가지 느낄 수 있었는데 단점으로는

1. 파일 탐색 속도가 느리다.

라이브러리를 추가하면 실제로 추가되는데에 생각보다 오랜 시간이 걸렸다. 아무래도 그냥 추가가 되는게 아니라 파일에과 관련된 메타데이터들을 만들고 찾지 못한 메타데이터 등은 인터넷에서 정보를 직접 수집한다음에 집어넣는 그런 방식인것 같다.

이는 라이브러리 추가를 할 때 그런 메타데이터를 얻어올지 말지 등을 설정해 줄 수 있는 것으로 보인다.

2. 안드로이드 앱에 캐시 기능

두가지 안드로이드 앱에서 음악파일을 실행해 봤다. Jellyfin 안드로이드앱과 Gelli 앱인데 Jellyfin 앱에는 캐시기능이 없는것처럼 보이고, Gelli 앱에는 설정에서 캐시 부분을 확인 할 수 있었다.

FTP를 이용하는 음악 플레이어로 테스트를 해봤을 때 음악을 재생하면 그 다음에 재생될 재생목록의 파일 몇가지를 미리 다운로드 하는 등의 나름 편의성있는 기능이 있는것을 보았다.

그런데 이 두가지 앱은 일단 그런 기능도 없었고 캐시가 동작하는지 확인하기 위해

음악1을 재생한 후에 음악2를 재생하고 네트워크를 종료한다음 음악1이 재생되는지에 대해 테스트를 해보았는데 음악1은 재생되지 않았고 심지어는 서버에서 로그아웃까지 된것을 확인할 수 있었다.

Jellyfin앱은 캐시기능이 없는것같으니 그럴 수 있겠지만 Gelli앱은 이런 기능이 되어야하는것 아닌가 싶은데 내가 설정을 따로 해주어야 하는 부분이 있을수도 있을것같다.

Jellyfin 서버는 아래 링크에서 다운받을 수가 있다.

https://jellyfin.org/

 

Jellyfin: The Free Software Media System

Software freedom is important. Jellyfin is Free Software, licensed under the GNU GPL. You can use it, study it, modify it, build it, and distribute it for free, as long as your changes are licensed the same way. The project is community-built, relying enti

jellyfin.org

또한 각종 기능에 대한 설명을 아래 페이지에서 볼 수 있다.

https://jellyfin.org/docs/general/quick-start.html

 

Quick Start | Documentation - Jellyfin Project

 

jellyfin.org

 

이렇게 홈서버나 NAS 등에 Jellyfin 서버를 설치하고 공유기 포트포워딩에서 홈서버 8096 포트에 접속할 수 있도록 설정해 준다음 DDNS 설정을 해주거나 IP로 접속하면 외부에서도 인터넷을 통해서 미디어 서버에 접속을 할 수 있다.

이제 스마트폰 데이터만 걱정 없으면 어디서든 내가 소유한 음악파일을 재생할 수 있게 되었다.

 

참고로 Jellyfin 라이브러리에에 음악을 폴더별로 넣었을때 음악들이 "앨범" 이라는 형태로 들어가는것을 확인할 수 있다.

그런데 확인해보니 이 앨범이라는건 실제 음악의 앨범은 아니고

음악파일이 들어있는 폴더와 그 안에 들어있는 음악파일들이 앨범이라는 형태로 표시되는 것이었다.

앨범의 이름이 그 폴더의 가장 첫 음악파일의 이름으로 되어있었기 때문에 헷갈리게 되는것이다.

앨범의 이름은 아래와 같은 방법으로 바꿀 수 있다.

1. 앨범에서 마우스 오른쪽을 버튼을 누른다.

2. 메타데이터 편집으로 들어가서 제목을 수정한다.

다만 이렇게 수정하고 바로 변경되는것이 아니라 일정 시간이 흐른 후에 변경이 된다.

 

 

 

2020. 7. 10. 2:06

 

이전에 영상 보간 프로그램으로 드미트리를 사용하다가 네트워크 어댑터 추가로 키가 만료되고

무료 영상 보간 플레이어인 Splash를 사용해 보았는데

아무래도 Splash는 일부 코덱을 지원하지 않는데다가 일부 자막형식을 지원하지 않아서 불편한 점이 있었다.

그래서 또다시 방법을 찾아보던 도중 MPV와 SVP 4를 사용하여 영상 보간을 하는 방법을 적은 글을 찾을 수 있었다.

https://quasarzone.com/bbs/qb_free/views/541538

 

프레임 보간 플레이어 필요하신 분들 mpv 한번 써보세요

AMD를 아주 좋아하는데, 이번에 노트북을 구입하며 플루이드 모션을 대체할 방법을 찾아봤습니다.드미트리 렌더…

quasarzone.com

그런데 이 당시에는 SVP 4의 기능을 무료로 사용할 수 있던 시절이었고

현재 SVP는 유료에 30일을 무료로 사용할 수 있다.

MPV를 설치해 보았더니 플레이어 설정까지도 전부 텍스트로 작성해서 실행해야 하는 등의 불편함이 있었다.

 

그러다가 MPV와 같은 갈래에서 파생된 Mplayer 라는 또다른 플레이어를

이용하여 제작된 SMPlayer 라는 플레이어를 발견했다.

기능도 괜찮고 SVP 4와 연동도 간편했다.

 

인터페이스는 정말 깔끔하다.

SMPlayer를 설치하고 SVP 4는 30일동안 무료로 사용할 수 있기 때문에 둘 다 설치해서 연동했더니

Splash처럼 자막의 종류를 가리거나 기능이 동작하지 않는 문제점도 없고

인터페이스나 마우스 버튼 등의 동작을 바꾸는 기능도 있어서 사용하기 좋게 셋팅을 할 수 있었다.

아래는 설치 및 연동 과정입니다.

우선 SMPlayer 64bit버전을 설치한다.

 

https://www.smplayer.info/

 

SMPlayer - Free media player for your PC

SMPlayer is a free media player than can play virtually all audio and video formats. It can even play and download Youtube videos. Other interesting features: find and download subtitles, thumbnail generator, resume playback.

www.smplayer.info

만약 기본 스킨이 마음에 들지 않는다면 다음 방법으로 플레이어 모습을 바꿀 수 있다.

 

그리고 나서 SVP 4를 설치해주었다.

윈도우에서는 SVP 4를 20달러를 내고 구매하여 사용할 수 있지만 설치하면 30일 동안은 무료로 사용이 가능하다.

리눅스에서는 무료라고 하니 나중에 리눅스에서도 설치해보고 싶다.

 

https://www.svp-team.com/get/

 

Get – SVP – SmoothVideo Project

In case the payment was rejected or blocked by your bank, please try the PayPal option instead! We accept Visa and MasterCard bank cards via CloudPayments processing service, please find more information on security and privacy below.

www.svp-team.com

 

설치가 완료되면 이런 창이 뜨는데 나중에 구매를 하겠지만 일단 평가판을 사용하기로 하겠다.

지금 등록하기! 를 선택하면 평가판 기간이 30일 남았다는 메세지가 뜬다.

이제 SMPlayer에서 SVP를 사용해보겠습니다.

사실 너무 간단한데 아래 페이지를 그대로 따라하면 됩니다.

 

https://www.svp-team.com/wiki/SVP:SMPlayer

 

SVP:SMPlayer - SmoothVideo Project (SVP) - frame doubling interpolation

Setting up SMPlayer (Windows, Linux) Installation - Windows Install [VPS_64] mpv video player package via SVP's "Additional programs and features" Install 64-bit version of SMPlayer, Open Preferences, On the General tab set Multimedia engine to Other and b

www.svp-team.com

우선 환경설정으로 들어가서 일반 메뉴의 멀티미디어 엔진의 기타를 선택한다.

 

그러면 파일을 선택하는 다이얼로그가 뜨는데 SVP를 설치한 경로의 MPV 실행파일을 선택한다.

 

내 경우는 기본경로로 설치를 했기 때문에

C:\Program Files (x86)\SVP 4\mpv64

경로에 설치되었다.

다음은 고급 탭으로 이동해서 아래 옵션을 입력해준다.

 

--hr-seek-framedrop=no

확인 버튼을 누르고 나서 영상을 재생해 보면

 

SVP 아이콘이 뜨면서 영상 보간이 동작하는것을 확인할 수 있다.

추가로 SMPlayer에서 OSD를 출력하려면

이 메뉴를 선택하면 된다

영상의 현재 초당 프레임과 각종 정보등을 표시할 수 있다.

 

 

 

 

 

 

 

또한 SMPlayer에서 유튜브 영상을 볼 수 있는데

 

이렇게 주소 메뉴를 클릭한 후 유튜브 주소를 입력하면 재생이 된다.

또는 메뉴에 있는 유튜브 브라우저를 누르고 설치한 뒤

 

 

 

이렇게 검색하여 동영상을 누르면 유튜브 영상이 재생되게 된다.

이렇게 유튜브 영상을 SMPlayer + SVP 환경에서 실행하면

 

이렇게 유튜브 영상또한 보간이 되어 높은 프레임으로 유튜브 영상을 볼 수 있다.

이렇게 볼 일이 있을지는 모르겠지만...

이렇게 해서 동영상을 보간하여 높은 프레임의 영상으로 만들어 부드러운 동영상을 감상할 수 있도록 하였습니다.

+ Recent posts