구글애드센스


[GStreamer] 삽질 노트 Testing on CentOS 7 STUDY



* More 삽질

대충 빌드도 됐겠다 싶어서 실행해보려고 함.

test-mp4 라는 바이너리가 example 디렉토리에 생겼다. 딱 생김새를 보아하니 mp4 읽어서 스트리밍 해주는 것이리라.
근데 아무래도 localhost로 바인딩 하는 것 같아서 아이피 세팅해주는 것을 찾았다.

README에 나와있는 API 목록에는 못찾겠고.. 구글링 해보니까 저런 애가 있었음.

1
gst_rtsp_server_set_address(server, "211.189.132.118");

적당해 보이는 곳에 코드 삽입하고 재빌드하여 test-mp4 바이너리를 뽑아낸다.

mp4 파일을 만들어야하는데 복사하기 귀찮다. 
마침 내가 만들어 놓은 rtsp 서버가 있어서 ffmpeg으로 거기에 붙어 영상 끌어오면 되겠다고 생각을 했다.

1
ffmpeg -rtsp_transport tcp -i rtsp://[ip]:[port]/uri -acodec copy -vcodec copy output.mp4

대충 요러코롬 해서 덤프했고 test-mp4 output.mp4 를 실행했다.

포트도 열린거 같고 잘 된 것 같아서 VLC로 붙는 순간 에러발생.

1
Failed to create element 'rtpbin'

내용은 보니까 gst-plugin-good 이 설치 안되어있어서 라고 판단된다. 링크참고

다시 GST 저장소 에서 gst-plugin-good 1.9.1 버전을 다운로드하여 configure

또 다시 에러 발생.

1
Error “Xext not found”


옘병.

구글링 구글링~ 링크참고

yum install libXext-devel

설치한다. libXext 에서 첫번째 x가 대문자임을 조심한다. 고결하신  Yum 님께서는 대소문자를 가리신다.
완료 후 다시 실행하였으나 여전히 안됨. 뭐가 문젠지 모르겠다. -_-
좀더 삽질을..



2016/08/23 전체 재시작!!


* 삽질의 원인

CentOS7 에 설치되어있는 GStreamer 는 1.4.5 버전이다.  아무리 yum update 쳐봐도 업데이트 되질 않는다. 공홈에 최신버전은 1.9.1 버전인데 말이다! 

gst-rtsp-server 의 존재를 알게 되고 아무 생각 없이 1.9.1 버전을 받아서 설치하려고 하는데 GStreamer와 플러그인들의 버전이 맞질 않는다는 에러가 계속 떴다. (GStreamer의 버전은 플러그인들과 동일한 넘버링으로 가는 것으로 판단된다.) 그래서 GStreamer와 기타 플러그인을 1.9.1 로 업데이트 하기로 한다. 

지금와서 드는 생각이지만, 그냥 1.4.5 버전의 rtsp-server 를 설치했으면 됐는데 왜 업데이트 할려고 뻘짓하다 이 삽질을 하는지는 모르겠다.

* 업데이트 쳐야할 것들

gst-rtsp-server 는 기본적으로 gstreamer-1.0 모듈과 gst-plugins-base-1.0 모듈과 gst-plugins-good-1.0 모듈의 3개를 물고 돈다. 여기서 왜 1.9.1이 아니고 1.0 인지 헷갈릴 수 있는데 아마도 메이저 넘버만 따지고 마이너 첫번째 이하부분 부터는 따지지 않는 것 같다.

* 재설치 순서

yum으로 기존에 깔려있는 패키지를 삭제하는 방법이 있을텐데 어차피 전체 업데이트 칠꺼라서 그냥 덮어씌우기로 했다.

gstreamer 업데이트 : gstreamer-1.9.1 버전을 받는다. (링크는 위 GST 저장소 참고)

적당한 곳에 풀고 나는 configuration을 다음과 같이 했다.

1
2
3
4
4 It was created by GStreamer configure 1.9.1, which was
5 generated by GNU Autoconf 2.69. Invocation command line was
6
7 $ ./configure --prefix=/usr --bin=/usr/bin --libdir=/usr/lib64

libdir을 변경한 것은 pkg-config 때문이다. pkg-config는 적당한 위치에 있는 .pc 파일을 읽어서 어떤 모듈을 include 하거나 linking 할 때 쓸 수 있는 유틸리티 프로그램이다. 근데 요녀석이 기본적으로 읽는 pc 파일 경로가 centOS 7 의 경우에 /usr/lib64/pkgconfig 이다. make install 시에 라이브러리를 설치한 곳의 pkgconfig 디렉토리에 pc 파일을 복사하기 때문에 저렇게 지정해주었다. 물론 우회하는 방법이 있겠지만 설정 건드리고 복잡할 꺼 같아서 그냥 요렇게 한다.

make, make install 순서로 진행한다.

gst-plugins-base 업데이트 : 같은 버전의 gst-plugins-base 을 다운로드 한다. 

각설하고 configuration은 아래와 같다.

