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

RTSP 스트리밍 소리 문제.

0 추천
안녕하세요.

RTSP로 영상을 스트리밍 하는것은 되나, 소리가 출력되지 않는 문제가 발생하였습니다.

AudioManager로 시도를 해보았으나 안되서 AudioStream을 써야 하는지

아니면 다른 문제가 있는 것인지 알고 싶습니다.
월희 (270 포인트) 님이 2015년 10월 16일 질문

1개의 답변

0 추천
 
채택된 답변
오디오 코덱이 AAC, AMR, G711라면 나와야 할텐데.  어떤 형식인가요? mp3, PCM L16BE 같은 건 지원 안됩니다.

지원하는 코덱인데도 안나온다면,

sdp 값을 파싱  못 하는 부분이 있을 수도 있을 듯 합니다.

DESCRIBE 응답  값을 올려 주시면 확인 해 드리겠습니다.
익명사용자 님이 2015년 10월 16일 답변
월희님이 2015년 10월 16일 채택됨
일단 제가 초보여서 describe 응답 값이라는게 어떤 의미인지 잘 몰라서,
 소스 코드 올려볼게요. 일단...
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.31: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("rtsp://admin:glffhdi@192.168.0.31:554/stream.sdp");

        try {
            // Specify the IP camera's URL and auth headers.
            _mediaPlayer.setDataSource(context, source, null);
            // 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();
    }
}
이렇게 코딩 했구요
피씨에서 rtsp로 VLC 플레이어 돌리면 영상이랑 음성 둘 다 잘나옵니다.
근데 문제는 안드로이드에서 영상은 나오는데 음성이 안나오는걸로 봐선
제가 설정을 안해줬거나 코덱이 안맞아서 그런거 같습니다.
코드상 큰 이상이 없는 듯 합니다. DESCRIBE 시 내려오는 값이 sdp 정보인데,
사용하신 경우에는 sdp를 직접 받아 재생을 수행한 듯 합니다.
 stream.sdp 파일의 정보를 적어 주시면 추가 분석 해 드리겠습니다.
VLC 플레이어로 본 stream.sdp의 정보 알려드립니다.
스트림0
형식: 비디오
코덱: H264 - MPEG-4 AVC (part 10) (h264)
해상도: 1280x738
화면 해상도:1280x720
디코딩된 형식: Planar 4:2:0 YUV full scale

스트림1
형식:오디오
코덱:PCM ALAW (alaw)
채널 : 모노
샘플 레이트 : 8000hz
샘플당 비트: 16

이상입니당
죄송합니다. 제가 착각 했습니다. PCM ALAW 가 G711_ALAW 형식이네요.. 안드로이드에서 지원하는 오디오 형식인데.. 재생이 안된다니 이상하네요.. 재생 시 로그를 올려 주시면 확인 해 보겠습니다.
...