[FFmpeg-user] USB Camera ffplay real-time and save to file
Hans Carlson
forbyta at gmx.com
Thu Sep 10 00:07:44 EEST 2020
I have a cheap USB pipe inspection camera and I want to see the output
(via ffplay) real-time, but also record (via ffmpeg). I seem to be able
to do both separately, but can't get them both to work at the same time
using the tee muxer. Well, it does work, but the ffplay output isn't
real-time, there's maybe 1/2 to 1 second delay between the time I move the
camera and when I see the results in the ffplay window.
Is there any way to use ffplay and ffmpeg at the same time such that the
ffplay output is real-time and the video is recorded?
I don't care what output format to use for the saved file other than I
want to save as much detail as possible. I can post process it later if
necessary. This is why I'm using "copy". I also don't care which output
file type to use, so if there's something better than matroska that's
fine. Likewise for the input format for ffplay, I'm only using "nut"
because I found an example that used "nut" and it seems to work.
I've included the full output for the "tee" version (below), but can
provide output for the separate ffmpeg and ffplay commands if necessary.
Here's some details on the camera:
$ v4l2-ctl --list-devices
SheKar Camera: SheKar Camera (usb-0000:00:1a.0-1.2.4):
/dev/video3
/dev/video4
Integrated Camera: Integrated C (usb-0000:00:1a.0-1.6):
/dev/video0
/dev/video1
$ ffmpeg -hide_banner -f v4l2 -list_formats all -i /dev/video3
[video4linux2,v4l2 @ 0x3ef6c80] Compressed: mjpeg : Motion-JPEG : 1280x720 640x480 1600x1200 1600x900 1024x768 800x600 320x240
[video4linux2,v4l2 @ 0x3ef6c80] Raw : yuyv422 : YUYV 4:2:2 : 1280x720 640x480 1600x1200 1600x900 1024x768 800x600 320x240
/dev/video3: Immediate exit requested
If I use ffplay by itself, I can see the camera just fine and the video
response is very fast. In other words, if I move the camera, the ffplay
video image responds real-time (or very, very close to real-time).
$ ffplay -f v4l2 -input_format mjpeg -framerate 30 -video_size 1280x720 -i /dev/video3
If I use ffmpeg by itself, I can record the video, but obviously I can't
see the video real-time.
$ ffmpeg -f v4l2 -input_format mjpeg -framerate 30 -video_size 1280x720 -i /dev/video3 -map 0 -c:v copy output.mkv
When I combine ffmpeg and ffplay using the "tee" muxer, it works, but the
ffplay output is delayed by 1/2 to 1 second.
$ ffmpeg -f v4l2 -input_format mjpeg -framerate 30 -video_size 1280x720 -i /dev/video3 -map 0 -c:v copy -f tee "output.mkv|[f=nut]pipe:" | ffplay pipe:
ffplay version N-99076-gb0203fa72b Copyright (c) 2003-2020 the FFmpeg developers
built with gcc 9 (GCC)
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-static --disable-shared --disable-debug --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-openssl --enable-libbluray --enable-libcdio --enable-libtesseract
libavutil 56. 58.100 / 56. 58.100
libavcodec 58.105.100 / 58.105.100
libavformat 58. 54.100 / 58. 54.100
libavdevice 58. 11.101 / 58. 11.101
ffmpeg version N-99076-gb0203fa72b libavfilter 7. 87.100 / 7. 87.100
Copyright (c) 2000-2020 the FFmpeg developers
libswscale 5. 8.100 / 5. 8.100
built with gcc 9 (GCC)
libswresample 3. 8.100 / 3. 8.100
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-static --disable-shared --disable-debug --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-openssl --enable-libbluray --enable-libcdio --enable-libtesseract
libpostproc 55. 8.100 / 55. 8.100
libavutil 56. 58.100 / 56. 58.100
libavcodec 58.105.100 / 58.105.100
libavformat 58. 54.100 / 58. 54.100
libavdevice 58. 11.101 / 58. 11.101
libavfilter 7. 87.100 / 7. 87.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
[mjpeg @ 0x2c77800] unable to decode APP fields: Invalid data found when processing input
Input #0, video4linux2,v4l2, from '/dev/video3':
Duration: N/A, start: 1887217.220789, bitrate: N/A
Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Output #0, tee, to 'output.mkv|[f=nut]pipe:': 0KB sq= 0B f=0/0
Metadata:
encoder : Lavf58.54.100
Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, q=2-31, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mjpeg @ 0x7fdf24003bc0] unable to decode APP fields: Invalid data found when processing input
Input #0, nut, from 'pipe:':aq= 0KB vq= 0KB sq= 0B f=0/0 ed=1.11x
Metadata:
encoder : Lavf58.54.100
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg (Baseline) (MJPG / 0x47504A4D), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
[mjpeg @ 0x7fdf24005840] unable to decode APP fields: Invalid data found when processing input
[swscaler @ 0x7fdf1c1f4cc0] deprecated pixel format used, make sure you did set range correctly
[mjpeg @ 0x7fdf24005840] unable to decode APP fields: Invalid data found when processing input
Last message repeated 2 times
[mjpeg @ 0x7fdf24005840] unable to decode APP fields: Invalid data found when processing input
... (repeats several times/sec)
[mjpeg @ 0x7fdf24005840] unable to decode APP fields: Invalid data found when processing input
frame= 229 fps= 25 q=-1.0 Lsize=N/A time=00:00:09.32 bitrate=N/A speed=1.01x
video:25291kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Exiting normally, received signal 2.
More information about the ffmpeg-user
mailing list