Android Studio: ошибка «live555 demux: данные не получены в течение 10 секунд, прерывание» после успешного подключения к серверу rtsp - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь сделать простое приложение для Android с помощью Android Studio, которая отображает только видеопоток с камеры, подключенной к малине. На моей малине я использую эту командную строку vlc:

cvlc -vvv v4l2:///dev/video0:chroma=mp2v --v4l2-width 640 --v4l2-height 360 --sout '#transcode{vcodec=mp2v,acodec=mpga,fps=10}:rtp{mux=ts,sdp=rtsp://:8554/live.sdp}' Я проверил это с VLC на Windows.

На стороне приложения я использую vlc android sdk https://github.com/mrmaffen/vlc-android-sdk для отображения видеопотока.

Это код действия, которое должно отображать видео:

public class VideoActivity  extends Activity implements IVLCVout.Callback    {
    public final static String TAG = "VideoActivity";

    public static final String RTSP_URL = "rtspurl";

    // display surface
    private SurfaceView mSurface;
    private SurfaceHolder holder;

    // media player
    private LibVLC libvlc;
    private MediaPlayer mMediaPlayer = null;
    private int mVideoWidth;
    private int mVideoHeight;
    private final static int VideoSizeChanged = -1;


    private MediaPlayer.EventListener mPlayerListener = new MyPlayerListener(this);

    private String rtspUrl;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);

        // Get URL
        Intent intent = getIntent();
        rtspUrl = intent.getExtras().getString(RTSP_URL);
        Log.d(TAG, "Playing back " + rtspUrl);

        mSurface = (SurfaceView) findViewById(R.id.surface);
        holder = mSurface.getHolder();
        //holder.addCallback(this);

        ArrayList<String> options = new ArrayList<String>();
        options.add("--rtsp-tcp");
        options.add("--vout=opensles");
        options.add("--aout=opensles");
        options.add("--audio-time-stretch"); // time stretching
        options.add("-vvv"); // verbosity



        libvlc = new LibVLC(getApplicationContext(), options);
        holder.setKeepScreenOn(true);

        // Create media player
        mMediaPlayer = new MediaPlayer(libvlc);
        mMediaPlayer.setEventListener(mPlayerListener);

        // Set up video output
        final IVLCVout vout = mMediaPlayer.getVLCVout();
        vout.setVideoView(mSurface);
        //vout.setSubtitlesView(mSurfaceSubtitles);
        vout.addCallback(this);
        vout.attachViews();

        Media m = new Media(libvlc, Uri.parse(rtspUrl));

        mMediaPlayer.setMedia(m);
        mMediaPlayer.play();

    }
...
}

Кажется, приложение успешно подключается к моей малине, но после подключения данные не принимаются, и возникает ошибка "данные не получены в течение 10 с, прерывание". На эмуляторе ничего не происходит и экран остается черным.

журналы:

...
07-03 10:46:19.080 31351-31404/com.example.testrtsp D/VLC: [ae912190/7aac] libvlc demux: play start: 1956.642219 stop:0.000000
07-03 10:46:19.080 31351-31404/com.example.testrtsp D/VLC: [ae912190/7aac] libvlc demux: using access_demux module "live555"
07-03 10:46:19.081 31351-31404/com.example.testrtsp D/VLC: [ae914190/7aac] libvlc demux meta: looking for meta reader module matching "any": 2 candidates
07-03 10:46:19.081 31351-31404/com.example.testrtsp D/VLC: [ae914190/7aac] libvlc demux meta: Trying Lua scripts in /data/data/com.example.testrtsp/app_vlc/.share/lua/meta/reader
07-03 10:46:19.081 31351-31404/com.example.testrtsp D/VLC: [ae914190/7aac] libvlc demux meta: Trying Lua scripts in /data/app/com.example.testrtsp-1/lib/x86/vlc/lua/meta/reader
07-03 10:46:19.081 31351-31404/com.example.testrtsp D/VLC: [ae914190/7aac] libvlc demux meta: Trying Lua scripts in /system/usr/share/lua/meta/reader
07-03 10:46:19.082 31351-31404/com.example.testrtsp D/VLC: [ae914190/7aac] libvlc demux meta: no meta reader modules matched
07-03 10:46:19.082 31351-31404/com.example.testrtsp D/VLC: [b3d02c30/7aac] libvlc input: `rtsp://192.168.137.198:8554/live.sdp' successfully opened
07-03 10:46:29.630 31351-31404/com.example.testrtsp E/VLC: [ae912190/7aac] libvlc demux: no data received in 10s, aborting
07-03 10:46:29.630 31351-31404/com.example.testrtsp D/VLC: [b3d02c30/7aac] libvlc input: EOF reached
07-03 10:46:29.630 31351-31351/com.example.testrtsp D/PlayerListener: MediaPlayerEndReached
07-03 10:46:29.632 31351-31404/com.example.testrtsp D/VLC: [ae912190/7aac] libvlc demux: removing module "live555"
07-03 10:46:29.634 31351-31406/com.example.testrtsp D/VLC: [ae9125f0/7aae] libvlc demux: no demux modules matched
...

Я исследовал с помощью wireshark: Wireshark Порты, которые должны принимать потоки, кажутся недостижимыми.

Я попытался принудительно установить rtsp через TCP вместо UDP, добавив опцию --rtsp-tcp, и настроить статические порты, но, похоже, это не дает никакого эффекта.

У меня нет опыта в обработке видео и только немного в разработке приложений для Android, и я даже не уверен, откуда возникла ошибка, поэтому, если у вас есть предложение, не стесняйтесь опубликовать его.

EDIT: Я попытался выполнить потоковую передачу с компьютера, на котором размещен эмулятор, и сообщение об ошибке не отображается. журналы:

07-03 13:30:14.632 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: creating access: rtsp://192.168.137.1:8554/live.sdp
07-03 13:30:14.632 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: looking for access module matching "rtsp": 23 candidates
07-03 13:30:14.632 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: try to open 'rtsp://192.168.137.1:8554/live.sdp'
07-03 13:30:14.632 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: connect to host '192.168.137.1'
07-03 13:30:14.632 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: net: connecting to 192.168.137.1 port 8554
07-03 13:30:14.633 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: connection succeeded (socket = 42)
07-03 13:30:14.633 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: net: opening 0.0.0.0 datagram port 9416
07-03 13:30:14.634 31685-31757/com.example.testrtsp D/VLC: [a3ebd4f0/7c0d] libvlc stream: net: opening 0.0.0.0 datagram port 9417
...