Уменьшение задержки в приложении для видеопотока с поддержкой Wi-Fi

В настоящее время у меня есть рабочее приложение-прототип, который передает данные с камеры одного телефона на другой экран телефона.

Однако задержка между потоком и фактическим видео варьируется от 1 секунды до 5 секунд. Для моего конкретного случая использования мне нужна задержка менее 1 секунды.

Я обнаружил, что битрейт / разрешение не влияет на задержку.

Я использую библиотеку libstreaming для потоковой передачи видео h264 поверх wifi-direct.

Он, похоже, поддерживает кодирование h263 или h264 … и я обнаружил, что h263 работает не так последовательно, как h264.

Вот код, который захватывает видео и потоки на сервере RTSP:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_server); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mSurfaceView = (SurfaceView) findViewById(R.id.surface); // Sets the port of the RTSP server to 8988 Editor editor = PreferenceManager.getDefaultSharedPreferences( getApplicationContext()).edit(); editor.putString(RtspServer.KEY_PORT, String.valueOf(8988)); editor.commit(); // Get bitrate int bitrate = Integer.valueOf(getIntent().getStringExtra(BITRATE)); if (bitrate < 100000) bitrate = 100000; // Get resolution String resolution = getIntent().getStringExtra(RESOLUTION); int resX = 176; int resY = 144; if (resolution.equals("352x288")) { resX = 352; resY = 288; } else if (resolution.equals("528x432")) { resX = 528; resY = 432; } else if (resolution.equals("704x576")) { resX = 704; resY = 576; } else { resX = 176; resY = 144; } Toast.makeText(this, "Resolution: " + resX + "x" + resY + ", Bitrate: " + bitrate, Toast.LENGTH_LONG).show(); // Configures the SessionBuilder SessionBuilder.getInstance().setSurfaceView(mSurfaceView) .setPreviewOrientation(0).setContext(this) .setVideoQuality(new VideoQuality(resX, resY, 20, bitrate)) .setAudioEncoder(SessionBuilder.AUDIO_NONE) .setVideoEncoder(SessionBuilder.VIDEO_H264); // Starts the RTSP server getApplicationContext().startService( new Intent(getApplicationContext(), RtspServer.class)); } 

И это код для просмотра потокового видео:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_client); mVideoIP = getIntent().getStringExtra(SERVER_IP); mSurfaceView = (SurfaceView) findViewById(R.id.surface_view); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); if (savedInstanceState == null) { } } ... @Override public void surfaceCreated(SurfaceHolder holder) { try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDisplay(mSurfaceHolder); mMediaPlayer.setDataSource("rtsp://" + mVideoIP + ":8988"); mMediaPlayer.prepare(); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setScreenOnWhilePlaying(true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }