0

I have a JPG image in a directory that I update each time I got a new one and I have to send this image to a rtmp server. I fond that ffmpeg can do that but I thougt -loop 0 is suppose to loop over the image and see if it is refreshed but when I start my command inside my app it seem to start well and end with good Return Code (0) but don't seem to loop.

Here is my ffmpeg command : '-re -loop 0 -i $pathToFile -preset ultrafast -tune zerolatency -c:v libx264 -f flv $streamUrl'

This code execute the command :

     FFmpegKit.executeAsync(command, (session) async {

        if (ReturnCode.isSuccess(await session.getReturnCode())) {

          log('FFmpeg process exited with rc ${await session.getReturnCode()} in ${await session.getDuration()} milliseconds');

        } else if (ReturnCode.isCancel(await session.getReturnCode())) {

          log('FFmpeg process cancelled');

        } else {

          log('FFmpeg process failed with rc ${await session.getReturnCode()} in ${await session.getReturnCode()} milliseconds');

        }
      }, (session) {

        log('Message ${session.getMessage()}');

      }, (session) {

        log('Statistics ${session.toString()}');

      });

And finally I got those logs :

[log] Message [libx264 @ 0x7ccd0b6400] 264 - core 164 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=7 lookahead_threads=7 sliced_threads=1 slices=7 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
[log] Message Output #0, flv, to 'rtmp://stream.stream.url.com':
[log] Message   Metadata:
[log] Message     encoder         :
[log] Message Lavf59.27.100
[log] Message
[log] Message   Stream #0:0
[log] Message : Video: h264 ([7][0][0][0] / 0x0007), yuvj422p(pc, bt470bg/unknown/unknown, progressive), 640x480, q=2-31
[log] Message ,
[log] Message 25 fps,
[log] Message 1k tbn
[log] Message
[log] Message     Metadata:
[log] Message       encoder         :
[log] Message Lavc59.37.100 libx264
[log] Message
[log] Message     Side data:
[log] Message
[log] Message cpb:
[log] Message bitrate max/min/avg: 0/0/0 buffer size: 0
[log] Message vbv_delay: N/A
[log] Message
[log] Statistics Instance of 'Statistics'
[log] Message frame=    1 fps=0.0 q=20.0 size=      21kB time=00:00:00.00 bitrate=173704.0kbits/s speed= 333x
[log] Message [flv @ 0x7cf7f74d00] Failed to update header with correct duration.
[log] Message [flv @ 0x7cf7f74d00] Failed to update header with correct filesize.
[log] Statistics Instance of 'Statistics'
[log] Message frame=    1 fps=0.0 q=20.0 Lsize=      21kB time=00:00:00.00 bitrate=173864.0kbits/s speed=0.0204x
[log] Message video:21kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.513382%
[log] Statistics Instance of 'Statistics'
[log] Message frame=    1 fps=0.0 q=20.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed=0.0204x
[log] Message video:21kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[log] Message [libx264 @ 0x7ccd0b6400] frame I:1     Avg QP:20.00  size: 20815
[log] Message [libx264 @ 0x7ccd0b6400] mb I  I16..4: 100.0%  0.0%  0.0%
[log] Message [libx264 @ 0x7ccd0b6400] coded y,uvDC,uvAC intra: 37.5% 22.7% 2.3%
[log] Message [libx264 @ 0x7ccd0b6400] i16 v,h,dc,p: 50% 14% 24% 12%
[log] Message [libx264 @ 0x7ccd0b6400] i8c dc,h,v,p: 78%  6% 15%  1%
[log] Message [libx264 @ 0x7ccd0b6400] kb/s:4163.00
[log] FFmpeg process exited with rc 0 in 562 milliseconds

All of this in inside a Flutter app with the package ffmpeg_kit_flutter (the full gpl version of it).

Any one have an idea of how to loop over constantly every time the image is updated ?

Edit : I try adding -f image2 in input but it failed with :

