2022년 12월 8일 목요일

ffmpeg 명령어 모음

ffmpeg 명령어 모음

* ffmpeg 프레임 추출
$ ffmpeg -ss 00:00:0 -i input.mp4 -r 10 -f image2 input-%d.png

* ffmpeg resizing
$ ffmpeg -i input.mp4 -vf scale=4032:756 -preset slow -crf 18 -strict -2 output.mp4

2022년 6월 15일 수요일

안드로이드 화면 캡쳐하기

프로그래밍으로 화면 캡쳐하기.
아래 명령어는 system app으로 등록되어야 가능합니다.

2022년 5월 24일 화요일

화면 가로/세로 모드 조정하기

1. 가로 모드 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

2. 세로 모드 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2022년 4월 21일 목요일

Windows에서 webcam을 이용해서 RTSC 서버 구축과 영상 스트리밍하기

1. rtsc 서버 설치하기
아래 링크에서 rtsc simple 서버 프로그램을 다운로드 받아서 압축을 풀고 rtsp-simple-server.exe 실행

2. ffmpeg 을 이용해서 웹캠 화면을 rtsc 서버로 보내기

https://www.gyan.dev/ffmpeg/builds/ 의 release builds section에서 ffmpeg-release-full.7z 를 다운로드 받아서 압축을 푼다.

ffmpeg/bin/ 를 시스템 환경 변수 PATH에 추가.

cmd 프로그램을 실행.

아래 명령어 실행.

웹캠과 마이크 장치이름을 알기 위해서 ffmpeg -list_devices true -f dshow -i dummy 실행.

아래 명령어로 rtsp 스트리밍 수행.

ffmpeg -f dshow -i video="HD Webcam":audio="마이크(Realtek(R) Audio)" -profile:v high -pix_fmt yuv420p -level:v 4.1 -preset ultrafast -tune zerolatency -vcodec libx264 -r 10 -b:v 512k -s 640x360 -acodec aac -ac 2 -ab 32k -ar 44100 -f rtsp -rtsp_transport tcp rtsp://192.168.1.107:8554/test

Edge나 Chrome의 주소창에 rtsp://192.168.1.107:8554/test 실행하면 컴퓨터에 설치되어 있는 미디어 플레이어에서 실행.

3. ffmpeg 명령어

웹캠영상을 파일로 저장할 때

ffmpeg -f dshow -i video="HD Webcam" -r 20 -t 10 camera.mp4

ffplay로 rtsp 스트리밍 보기

ffplay -fflags nobuffer -flags low_delay rtsp://192.168.1.107:8554/test

4. Reference

2022년 1월 21일 금요일

How to kill Android process

1. Android process 죽이는 방법 1

2. Android process 죽이는 방법 2

2022년 1월 20일 목요일

How to generate .jks file with .pk8 and .pem

$ openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12 -password pass:android -name platform
$ keytool -importkeystore -deststorepass android -destkeystore platform.jks -srcstoretype PKCS12 -srcstorepass android -srckeystore platform.p12

ValueAnimator 를 이용한 애니메이션 만들기

sequence images 를 사용해서 애니메이션을 표현해야 할 때가 있습니다.
기존에는 AnimationDrawable을 사용해서 애니메이션을 만들었는데 사용하기 쉬운 반면
이미지가 커지면 로딩하는데 시간이 오래 걸리는 단점이 있습니다.
고민 하던 중에 ValueAnimator를 이용해서도 애니메이션을 만들 수 있다는 것을 알았고
이것은 이미지 개수나 사이즈에 상관없이 바로 수행이 되는 장점이 있습니다.

1. ValueAnimator valueAnimator = ValueAnimator.ofInt(valueStart, valueEnd).setDuration(duration);
ValueAnimator는 정해진 duration동안 onAnimationUpdate()를 호출하는데 parameter로 valueStart 부터 valueEnd 사이의 값을 넘겨줍니다.

