Я пытаюсь транслировать видео в реальном времени с веб-камеры Ubuntu 12.04 на Android-устройство с KitKat. До сих пор я написал файл конфигурации ffserver, чтобы получать фид ffm и транслировать его через протокол rtsp. Я могу смотреть поток на другом компьютере в той же локальной сети с ffplay.Поток с низкой задержкой RTSP видео на Android с ffmpeg
Как смотреть поток на устройстве Android? Следующий код работает хорошо, когда веб-камера изображение потоковый с VLC, но не с FFmpeg:
public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener,
SurfaceHolder.Callback {
final static String RTSP_URL = "rtsp://192.168.1.54:4424/test.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);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
// Configure the view that renders live video.
SurfaceView videoView =
(SurfaceView) findViewById(R.id.videoView); //where R.id.videoView is a simple SurfaceView element in the layout xml file
_surfaceHolder = videoView.getHolder();
_surfaceHolder.addCallback(this);
_surfaceHolder.setFixedSize(320, 240);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
_mediaPlayer = new MediaPlayer();
_mediaPlayer.setDisplay(_surfaceHolder);
Context context = getApplicationContext();
Uri source = Uri.parse(RTSP_URL);
try {
// Specify the IP camera's URL and auth headers.
_mediaPlayer.setDataSource(context, source);
// Begin the process of setting up a video stream.
_mediaPlayer.setOnPreparedListener(this);
_mediaPlayer.prepareAsync();
}
catch (Exception e) {}
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
_mediaPlayer.start();
}
}
Моим ffserver.config файл:
HTTPPort 8090
RTSPBindAddress 0.0.0.0
RTSPPort 4424
MaxBandwidth 10000
CustomLog -
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 20M
ACL allow 127.0.0.1
</Feed>
<Stream test1.sdp>
Feed feed1.ffm
Format rtp
VideoCodec libx264
VideoSize 640x480
AVOptionVideo flags +global_header
AVOptionVideo me_range 16
AVOptionVideo qdiff 4
AVOptionVideo qmin 10
AVOptionVideo qmax 51
Noaudio
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
Я начинаю поток с помощью следующей команды: ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -b:v 600k http://localhost:8090/feed1.ffm
Возможно, использовать Wireshark, чтобы проверить, что происходит на уровне RTSP - соединение открыто, найден ли дорожка? Если трек не найден, проблема, скорее всего, будет на ffserver, иначе, если данные будут нажаты, могут возникнуть проблемы с форматом, который Android не может обработать. –
Я проверил форматы, поддерживаемые android [здесь] (http://developer.android.com/guide/appendix/media-formats.html), и я использую поддерживаемый. Я также уверен, что соединение открывается и зарегистрировано ffserver. Консольный выход: 'Mon Oct 20 17:04:53 2014 192.168.1.55 - - [DESCRIBE]" rtsp: //192.168.1.54: 4424/test.sdp RTSP/1.0 "200 72' – grzebyk
И logcat в Android Studio показывает следующая ошибка MediaPlayer: ошибка (1, -2147483648), которая неизвестна (описано здесь [http://stackoverflow.com/questions/11540076/android-mediaplayer-error-1-2147483648)) – grzebyk