0. windows 10 환경에서 FFmpeg 를 굳이 코딩하려 하지 말것.
불가능한건 아닌데, 굉장히 귀찮다. 예제만 20개를 넘게 본 듯 싶은데
최신버전 기준에서 제대로 동작하는 예제가 단하나도 없었다.
ffmpeg 는 Linux 기반 순수 C 언어로 작성되어 있음에 유의하라.
GCC Linux 기반에서는 동작할것이나, VS Windows 10 기반 C++ 에서는 굉장히 제한적으로 동작한다.
때문에 Windows 상에서 제대로 빌드하려면,
MinGW or WSL 환경 설정하랴, 예제에서 구현안된 기능 구현하는 다른 예제 찾아보랴.
여러모로 귀찮다. 최종기능 구현에 짧으면 이틀, 길면 4~5일까지도 날릴거고,
아무것도 모르는 초보자들은 원하는 기능 구현에 2주넘게 걸릴수도 있다.
잘 wrapping 된 라이브러리를 사용하는것도 방법이겠으나, 나는 그런 라이브러리를 발견하지 못했다.
그냥 .exe 기반으로 커맨드 날려서 쓰는것이 간편하고 강력하다.
FFmpeg 는 이미 잘 만들어진 프로그램이며, 특수한 상황이 아니면
FFmpeg 코드를 건들생각은 안하는게 좋다, 생산성을 반드시 고려하도록.
1. video streming
1-1 video streming send [monitor]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
ffmpeg -f gdigrab -framerate 30 -i desktop -vcodec mpeg4 -f mpegts udp://127.0.0.1:1234
// desktop 부분을 title 로 변경한 뒤, title="processName" 으로 특정 창만 스트리밍 가능.
ffmpeg -f gdigrab -offset_x 10 -offset_y 20 -video_size 1280x720 -framerate 30 -i desktop -vcodec mpeg4 -q 12 -f mpegts udp://127.0.0.1:1234
// -offset_x, -offset_y 옵션을 통해 화면상의 한 지점을 선택하고, 해당 지점으로부터 -video_size 옵션을 통해 해상도를 부여함.
// 위 옵션의 경우 화면 10,20 지점부터 1280x720 영역이 스트리밍 되게 됨.
ffmpeg -f gdigrab -framerate 30 -i desktop out.mk4 -vcodec mpeg4 -f mpegts udp://127.0.0.1:1234
// desktop 뒤에 파일 이름을 입력 함으로써, 스트리밍 되는 화면을 '파일' 로 저장하는것이 가능함.
// .mp4, .mkv 등은 buffer underflow 가 발생하지 않으나, 파일을 통해 실시간 화면을 보는것이 불가능하고
// .mpg 는 buffer underflow 가 발생하나, 파일을 통해 실시간 화면을 보는것이 가능해진다.
// .mpg 는 화질이 다소 열화되어 있으며, mp4, mkv 의 경우에는 선명하다.
ffmpeg -f gdigrab -framerate 30 -i desktop -b:v 10M -vcodec mpeg4 -f mpegts udp://127.0.0.1:1234
// -b:v 옵션을 통해서 평균 bitrate 값을 지정할 수 있음.
// -minrate 는 최소 오차범위를 지정할 수 있음
// -maxrate 는 최대 오차범위를 지정할 수 있음 -bufsize 옵션과 같이 사용됨.
// -bufsize 는 버퍼크기를 제어할 수 있음.
// 일반적으로 스트리밍 시에는 -b:v 만을 사용하며 bitRate 값은 해상도, fps 에 따라 권장값을 검색해 보는것을 권장.
// 나머지 옵션들은 품질저하를 감안하더라도 '출력' 그 자체가 중요한 경우에 사용.
// 주관적으론 b:v 만 쓰는걸 추천.
|
cs |
1-2. video streming receive
1
2
3
4
5
6
7
8
9
10
11
|
ffply udp://127.0.0.1:1234
//가장 간단한 옵션
ffplay -probesize 32 -f mpegts udp://127.0.0.1:1234
// 기본적으로 full size 의 window 로 streming 을 받을 수 있음.
// probesize 는 끊김을 방지하기 위한 버퍼역활을 하는데, 설정하지 않을 시 기본 size 는 5000000 임.
// 때문에 끊기지 않는 상황이 보장된다면 (통제된 로컬환경) "32" 같은 낮은 값으로 설정하길 권장.
ffplay.exe -probesize 32 -x 1280 -y 720 -f mpegts udp://127.0.0.1:1234
// -x, -y 옵션을 활용해서 full size 가 아닌, 특정 window 사이즈 만큼의 창을 띄울 수 있음.
// 이렇게 변경된 window 는 사용자가 줄이거나 늘리는것이 가능해 짐.
|
cs |
1-3. video streaming etc...
udp 가 아닌 rtsp 프로토콜의 경우 해당링크를 참조하길 바람.
공식문서의 경우에는 해당링크를 참조하기 바람.
2. change Extension
1
2
3
4
5
6
7
|
ffmpeg -i 123.mp4 123.avi
// 열화된 저품질 (저용량) 의 .extension 로 변환함
ffmpeg -i 123.mp4 -codec copy 123.avi
// 소폭의 손실이 존재하나, 고품질의 .extension 로 변환함
// 상호 변환이 가능하며 다른 확장자로도 변환이 가능함.
// 기본적으로 코덱을 유지하는 방향으로 설계되므로 오류 가능성이 있음. |
cs |
3. change AudioCodec
1
2
3
4
5
6
7
8
9
10
11
|
ffmpeg -i input.mkv -acodec libmpelame output.mkv
// 오디오코덱 mp3
ffmpeg -i input.mkv -acodec libaac output.mkv
// 오디오코덱 aac
ffmpeg -i input.mkv -acodec ac3 output.mkv
// 오디오코덱 ac3
ffmpeg -i input.mkv -acodec libx264 output.mkv
// 오디오코덱 h264
|
cs |
4. delete Subtitle
1
2
3
|
ffmpeg -i input.mkv -sn -c copy output.mkv
// 동영상 자막 없애기 (기본적으로 영상에 포함된 자막)
|
cs |
5. change chroma format
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
ffmpeg -i input.mkv -pix_fmt yuv420p output.mkv
// stackoverFlow 등에서 소개하는 방식
ffmpeg -i input.mkv -vf format=yuv420p output.mkv
// ffmpeg 공식 홈페이지에서 소개하는 방식을 변형함
ffmpeg -i input.mkv -c:v libx264 -vf format=yuv420p output.mkv
// ffmpeg 공식 홈페이지에서 소개하는 방식 [H264 코덱을 이용]
// 8-bit 4:2:0: yuv420p
// 8-bit 4:2:2: yuv422p
// 8-bit 4:4:4: yuv444p
// 10-bit 4:2:0: yuv420p10le
// 10-bit 4:2:2: yuv422p10le
// 10-bit 4:4:4: yuv444p10le
|
cs |
1, 2번째 문장은 뭘쓰던 똑같다 (아마 2번 문장이 1번문장의 최신본인듯 하나 내부 동작은 똑같은듯).
3번은 코덱 변경이 되므로 잘 모르는분은 1,2번을 쓰자.
다만 3번 x264 는 범용적으로 사용되는 코덱 [h264 계열] 이므로 앵간한 기기에서 대부분 지원한다
6. check audio track
ffmpeg -i input.mkv
7. remove audio track
ffmpeg -i input -map 0 -map -0:a:2 -c copy output
모든 스트림을 선택하고 (-map, 0) 그 중 특정 오디오 스트림을 선택해제 (-map -0:a:2) 한뒤 복사 (copy) 하여 출력한다.
a 뒤에 숫자 부분에 audio track 번호를 입력하면 된다. 0 부터 넘버링 됨에 유의하자.
-0:a:2 이면 트랙 '3' 은 제외된다.
'Tools > Etc' 카테고리의 다른 글
운전적성정밀검사 터널 시뮬레이션 (0) | 2021.12.22 |
---|---|
VS Code : Server for WSL closed unexpectedly (0) | 2021.05.28 |
Qt 5.15 버전 콘솔실행이 커맨드 창으로 안될때. (0) | 2021.04.13 |
로컬 환경에서 Git Server 구축하기 (0) | 2021.04.12 |
[MAK] VR-Forces 매뉴얼 [BEGINNER] (0) | 2021.04.10 |