goprowifihack icon indicating copy to clipboard operation
goprowifihack copied to clipboard

GoPro stream latency on android app

Open ghost opened this issue 2 years ago • 4 comments

Problem: I made an android apk for displaying GoPro stream, but when I start it, I have 3 or 4 seconds of latencies. But when I change the framerate using the GoPro, it seems to reload the stream and the latency go back to 1 second or less. So I tried using Wifi command to change framerate but it doesn't work. I suppose the problem is coming from my settings because it keeps packets it shouldn't keep. http://10.5.5.9/gp/gpControl/setting/3/9

Details: To receive that stream, I'm using libvlc and FFmpeg-kit :

ArrayList<String> _Options = new ArrayList<String>(); _Options.add("--file-caching=2000"); _Options.add("--network-caching=150"); _Options.add("--clock-jitter=0"); _Options.add("--live-caching=200"); _Options.add("--clock-synchro=0"); _Options.add("--drop-late-frames"); _Options.add("--skip-frames"); _Options.add("-vvv"); _myLibVlc = new LibVLC(findViewById(android.R.id.content).getContext(), _Options); _myPlayer = new MediaPlayer(_myLibVlc); _myVout = _myPlayer.getVLCVout();

private String cmd = "-an -flags low_delay -flags2 fast -fflags nobuffer -f:v mpegts -probesize 2048 -r 12 -i udp://10.5.5.100:8554 -max_delay 1000 -preset ultrafast -vcodec libx264 -tune zerolatency -f mpegts -vcodec copy udp://127.0.0.1:12345";

FFmpegKit.execute(cmd);

  • GoPro Camera(s): GoPro HERO 5

  • Firmware Version: Android 12 libvlc : org.videolan.android:libvlc-all:3.1.12 FFmpeg-kit : libs/ffmpeg-kit-full-4.5.1-1.aar

  • Steps to reproduce: Launch GoPro stream with latency and change the video mode framerate to 24 (even if it's already 24)

  • Happens every time? [Y/N]: Sometimes but not everytime

ghost avatar Oct 27 '22 06:10 ghost

Use Exoplayer with LoadControl and set minBuffer to 900ms and maxBuffer to 1100ms. For me it works with Hero5 and Hero8 without problems. Example: PreviewActivity.java

And by the way: ffmpeg-kit-min is enough for that. This will make the APK file smaller.

sepp89117 avatar Jan 19 '23 19:01 sepp89117

Thanks for the tip

But I kind of figured out that my options weren't working because I was declaring them like every stack overflow answer. Though, it worked when I did it that way :

    ArrayList<String> _Options = new ArrayList<>();
    _Options.add("--file-caching=2000");
    _Options.add("-vvv");
    _myLibVlc = new LibVLC(findViewById(android.R.id.content).getContext(), _Options);
    _myPlayer = new MediaPlayer(_myLibVlc);
    _myPlayer.getVLCVout();
    _myPlayer.attachViews(_myVideoView, null, false, false);
    Media media = new Media(_myLibVlc, Uri.parse("udp://@:12345"));
    media.setHWDecoderEnabled(true, true);
    media.addOption(":file-caching=0");
    media.addOption(":network-caching=0");
    media.addOption(":live-caching=0");
    media.addOption(":clock-jitter=0");
    media.addOption(":clock-synchro=0");
    media.addOption(":drop-late-frames");
    media.addOption(":skip-frames");
    _myPlayer.setMedia(media);
    //_myPlayer.setRate(1.5f);
    _myPlayer.play();

ghost avatar Jan 19 '23 21:01 ghost

That makes me happy! What latencies do you have now? I have about a second latency with my solution.

Best regards

sepp89117 avatar Jan 23 '23 17:01 sepp89117

I also have about a second (which is better than 3-4 seconds that were getting longer over time) But if I try to set playback x2, it nearly catch up to be around 300ms, then it stop because the buffer is empty (normal since I'm trying to play x2 with a live)

ghost avatar Jan 23 '23 18:01 ghost