[AI] 이것저것

Android - CCTV 영상을 서버로 중계 (RTSP - RTMP)

ParkSaJang 2024. 6. 28. 16:03

네트워크 카메라에서 RTSP 스트림을 안드로이드 PC로 받아서 이를 서버로 전달하는 방법은 다음과 같습니다.

 

1. RTSP 스트림 받기: 안드로이드에서 RTSP 스트림을 받아들이기 위해서 libvlc 라이브러리를 사용할 수 있습니다. 이는 VLC 미디어 플레이어의 안드로이드 라이브러리 버전입니다.

build.gradle 파일에 의존성 추가:

gradle코드 복사
implementation 'org.videolan.android:libvlc-all:3.3.12'

  

      RTSP 스트림 재생 코드:

import org.videolan.libvlc.LibVLC
import org.videolan.libvlc.Media
import org.videolan.libvlc.MediaPlayer

class RTSPStreamActivity : AppCompatActivity() {
    private lateinit var libVLC: LibVLC
    private lateinit var mediaPlayer: MediaPlayer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_rtsp_stream)

        libVLC = LibVLC(this)
        mediaPlayer = MediaPlayer(libVLC)

        val rtspUrl = "rtsp://your_camera_ip:port/stream"
        val media = Media(libVLC, Uri.parse(rtspUrl))
        mediaPlayer.media = media
        mediaPlayer.attachViews(yourSurfaceView, null, false, false)
        mediaPlayer.play()
    }

    override fun onDestroy() {
        super.onDestroy()
        mediaPlayer.stop()
        mediaPlayer.release()
        libVLC.release()
    }
}

 

 

2. 영상 데이터 인코딩 및 전송:

RTSP 스트림을 받아들이고 나서 이를 서버로 전송하기 위해 인코딩하고 전송해야 합니다. FFmpeg 라이브러리를 사용하여 RTSP 스트림을 RTMP로 변환하고 서버로 전송할 수 있습니다. 안드로이드에서 FFmpeg를 사용하려면 FFmpeg를 JNI를 통해 호출할 수 있습니다.

build.gradle 파일에 FFmpeg 라이브러리 추가:

gradle코드 복사
implementation 'com.arthenica:mobile-ffmpeg-full:4.4'

 

RTSP를 RTMP로 변환 및 전송하는 코드:

import com.arthenica.mobileffmpeg.FFmpeg

class StreamConverter {
    fun convertAndStream(rtspUrl: String, rtmpUrl: String) {
        val cmd = "-i $rtspUrl -c:v libx264 -preset veryfast -b:v 1500k -maxrate 1500k -bufsize 3000k -vf format=yuv420p -g 50 -c:a aac -b:a 128k -ar 44100 -ac 2 -f flv $rtmpUrl"
        val rc = FFmpeg.execute(cmd)

        if (rc == Config.RETURN_CODE_SUCCESS) {
            Log.i("FFmpeg", "Command execution completed successfully.")
        } else {
            Log.e("FFmpeg", "Command execution failed with rc=$rc.")
        }
    }
}

 

3. 서버 설정:

Nginx와 RTMP 모듈을 사용하여 RTMP 스트림을 수신하도록 설정합니다. 위에서 제공한 Nginx 설정을 사용하여 RTMP 서버를 구성할 수 있습니다.

 

Nginx 설정 예시:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;
        }
    }
}

위의 단계를 통해 안드로이드 PC에서 RTSP 스트림을 받아 서버로 전송할 수 있습니다. 이는 네트워크 카메라에서 실시간 영상을 가져와서 안드로이드 장치에서 처리하고 서버로 전달하는 방식입니다. 이 방법을 통해 실제 CCTV의 영상 정보를 서버로 안전하게 전달할 수 있습니다.

반응형