2. onAnimationUpdate() 내에서 value값에 해당되는 imageview의 리소스를 교체해 줍니다.

3. 예제는 1초 동안 0~99의 값을 onAnimationUpdate()를 통해서 넘겨줍니다.
100개의 이미지가 있고 이것을 1초동안 play하기를 원한다면 이미지들을 배열로 만들어서 해당 value에 맞는 리소스를 교체해 주면 됩니다.

Android adb 명령어

1. screen capture
ex) adb shell screencap -p /sdcard/screen.png

2. 특정 기기 선택
ex) adb -s devicename shell screencap -p /sdcard/screen.png

3. broadcast
adb shell am broadcast -a packagename --ei key value --es key value
ex) adb shell am broadcast -a com.android.test
ex) adb shell am broadcast -a com.android.test --ei event 1 --es name "john snow"

4. 화면 이동
ex) adb shell am start -a android.settings.SETTINGS
ex) adb shell am start -a android.settings.BLUETOOTH_SETTINGS
ex) adb shell am start -n com.android.car.carlauncher/.AppGridActivity

5. display 선택
adb shell am start -a activity --display number
ex) adb shell am start -a android.settings.SETTINGS --display 0

6. app 삭제
ex) adb shell pm uninstall --user 0 com.android.test

7. key event 전달
ex) adb shell input keyevent 4

[Reference]
https://developer.android.com/studio/command-line/adb

2022년 1월 19일 수요일

Android Timer 관련 정리

1. 일정 시간마다 작업하기를 원할 때
Timer와 TimerTask를 이용한 반복 작업 구현.
아래 예제는 15초 동안 5초마다 한번 씩 작업하는 예제
2. 일정 시간마다 작업하기를 원할 때
CountDownTimer를 이용한 반복 작업 구현.
아래 예제는 10초 동안 0.5초마다 한번 씩 작업하는 예제
3. 일정 시간 후에 한 번 원하는 작업을 하고 싶을 때
아래 예제는 1초 후에 한번 작업하는 예제

2020년 8월 17일 월요일

Drawerlayout drag 영역 변경 하기

DrawerLayout 은 drag 할 수 있는 왼쪽/오른쪽 가장자리 영역이 20dp로 고정되어 있습니다.

이 영역을 변경할 수 있는 api가 공식적으로는 없는데 아래와 같은 방법으로 하면 변경할 수 있습니다.

아래 코드의 edge 의 값을 변경 하면 됩니다.

int edge = 30;


