2014-10-19 3 views
1

Я пытаюсь транслировать видео в реальном времени с веб-камеры 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

+0

Возможно, использовать Wireshark, чтобы проверить, что происходит на уровне RTSP - соединение открыто, найден ли дорожка? Если трек не найден, проблема, скорее всего, будет на ffserver, иначе, если данные будут нажаты, могут возникнуть проблемы с форматом, который Android не может обработать. –

+0

Я проверил форматы, поддерживаемые 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

+0

И logcat в Android Studio показывает следующая ошибка MediaPlayer: ошибка (1, -2147483648), которая неизвестна (описано здесь [http://stackoverflow.com/questions/11540076/android-mediaplayer-error-1-2147483648)) – grzebyk

ответ

0

Эта ошибка, скорее всего, вызвана различными параметрами кодирования для VLC и FFmpeg. VLC может использовать параметры кодирования, поддерживаемые Android, но FFmpeg может использовать неподдерживаемые (наиболее вероятно AVC-профиль и уровень). Попробуйте форсировать базовый или основной профиль и формат YUV 4: 2: 0 с помощью параметров командной строки FFmpeg и ffserver.config.

Смежные вопросы