Я пытаюсь сделать простое приложение для 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