private void setDrawerLayoutMargin() {
    java.lang.reflect.Field leftDragger = null;
    java.lang.reflect.Field rightDragger = null;
    try {
        leftDragger = mDrawerLayout.getClass().getDeclaredField("mLeftDragger");
        rightDragger = mDrawerLayout.getClass().getDeclaredField("mRightDragger");
    } catch (NoSuchFieldException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }

    leftDragger.setAccessible(true);
    rightDragger.setAccessible(true);
    ViewDragHelper leftDraggerObj = null;
    ViewDragHelper rightDraggerObj = null;
    try {
        leftDraggerObj = (ViewDragHelper) leftDragger.get(mDrawerLayout);
        rightDraggerObj = (ViewDragHelper) rightDragger.get(mDrawerLayout);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    java.lang.reflect.Field leftEdgeSize = null;
    java.lang.reflect.Field rightEdgeSize = null;
    try {
        leftEdgeSize = leftDraggerObj.getClass().getDeclaredField("mEdgeSize");
        rightEdgeSize = rightDraggerObj.getClass().getDeclaredField("mEdgeSize");
    } catch (NoSuchFieldException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    leftEdgeSize.setAccessible(true);
    rightEdgeSize.setAccessible(true);
    int edge = 30;
    try {
        leftEdgeSize.setInt(leftDraggerObj, edge * 1);
        rightEdgeSize.setInt(rightDraggerObj, edge * 1);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

2018년 8월 19일 일요일

[Japan] 홋카이도 여행

한여름 8월인데도 삿포로의 날씨는 최고 기온 25도.
햇살은 뜨겁고 바람은 선선하고 여행하기 딱 좋은 날씨다.

해바라기 마을
정말 모두가 해만 바라보고 서 있네...


팜도미타
라벤다가 유명한곳인데 라벤다가 많이 져서 아쉬웠습니다.


청의호수
에메랄드 빛의 물색이 신기합니다. 석회질이 포함되어 있어서 색이 저렇게 나온다네요.

삿포로호
운전하다가 그냥 들른 전망대 입니다.

삿포로 타워

삿포로 맥주축제
의도치않게 맥주축제 기간과 여행기간이 맞아서 삿포로 맥주 부스에서 맥주 한잔 했습니다.
삿포로 시민의 절반은 이곳에 있는듯... 축제 명성에 맞게 사람이 정말 많았습니다.

노보리베츠 지코쿠다니
탕안에 있는것을 별로 좋아하지 않아서 온천여행은 해본적이 없는데 이번에 생각이 바꼈습니다.
시설좋은 숙소에서 뒹굴뒹굴 하다가 몸만 가서 경치를 보면서 탕안에 앉아있는게 너무 좋았습니다.


2018년 3월 9일 금요일

[Korea] 강화도

드디어 겨울이 지나고 날씨가 따뜻해지는것 같아서 가까운 강화도로 출사.
연미정 바로 옆에 있는 식당에서 할머니가 해주는 집밥을 먹고 본격적으로 사진을 찍으러 출발.


아직은 나뭇잎이 없어서 을씨년 스럽네요. 여름이나 가을이 정말 좋을 듯.



1900년에 지어진 한옥으로 만들어진 성당. 강화도에 이런게 있었네...


강화도 해설사분이 추천해준 평화전망대.
개성이 생각보다 이렇게 가까운데 있는데 갈 수가 없다니...



2017년 7월 30일 일요일

[Korea] 진관사의 여름

북한산에 있는 유명한 절 '진관사'에 다녀왔습니다.
고려시대때 창건이 돼서 천년이 넘은 오래된 절 중 하나 입니다.
후텁지근한 여름날인데도 산바람과 북한산 계곡의 물소리때문에 시원함을 느낄 수 있습니다.




이름모를 꽃들이 녹색숲의 포인트가 되어 줍니다.





여기저기 둘러보느라 지쳤다면 시원한 카페에서 커피나 전통차로 땀을 식혀 보세요.



2017년 7월 17일 월요일

[Korea] 서울 밤 도깨비 야시장 @청계천

매년 3월 말부터 10월 말까지 서울 곳곳에서 야시장이 열립니다.
그중에서 청계천에서 열리는 야시장을 가 봤습니다.
청계천 주변은 대부분 사무실이기 때문에 야시장이 열리는 금토일 저녁에는 한가합니다.
무더운 여름날 청계천에서 발도 담그고, 근처 푸드트럭에서 먹거리도 먹을 수 있어서 좋았습니다.
또한, 청계천 주변 곳곳에서 무료공연과 행사를 하기 때문에 즐길거리도 많습니다.

2017년 7월 14일 금요일

When youtube is slow on chrome browser

When youtube is slow on chrome browser, run as shown below
  1. Write on URL 'chrome://flags'
  2. Find 'QUIC'
  3. Set 'Disabled'

2017년 6월 29일 목요일

유럽배낭여행 - 80일간의 루트

많이 안돌아다닌것 같은데 참 많이도 갔다.
자세한 일정은 아래 사이트로 들어가 보면 볼 수 있습니다.

80일간의 비용은 아래 링크에...

뭘하고 다녔는지 궁금하면 비디오를...
슬라이드쇼 만든다고 다시 한번 사진을 보니 못봤던 사진도 많고 왜 이렇게 찍었나 하는 사진도 많네.
다시 가면 더 잘 찍을 수 있을 텐데...

2017년 6월 15일 목요일

니모와 도리는 잊고 산호를 키워보자.

니모와 도리를 키운지 약 3개월.
드디어 백점병이 어항에 퍼졌다.
처음에는 새로 들여온 산호때문인가 했는데 날씨가 따뜻해지면서
더 이상 히터가 필요 없을 줄 알고 치웠던것이 화근인것 같다.
낮에는 히터 없이도 25도 정도를 유지하고 있었지만 밤에는 수온이 많이 떨어졌다.
낮에 수온을 유지할 수 있으니 별 무리가 없겠지 생각했는데
글들을 찾아보니 수온변화가 심하면 면역력이 떨어져서 백점병이 걸리기 쉽다는 것이다.
부랴부랴 히터를 다시 가동 했지만 이미 때는 늦은 것 같다.
먼저 도리의 몸이 하얗게 되면서 용궁으로 가더니 니모 2마리도 곧 뒤따라서 갔다.
이제 남은 건 크리너새우와 산호 3덩이(머쉬룸, 옐로우 폴리플랩, 스타 폴리플랩)
잘 키워서 아래 사진 처럼 만들어야지...
Green Mushroom

Star Polyp

Yellow Polyp

2017년 5월 9일 화요일

[Philippines] Island hopping tour in Bohol

필리핀 보홀 투어상품중에 가장 유명한 Island hopping tour를 했습니다.
업체별로 Island hopping tour, Dolphine watching tour 등
다양한 이름의 투어로 존재하는데 스케쥴과 가격은 거의 동일 합니다.
오전 6시에 출발해서 오후 1시 정도에 마무리가 되는 투어입니다.

Itinerary
  1. Dolphin watching
  2. Balicasag island
  3. Snorkeling around Balicasag island(Optional)
  4. Virgin island
새벽이지만 해는 이미 떳습니다. 아침 햇살을 맞으면 돌고래를 보러 출바알~

업체별로 일정이 동일하니 비슷한 시간에 모두 같은 곳을 향해 갑니다.
돌고래가 출몰하는 지점으로 50여대의 배들이 모여듭니다.
많은 배들이 한곳을 향해서 가는 모습이 게임의 한장면을 보는것 같습니다.

드디어 우리배 근처로도 돌고래가 나타났습니다. 야생이라 그런지 왠지 활기차 보입니다.
돌고래가 매일 아침 이곳에 나타나는걸 보면 양식장 아닌가 하는 생각도 듭니다.

돌고래를 본 후에 배는 이제 발리카삭섬으로 향합니다.
섬 주변으로 정말 많은 배들이 정박해 있습니다.
해변가에서 사진도 찍고 매점에서 음료수 사먹으면서 쉬고 있으니
가이드가 스노클링 장비와 구명조끼를 준비해 줍니다.
가이드가 다음 스케쥴이 어떻게 되는지, 언제 출발하는지에 대한 것을 이야기 하지 않아서 좀 답답했습니다.
처음 해보는 스노클링... 힘들었지만 정말 재밌었습니다.
오죽하면 스노클 장비를 사서 매일 바다에 가서 연습을 했을까...

포카리스웨트를 찍은 장소로 유명하다는 버진 아일랜드로 향했습니다.
저 멀리 보이는 섬이 버진 아일랜드.
저 섬에서 샤랄라 하는 사진좀 찍어 볼려고 했는데 실상은...

음식 먹는 곳입니다. 우리나라 전복과 비슷하게 생기긴 했는데 전복은 아니겠죠.
약간 비싸긴 했지만 왔으니 먹어봐야죠. 쫄깃쫄깃 비린맛 안나고 맛있었습니다.


다음에 또 간다면 그냥 배 근처에서 수영하면서 놀아야겠습니다.
이렇게 깨끗한 바다를 언제 또 가볼려나...