frameerate issue while capturing and encoding a webcam (UVC/v4l2) stream

Vivia Nikolaidou n.vivia at gmail.com
Thu Mar 9 18:38:52 UTC 2017


Hi,

You can try without the jpegparse element, it's likely changing the timestamps.

Also, why do you have that videorate element there? If there's no
capsfilter around it and there are no arguments to it, it's probably
not doing much.

Best regards,

Vivia

On 9 March 2017 at 18:48, Damien Picard <picard.damien at gmail.com> wrote:
> Hi,
>
> I'm currenlty discovering GStreamer and I am looking for a way to capture
> and encode my UVC webcam to H264 stream in a MP4 container.
>
> I am able to achieve it using this command :
>
> gst-launch-1.0 -e v4l2src device=/dev/video0 !
> 'image/jpeg,width=1920,height=1080' !  jpegparse ! jpegdec ! videoconvert !
> videorate ! x264enc ! mp4mux ! filesink location=videotestsrc.mp4
>
> It does the job but the resulting videotestsrc.mp4 does not seem to have the
> right framerate because the video is "accelerated".
> I think it could be caused by two things :
>  - The framerate in the resulting video is actually not the good one, but
> I'm not able to diagnose and fix it ; do you have some tricks to achieve
> this ?
>  - The capture step does not capture the whole 30 frames per seconds (for a
> reason that I don't understand) and, in the resulting video, only the
> captured frames are displayed, at 30 fps ; involving that the video seems to
> be accelerated.
>
> Some tests I do :
>  - decrease the frame size : leads to the same result
> gst-launch-1.0 -e v4l2src device=/dev/video0 !
> 'image/jpeg,width=640,height=480' !  jpegparse ! jpegdec ! videoconvert !
> videorate ! x264enc ! mp4mux ! filesink location=videotestsrc.mp4
>  - record with mjpeg-streamer : works fine, the avi is played at 30 fps, not
> accelerated (the AVI is definitively too large in MJPEG)
> ./mjpg_streamer -i 'input_uvc.so -r 1920x1080' -o 'output_file.so -f
> /home/dams -m video.avi'
>
>
> The debug output, in 1920x1080 :
>
> Définition du pipeline à PAUSED...
> Le pipeline est actif et n’a pas besoin de phase PREROLL…
> Passage du pipeline à la phase PLAYING…
> New clock: GstSystemClock
> /GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = "image/jpeg\,\
> width\=\(int\)1920\,\ height\=\(int\)1080\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ colorimetry\=\(string\)2:4:7:1\,\
> framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps =
> "image/jpeg\,\ width\=\(int\)1920\,\ height\=\(int\)1080\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ colorimetry\=\(string\)2:4:7:1\,\
> framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:sink: caps =
> "image/jpeg\,\ width\=\(int\)1920\,\ height\=\(int\)1080\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ colorimetry\=\(string\)2:4:7:1\,\
> framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps =
> "image/jpeg\,\ width\=\(int\)1920\,\ height\=\(int\)1080\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ colorimetry\=\(string\)2:4:7:1\,\
> framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:src: caps =
> "image/jpeg\,\ parsed\=\(boolean\)true\,\ format\=\(string\)UYVY\,\
> width\=\(int\)1920\,\ height\=\(int\)1080\,\ framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstJpegDec:jpegdec0.GstPad:sink: caps =
> "image/jpeg\,\ parsed\=\(boolean\)true\,\ format\=\(string\)UYVY\,\
> width\=\(int\)1920\,\ height\=\(int\)1080\,\ framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstJpegDec:jpegdec0.GstPad:src: caps =
> "video/x-raw\,\ format\=\(string\)I420\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ interlace-mode\=\(string\)progressive\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ chroma-site\=\(string\)mpeg2\,\
> colorimetry\=\(string\)1:4:0:0\,\ framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:src: caps =
> "video/x-raw\,\ format\=\(string\)I420\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ interlace-mode\=\(string\)progressive\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ chroma-site\=\(string\)mpeg2\,\
> colorimetry\=\(string\)1:4:0:0\,\ framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:src: caps =
> "video/x-raw\,\ format\=\(string\)I420\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ interlace-mode\=\(string\)progressive\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ chroma-site\=\(string\)mpeg2\,\
> colorimetry\=\(string\)1:4:0:0\,\ framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:sink: caps =
> "video/x-raw\,\ format\=\(string\)I420\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ interlace-mode\=\(string\)progressive\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ chroma-site\=\(string\)mpeg2\,\
> colorimetry\=\(string\)1:4:0:0\,\ framerate\=\(fraction\)30/1"
> Redistribution de latence…
> /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:sink: caps =
> "video/x-raw\,\ format\=\(string\)I420\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ interlace-mode\=\(string\)progressive\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ chroma-site\=\(string\)mpeg2\,\
> colorimetry\=\(string\)1:4:0:0\,\ framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:sink: caps =
> "video/x-raw\,\ format\=\(string\)I420\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ interlace-mode\=\(string\)progressive\,\
> pixel-aspect-ratio\=\(fraction\)1/1\,\ chroma-site\=\(string\)mpeg2\,\
> colorimetry\=\(string\)1:4:0:0\,\ framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:src: caps =
> "video/x-h264\,\
> codec_data\=\(buffer\)01640028ffe1001b67640028acd940780227e5c044000003000400000300f23c60c65801000568ebecb22c\,\
> stream-format\=\(string\)avc\,\ alignment\=\(string\)au\,\
> level\=\(string\)4\,\ profile\=\(string\)high\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ pixel-aspect-ratio\=\(fraction\)1/1\,\
> framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstMP4Mux:mp4mux0.GstPad:video_0: caps =
> "video/x-h264\,\
> codec_data\=\(buffer\)01640028ffe1001b67640028acd940780227e5c044000003000400000300f23c60c65801000568ebecb22c\,\
> stream-format\=\(string\)avc\,\ alignment\=\(string\)au\,\
> level\=\(string\)4\,\ profile\=\(string\)high\,\ width\=\(int\)1920\,\
> height\=\(int\)1080\,\ pixel-aspect-ratio\=\(fraction\)1/1\,\
> framerate\=\(fraction\)30/1"
> /GstPipeline:pipeline0/GstMP4Mux:mp4mux0.GstPad:src: caps =
> "video/quicktime\,\ variant\=\(string\)iso"
> /GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps =
> "video/quicktime\,\ variant\=\(string\)iso"
> ^Chandling interrupt.
> Interruption : arrêt du pipeline…
> EOS à la fermeture est activé -- EOS forcé sur le pipeline
> Attente d’EOS.
> /GstPipeline:pipeline0/GstMP4Mux:mp4mux0.GstPad:src: caps =
> "video/quicktime\,\ variant\=\(string\)iso\,\ streamheader\=\(buffer\)\<\
> 00000cdc...\ \>"
> /GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps =
> "video/quicktime\,\ variant\=\(string\)iso\,\ streamheader\=\(buffer\)\<\
> 00000cdc...\ \>"
> EOS reçu de l’élément « pipeline0 ».
> EOS reçu - arrêt du pipeline…
> Execution ended after 0:00:19.789246908
> Définition du pipeline à PAUSED...
> Définition du pipeline à READY (prêt)…
> Définition du pipeline à NULL…
> Libération du pipeline…
>
> Informations about the webcam :
>
> v4l2-ctl --all
> Driver Info (not using libv4l2):
> Driver name   : uvcvideo
> Card type     : USB 2.0 Camera
> Bus info      : usb-0000:00:1d.0-1.2
> Driver version: 4.4.44
> Capabilities  : 0x84200001
> Video Capture
> Streaming
> Extended Pix Format
> Device Capabilities
> Device Caps   : 0x04200001
> Video Capture
> Streaming
> Extended Pix Format
> Priority: 2
> Video input : 0 (Camera 1: ok)
> Format Video Capture:
> Width/Height      : 1920/1080
> Pixel Format      : 'MJPG'
> Field             : None
> Bytes per Line    : 0
> Size Image        : 4147789
> Colorspace        : sRGB
> Transfer Function : Default
> YCbCr Encoding    : Default
> Quantization      : Default
> Flags             :
> Crop Capability Video Capture:
> Bounds      : Left 0, Top 0, Width 1920, Height 1080
> Default     : Left 0, Top 0, Width 1920, Height 1080
> Pixel Aspect: 1/1
> Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080
> Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080
> Streaming Parameters Video Capture:
> Capabilities     : timeperframe
> Frames per second: 30.000 (30/1)
> Read buffers     : 0
>                      brightness (int)    : min=-64 max=64 step=1 default=0
> value=-64
>                        contrast (int)    : min=0 max=64 step=1 default=32
> value=64
>                      saturation (int)    : min=0 max=128 step=1 default=60
> value=128
>                             hue (int)    : min=-40 max=40 step=1 default=0
> value=-40
>  white_balance_temperature_auto (bool)   : default=1 value=1
>                           gamma (int)    : min=72 max=500 step=1 default=100
> value=100
>                            gain (int)    : min=0 max=100 step=1 default=0
> value=100
>            power_line_frequency (menu)   : min=0 max=2 default=1 value=1
>       white_balance_temperature (int)    : min=2800 max=6500 step=1
> default=4600 value=4600 flags=inactive
>                       sharpness (int)    : min=0 max=6 step=1 default=2
> value=2
>          backlight_compensation (int)    : min=0 max=2 step=1 default=1
> value=1
>                   exposure_auto (menu)   : min=0 max=3 default=3 value=3
>               exposure_absolute (int)    : min=1 max=5000 step=1 default=157
> value=157 flags=inactive
>          exposure_auto_priority (bool)   : default=0 value=1
>
> I would appreciate any idea.
> Thank you.
>
> --
> Damien Picard
> Expert GWT
> Mob : 06 11 51 47 78
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>


More information about the gstreamer-devel mailing list