마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

CCTV 영상 모바일로 RTSP 스트리밍 재생 질문합니다.

0 추천
안녕하세요.

지금 저희 프로젝트로 CCTV 영상을 모바일로 스트리밍 하여 재생하는 것을 하려고 하는데요.

RTSP로 스트리밍을 하고 SurfaceView로 받게 하여 재생 시키게 하였는데

블랙 스크린만 뜨고 영상이 안뜹니다. 반대로 pc에서 VLC 플레이어로 재생시키면 영상이 나옵니다.

VideoView를 이용하면 동영상이 재생되지 않습니까?라는 팝업창이 뜨면서 비디오가 안떠서

surfaceview를 이용하였는데. 원래 surfaceview로는 안되는건가요?

아니면 예외적인 문제로 코덱이나 플레이어 문제인가요?

코딩 한 소스는 밑에 적어 둡니다. 확인하여 주시고 도와주세요 ㅠㅠ

<Java Source>

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener,
SurfaceHolder.Callback {

    final static String USERNAME = "admin";
    final static String PASSWORD = "glffhdi";
    final static String URLstring = "rtsp://192.168.0.34:554/stream.sdp";

    private MediaPlayer _mediaPlayer;
    private SurfaceHolder _surfaceHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Set up a full-screen black window.
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getWindow();
        window.setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.setBackgroundDrawableResource(android.R.color.black);

        setContentView(R.layout.activity_main);

        // Configure the view that renders live video.
        SurfaceView surfaceView =
                (SurfaceView) findViewById(R.id.surfaceView);
        _surfaceHolder = surfaceView.getHolder();
        _surfaceHolder.addCallback(this);
        _surfaceHolder.setFixedSize(320, 240);
    }

    @Override
    public void surfaceChanged(
            SurfaceHolder sh, int f, int w, int h) {
    }

    @Override
    public void surfaceCreated(SurfaceHolder sh) {
        _mediaPlayer = new MediaPlayer();
        _mediaPlayer.setDisplay(_surfaceHolder);

        Context context = getApplicationContext();
        Map<String, String> headers = getRtspHeaders();
        Uri source = Uri.parse(URLstring);

        try {
            // Specify the IP camera's URL and auth headers.
            _mediaPlayer.setDataSource(context, source, headers);
            // Begin the process of setting up a video stream.
            _mediaPlayer.setOnPreparedListener(this);
            _mediaPlayer.prepareAsync();
        } catch (Exception e) {
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder sh) {
        _mediaPlayer.release();
    }

    private Map<String, String> getRtspHeaders() {
        Map<String, String> headers = new HashMap<String, String>();
        String basicAuthValue = getBasicAuthValue(USERNAME, PASSWORD);
        headers.put("Authorization", basicAuthValue);
        return headers;
    }

    private String getBasicAuthValue(String usr, String pwd) {
        String credentials = usr + ":" + pwd;
        int flags = Base64.URL_SAFE | Base64.NO_WRAP;
        byte[] bytes = credentials.getBytes();
        return "Basic " + Base64.encodeToString(bytes, flags);
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }

}

 

 

xml 소스

<SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </SurfaceView>
월희 (270 포인트) 님이 2015년 10월 5일 질문

1개의 답변

0 추천
 
채택된 답변

적어주신 내용만으로는 정확한 답변이 어렵습니다.

영상 코덱 형식이 맞지 않을 수도 있고, RTSP 서버 프로토콜 중 지원하지 못하는 부분이 있을 수도 있습니다.

단말에서 지원을 하지 않을 수도 있고요.

단지 젤리빈 이상이고, 코덱이 H264, AAC면 어지간하면 동작을 할 겁니다.

맞는데도 동작을 하지 않는다면  BasicAuth 방식으로 RTSP 인증을 하는게 문제일 수도 있을 듯 합니다.

 Uri source = Uri.parse("rtsp://admin:glffhdi@192.168.0.34:554/stream.sdp"); 

 _mediaPlayer.setDataSource(context, source, null);  로 돌려 보시는게 좋을 듯 합니다. 

 

그리고 VideoView도 surfaceview 를 상속받아 구현 한거라.. 동작상 큰차이는 없습니다. 

사악미소 (65,330 포인트) 님이 2015년 10월 5일 답변
사악미소님이 2015년 10월 5일 수정
네 인증 문제였네요. 감사합니다 ㅠㅠ!!
저도같은 문제인데, vlc로 서버에서
cvlc v4l2:///dev/video0 --v4l2-width 640 --v4l2-height 480 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}' 이런식으로 동영상 스트리밍을 시작합니다.(라즈베리)
그런데 저는 user명이나 password가 따로 입력하는 부분이 없어서요 ㅠ 기본적으로 vlc가 가지고있는 아이디나 패스워드 인증키가 있는건가요?? 아니면 제가 서버에서 스트리밍 명령어를 잘못친걸까요?
...