-
-
Save jetsonhacks/1008d24f02e532217cfa to your computer and use it in GitHub Desktop.
#!/bin/sh | |
# NVIDIA Jetson TK1 | |
# Use Gstreamer to grab H.264 video and audio stream from Logitech c920 webcam | |
# Preview video on screen | |
# Save Video and Audio to a file | |
# Send video as RTSP stream over TCP | |
# IP Address of the this machine hosting the TCP stream | |
IP_ADDRESS=<ENTER IP ADDRESS HERE e.g 10.10.10.10> | |
# You can list devices: | |
# $ v4l2-ctl --list-devices | |
VELEM="v4l2src device=/dev/video0" #video0 is a Logitech c920 webcam with built-in H.264 compression | |
# Video capability from the camera - Choose One, this size will be sent out over the network | |
# VCAPS="video/x-h264, width=800, height=448, framerate=30/1" | |
# VCAPS="video/x-h264, width=1280, height=720, framerate=30/1" | |
VCAPS="video/x-h264, width=1920, height=1080, framerate=30/1" | |
# Video Source | |
VSOURCE="$VELEM ! $VCAPS" | |
# Decode the video - parse the h264 from the camera and then decode it | |
# Hardware accelerated by using omxh264dec | |
VIDEO_DEC="h264parse ! omxh264dec" | |
# SIZE OF THE PREVIEW WINDOW (Optional - you can remove this by modifying VIDEO_SINK) | |
# Here for demo purposes | |
PREVIEW_SCALE="video/x-raw, width=1280, height=720" | |
# VIDEO_SINK is the preview window | |
VIDEO_SINK="videoconvert ! videoscale ! $PREVIEW_SCALE ! xvimagesink sync=false" | |
#AUDIO | |
AELEM="pulsesrc device=alsa_input.usb-046d_HD_Pro_Webcam_C920_A116B66F-02-C920.analog-stereo do-timestamp=true" | |
AUDIO_CAPS="audio/x-raw" | |
AUDIO_ENC="audioconvert ! voaacenc" | |
ASOURCE="$AELEM ! $AUDIO_CAPS" | |
# FILE_SINK is the name of the file that the video will be saved in | |
# File is a .mp4, Video is H.264 encoded, audio is aac encoded | |
FILE_SINK="filesink location=gtest1.mp4" | |
# Address and port to serve the video stream; check to make sure ports are available and firewalls don't block it! | |
TCP_SINK="tcpserversink host=$IP_ADDRESS port=5000" | |
#show gst-launch on the command line; can be useful for debugging | |
echo gst-launch-1.0 -vvv -e \ | |
mp4mux name=mux ! $FILE_SINK \ | |
$VSOURCE ! tee name=tsplit \ | |
! queue ! $VIDEO_DEC ! $VIDEO_SINK tsplit. \ | |
! queue ! h264parse ! mux.video_0 tsplit. \ | |
! queue ! h264parse ! mpegtsmux ! $TCP_SINK \ | |
$ASOURCE ! queue ! $AUDIO_ENC ! queue ! mux.audio_0 | |
# first queue is for the preview | |
# second queue writes to the file gtest1.mp4 | |
# third queue sends H.264 in MPEG container over TCP | |
gst-launch-1.0 -vvv -e \ | |
mp4mux name=mux ! $FILE_SINK \ | |
$VSOURCE ! tee name=tsplit \ | |
! queue ! $VIDEO_DEC ! $VIDEO_SINK tsplit. \ | |
! queue ! h264parse ! mux.video_0 tsplit. \ | |
! queue ! h264parse ! mpegtsmux ! $TCP_SINK \ | |
$ASOURCE ! queue ! $AUDIO_ENC ! queue ! mux.audio_0 |
Hi Jetsonhacks,
I tried your pipeline with 'nvcamerasrc' as the video source and it works! I also modified the pipeline for video recording and for sending stream over network by TCP only without the preview queue. So, it goes like this :
gst-launch-1.0 avimux name=mux
! filesink location=/media/nvidia/SSDJetson/test.mp4 nvcamerasrc fpsRange="30.0 30.0"
! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! omxh264enc bitrate=14000000 control-rate=variable ! tee name=tsplit
! queue ! h264parse ! mux.video_0 tsplit.
! queue ! h264parse ! queue ! matroskamux
! queue leaky=2 ! tcpserversink host=192.x.x.x port=7001
Thanks to your guide, I managed to launch this on command line. I'm used to transform gstreamer pipeline into C/C++ programming code but I'm still a beginner. However, this is my first time I saw this form of pipeline where it starts with the muxer and then the "filesink" and "nvcamerasrc" elements are bordered in the same "! filesink location=/media/nvidia/SSDJetson/test.mp4 nvcamerasrc fpsRange="30.0 30.0" !". I'm not familiar at all with this form of pipeline but I wanted to transform this into code.
I have two problems, I don't know how to create the "filesink" and "nvcamerasrc" elements in the same 'gst_element_factory_make'.
Plus, I don't know how to transform "mux.video_0 tsplit." to code.
Do you have any examples on this? So far, I haven't managed to find any code examples related to this on internet.
Thanks in advance!
Hello
I have the Jetson TX2 installed with Ubuntu 14.04, so as my host, and I develop a c++ gstreamer application
I have the IDE (Eclipse Nsight) installed and working with remote debugging for CUDA programs and basic c++ programs as well,also i run many gstreamer pipelines successfully using gst-launch-1.0 ......
BUT i can not compile with the gstreamer-1.0 on my host with cross compilation, it looks like the installed gstreamer lib is for x86 and not for arm64
do you have some experience with this ?
appreciate your help
Regards
Ofer