Tôi đang phát luồng RTSP trực tiếp từ VLC trên PC đến lớp Android MediaPlayer (cả trên cùng một mạng cục bộ). Nó chơi trơn tru không có lỗi - vấn đề là video được giải mã trên màn hình nằm trong khoảng từ 5 đến 7 giây sau khi phát trực tiếp.Giải mã luồng RTSP trực tiếp: độ trễ video lớn bằng MediaPlayer trên Android
Từ gỡ lỗi và gọi lại Tôi có thể thấy dữ liệu trực tiếp đến trên thiết bị < 1s sau khi bắt đầu mMediaPlayer.prepareAsync()
. Đây là khi lớp MediaPlayer bắt đầu tìm ra định dạng luồng là gì với thứ nguyên vv. Sau đó, ngay trước khi video được hiển thị trên màn hình (từ 5 đến 7 giây sau), onPrepared()
được gọi là nơi tôi gọi mMediaPlayer.start()
. Có vẻ như đây là start()
phát video đã được bắt đầu từ giai đoạn bắt đầu của giai đoạn chuẩn bị.
Tôi đã thử seekTo(5000)
cả trước và sau start()
, nhưng nó không ảnh hưởng đến độ trễ.
Đối với ứng dụng gọi điện video trực tiếp, thời gian trễ thiết lập vài giây là hoàn toàn tốt, nhưng độ trễ này khi video được trình bày là không thể đạt được với tôi.
public void surfaceCreated(SurfaceHolder holder)
{
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setDataSource("rtsp://192.168.1.4:5544/test");
mMediaPlayer.setDisplay(holder);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.prepareAsync();
...
public void onPrepared(MediaPlayer mediaplayer)
{
mMediaPlayer.start();
...
Bất kỳ ý tưởng nào về cách tôi có thể giảm độ trễ này hoặc tìm đến phần cuối của bộ đệm được MediaPlayer đệm? Thiết bị của tôi là 3.1, minSdkVersion là 2.2.
EDIT:
Tôi đã tìm thấy một số nước đánh giá cao và thấp trong AwesomePlayer.cpp (2s và 8s). Như một bài kiểm tra nhanh, tôi đã hack libstagefright.so để tạo các số 0.1 và 1s này. Tuy nhiên điều này không ảnh hưởng đến sự chậm trễ. Tìm kiếm của tôi tiếp tục ...
NDK v7 hiện có quyền truy cập vào các API phát trực tuyến phương tiện OpenMax AL cấp thấp cho khi nguồn là một TS MPEG trên 4.0. Có ai có bất kỳ kinh nghiệm nào với điều này không - sự chậm trễ video có được cải thiện không? Tôi đọc trong các tài liệu: "Vì OpenMAX AL là một API C gốc, các luồng ứng dụng không phải Dalvik gọi là OpenMAX AL không có chi phí liên quan đến Dalvik như tạm dừng thu gom rác. Tuy nhiên, không có lợi ích hiệu năng bổ sung nào cho việc sử dụng OpenMAX AL ngoài điều này. Đặc biệt, việc sử dụng OpenMAX AL không dẫn đến độ trễ âm thanh hoặc video thấp hơn ... "Oh well. – barkside
Bạn có phiền khi cập nhật về tiến trình bạn đã thực hiện đối với điều này không? – Matt
Cuối cùng tôi đã sử dụng GStreamer (họ đã hỗ trợ Android ngay bây giờ) mang lại cho bạn nhiều quyền kiểm soát hơn đối với những thứ này ... bit của một cảnh sát tôi biết ... – barkside