2022년 12월 8일 목요일
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일 수요일
2022년 5월 24일 화요일
화면 가로/세로 모드 조정하기
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
2. 세로 모드 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
2022년 4월 21일 목요일
Windows에서 webcam을 이용해서 RTSC 서버 구축과 영상 스트리밍하기
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일 금요일
2022년 1월 20일 목요일
How to generate .jks file with .pk8 and .pem
ValueAnimator 를 이용한 애니메이션 만들기
기존에는 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 명령어
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 관련 정리
Timer와 TimerTask를 이용한 반복 작업 구현.
아래 예제는 15초 동안 5초마다 한번 씩 작업하는 예제
2. 일정 시간마다 작업하기를 원할 때
CountDownTimer를 이용한 반복 작업 구현.
아래 예제는 10초 동안 0.5초마다 한번 씩 작업하는 예제
3. 일정 시간 후에 한 번 원하는 작업을 하고 싶을 때
아래 예제는 1초 후에 한번 작업하는 예제
2020년 8월 17일 월요일
Drawerlayout drag 영역 변경 하기
이 영역을 변경할 수 있는 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();
}
}
2019년 6월 15일 토요일
2018년 8월 19일 일요일
[Japan] 홋카이도 여행
2018년 3월 9일 금요일
[Korea] 강화도
2017년 7월 30일 일요일
[Korea] 진관사의 여름
2017년 7월 17일 월요일
[Korea] 서울 밤 도깨비 야시장 @청계천
2017년 7월 14일 금요일
When youtube is slow on chrome browser
- Write on URL 'chrome://flags'
- Find 'QUIC'
- Set 'Disabled'
2017년 6월 29일 목요일
유럽배낭여행 - 80일간의 루트
2017년 6월 15일 목요일
니모와 도리는 잊고 산호를 키워보자.
2017년 5월 9일 화요일
[Philippines] Island hopping tour in Bohol
- Dolphin watching
- Balicasag island
- Snorkeling around Balicasag island(Optional)
- Virgin island






