[log] Message ffmpeg version n5.1.2
[log] Message  Copyright (c) 2000-2022 the FFmpeg developers
[log] Message
I/ink.kw_deliver(30445): WaitForGcToComplete blocked ProfileSaver on HeapTrim for 28.215ms
[log] Message   built with Android (7155654, based on r399163b1) clang version 11.0.5 (https://android.googlesource.com/toolchain/llvm-project 87f1315dfbea7c137aa2e6d362dbb457e388158d)
[log] Message   configuration: --cross-prefix=aarch64-linux-android- --sysroot=/files/android-sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot --prefix=/home/taner/Projects/ffmpeg-kit/prebuilt/android-arm64/ffmpeg --pkg-config=/usr/bin/pkg-config --enable-version3 --arch=aarch64 --cpu=armv8-a --target-os=android --enable-neon --enable-asm --enable-inline-asm --ar=aarch64-linux-android-ar --cc=aarch64-linux-android24-clang --cxx=aarch64-linux-android24-clang++ --ranlib=aarch64-linux-android-ranlib --strip=aarch64-linux-android-strip --nm=aarch64-linux-android-nm --extra-libs='-L/home/taner/Projects/ffmpeg-kit/prebuilt/android-arm64/cpu-features/lib -lndk_compat' --disable-autodetect --enable-cross-compile --enable-pic --enable-jni --enable-optimizations --enable-swscale --disable-static --enable-shared --enable-pthreads --enable-v4l2-m2m --disable-outdev=fbdev --disable-indev=fbdev --enable-small --disable-xmm-clobber-test --disable-debug --enable-lto --disable-neon-clobber-test --disable-programs --disable-postproc --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-sndio --disable-schannel --disable-securetransport --disable-xlib --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --disable-videotoolbox --disable-audiotoolbox --disable-appkit --disable-alsa --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gmp --enable-gnutls --enable-libmp3lame --enable-libass --enable-iconv --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxml2 --enable-libopencore-amrnb --enable-libshine --enable-libspeex --enable-libdav1d --enable-libkvazaar --enable-libx264 --enable-libxvid --enable-libx265 --enable-libvidstab --enable-libilbc --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libtwolame --disable-sdl2 --enable-libvo-amrwbenc --enable-libzimg --disable-openssl --enable-zlib --enable-mediacodec --enable-gpl
[log] Message   libavutil      57. 28.100 / 57. 28.100
[log] Message   libavcodec     59. 37.100 / 59. 37.100
[log] Message   libavformat    59. 27.100 / 59. 27.100
[log] Message   libavdevice    59.  7.100 / 59.  7.100
[log] Message   libavfilter     8. 44.100 /  8. 44.100
[log] Message   libswscale      6.  7.100 /  6.  7.100
[log] Message   libswresample   4.  7.100 /  4.  7.100
[log] Message Input #0, image2, from '/data/user/0/com.kwikwink.kw_delivery/cache/images/stream.jpg':
[log] Message   Duration:
[log] Message 00:00:00.04
[log] Message , start:
[log] Message 0.000000
[log] Message , bitrate:
[log] Message N/A
[log] Message
[log] Message   Stream #0:0
[log] Message : Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480
[log] Message ,
[log] Message 25 fps,
[log] Message 25 tbr,
[log] Message 25 tbn
[log] Message
[log] Message rtmp://stream.path.com: I/O error
[log] FFmpeg process failed with rc 1 in 1 milliseconds
un_cafeinoman
  • 67
  • 1
  • 7
  • Try to replace the "-loop 0" by "stream_loop -1" in your command, to get the infinite loop – Rems Jan 19 '23 at 15:31
  • It look like the same, return code is 0 so it is good but the stream don't seem to last – un_cafeinoman Jan 19 '23 at 15:38
  • That's weird, and with "-loop 1" ? – Rems Jan 19 '23 at 15:56
  • Fact is that -loop 1 was my first go to but it don't work either it loop once over the image and close – un_cafeinoman Jan 23 '23 at 09:45
  • Can you try in local, to see if the problem comes from the command or from your server ? `ffmpeg -re -stream_loop -1 -i $pathToFile -preset ultrafast -tune zerolatency -c:v libx264 -f flv - | ffplay -i - ` – Rems Jan 23 '23 at 11:56
  • Ok, so I try it in local and find that it work with -loop 1 but their is another problem. If the image is updated will ffmpeg try to read it ffmpeg stop streaming. Is their a way to open kind of an empty stream to rtmp server and "just push" the images inside ? – un_cafeinoman Jan 25 '23 at 13:41
  • Only solution I see is to use ZeroMQ to dynamically change the image, like in [this](https://stackoverflow.com/questions/74590193/ffmpeg-add-remove-inputs-on-the-fly-dynamically) or [this](https://stackoverflow.com/questions/62822965/ffmpeg-controlling-overlay-through-zeromq-in-ffmpeg) post. Otherwise, if you know in advance which image is going to be played and for how long, you can create a playlist file and stream it. – Rems Jan 25 '23 at 15:29
  • Yes but ZeroMQ isn’t a server side solution ? – un_cafeinoman Jan 26 '23 at 11:43

0 Answers0