Ffmpeg rtsp 옵션 - Ffmpeg rtsp obsyeon

Ffmpeg rtsp 옵션 - Ffmpeg rtsp obsyeon

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

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

ffmpeg -i 123.mp4 123.avi

// 열화된 저품질 (저용량) 의 .extension 로 변환함

ffmpeg -i 123.mp4 -codec copy 123.avi

// 소폭의 손실이 존재하나, 고품질의 .extension 로 변환함

// 상호 변환이 가능하며 다른 확장자로도 변환이 가능함.
// 기본적으로 코덱을 유지하는 방향으로 설계되므로 오류 가능성이 있음.

cs

3. change AudioCodec 

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

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 계열] 이므로 앵간한 기기에서 대부분 지원한다