1
2
3
4
4 It was created by GStreamer Base Plug-ins configure 1.9.1, which was
5 generated by GNU Autoconf 2.69. Invocation command line was
6
7 $ ./configure --prefix=/usr --bin=/usr/bin --libdir=/usr/lib64

make, make install 순서로 진행한다.

gst-plugins-good 업데이트 : 같은 버전의 gst-plugins-good 을 다운로드 한다.
삽질을 여기서 많이 했는데, 이거 잘못했다가 no 'rtpmp4apay' element 라는 에러가 계속 떴다.

어쨌건 각설하고 configuration은 아래와 같다.

1
2
3
4
4 It was created by GStreamer Good Plug-ins configure 1.9.1, which was
5 generated by GNU Autoconf 2.69. Invocation command line was
6
7 $ ./configure --prefix=/usr --bin=/usr/bin --libdir=/usr/lib64 --disable-debug

--disable-debug 안하니까 no 'rtpmp4apay' element 라는 에러가 났는데.. 왠지 모르겠다. 

gst-rtsp-server  빌드 : 대망의 목표. 같은 버전으로 다운로드 받는다.

1
2
3
4
4 It was created by GStreamer RTSP Server Library configure 1.9.1, which was
5 generated by GNU Autoconf 2.69. Invocation command line was
6
7 $ ./configure --prefix=/usr --bin=/usr/bin --libdir=/usr/lib64

make, make install 해서 적절한 곳으로 바이너리들이 들어가도록 하자.

* 테스트

example 폴더에 가면 여러가지 예제들이 있었다. 일단 바이너리들이 제대로 설치되어있고 동작하는지 확인하려면 이 예제를 돌려보는게 가장 빠르다고 생각했다. 내가 고른건 test-mp4 예제이다. 이것은 파일을 읽어서 서비스해주는 말하자면 VOD 서버 같은 녀석이라고 생각하면 되겠다.

파일이 있어야 하니까 하나 만들기로 했다. 내 rtsp 서버에 붙어서 mp4를 덤프 떠놓는다.

1
ffmpeg -rtsp_transport tcp -i rtsp://somewhere/target.sdp -acodec copy -vcodec copy output.mp4

그리고 example 폴더로 이동하여 예제 프로그램 실행

1
./test-mp4 output.mp4

예제 프로그램은 127.0.0.1에 기본적으로 바인딩 하도록 구성되어있다. uri 주소는 아래와 같다.

1
rtsp://127.0.0.1/test

정상동작 하는지 알기 위해 ffmpeg으로 붙어보았다.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[muzie@sv01 ~]$ ffmpeg -rtsp_transport tcp -i rtsp://127.0.0.1:8554/test -acodec copy -vcodec copy yes.mp4
ffmpeg version 2.8.4 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.9.2 (GCC) 20150212 (Red Hat 4.9.2-6)
configuration: --enable-libx264 --enable-pthreads --enable-gpl --enable-static --disable-hwaccels --disable-indev=x11grab_xcb
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Input #0, rtsp, from 'rtsp://127.0.0.1:8554/test':
Metadata:
title : Session streamed with GStreamer
comment : rtsp-server
Duration: 00:03:07.22, start: 0.000000, bitrate: N/A
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080, 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0:1: Audio: aac (LC), 16000 Hz, mono, fltp
File 'yes.mp4' already exists. Overwrite ? [y/N] y
[mp4 @ 0x22343a0] Codec for stream 0 does not use global headers but container format requires global headers
[mp4 @ 0x22343a0] Codec for stream 1 does not use global headers but container format requires global headers
Output #0, mp4, to 'yes.mp4':
Metadata:
title : Session streamed with GStreamer
comment : rtsp-server
encoder : Lavf56.40.101
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=2-31, 30 fps, 30 tbr, 90k tbn, 90k tbc
Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 16000 Hz, mono
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0x22343a0] Non-monotonous DTS in output stream 0:1; previous: 31744, current: 29424; changing to 31745. This may result in incorrect timestamps in the output file.
[mp4 @ 0x22343a0] Non-monotonous DTS in output stream 0:1; previous: 31745, current: 30448; changing to 31746. This may result in incorrect timestamps in the output file.
[mp4 @ 0x22343a0] Non-monotonous DTS in output stream 0:1; previous: 31746, current: 31472; changing to 31747. This may result in incorrect timestamps in the output file.
frame= 167 fps= 58 q=-1.0 Lsize= 4280kB time=00:00:05.42 bitrate=6465.2kbits/s
video:4254kB audio:21kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.115132%

결과 성공.

하.. 사흘이나 걸렸다. 이제 이걸 NAL을 가지고 컨트롤 하는 법만 터득하면 왠만한 VMS 시스템은 뚝딱 만들 수 있을 각이다.



덧글

  • iamlow 2017/05/22 21:38 # 삭제 답글

    muzie 하이요^^ 잘보고 갑니다~~
  • muzie 2017/05/23 17:17 #

    ㅋㅋㅋㅋㅋㅋㅋㅋ 넹넹 채김님 ㅋㅋ
댓글 입력 영역