mirror of
https://github.com/matthew1000/gstreamer-cheat-sheet.git
synced 2024-11-22 00:10:59 +00:00
Tidy up and first python examples
This commit is contained in:
parent
48a3a3530a
commit
7fb9d02b72
9 changed files with 117 additions and 13 deletions
|
@ -39,7 +39,12 @@ Good GStreamer Python resources include:
|
||||||
|
|
||||||
* [Getting started with GStreamer with Python](https://www.jonobacon.com/2006/08/28/getting-started-with-gstreamer-with-python/)
|
* [Getting started with GStreamer with Python](https://www.jonobacon.com/2006/08/28/getting-started-with-gstreamer-with-python/)
|
||||||
* [Python GStreamer Tutorial](http://brettviren.github.io/pygst-tutorial-org/pygst-tutorial.html)
|
* [Python GStreamer Tutorial](http://brettviren.github.io/pygst-tutorial-org/pygst-tutorial.html)
|
||||||
* [Function reference](http://lazka.github.io/pgi-docs/#GstApp-1.0)
|
* [Function reference](http://lazka.github.io/pgi-docs/#Gst-1.0)
|
||||||
|
* [Nice example script](https://github.com/rabits/rstream/blob/master/rstream.py)
|
||||||
|
|
||||||
|
### C++ with GStreamer
|
||||||
|
|
||||||
|
My favourite reference is [Valadoc](https://valadoc.org/gstreamer-1.0/index.htm)
|
||||||
|
|
||||||
# Problems or suggestions with this guide?
|
# Problems or suggestions with this guide?
|
||||||
|
|
||||||
|
|
|
@ -109,3 +109,6 @@ gst-launch-1.0 filesrc location=$SRC ! \
|
||||||
autovideosink
|
autovideosink
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Play files back to back
|
||||||
|
|
||||||
|
See (https://coaxion.net/blog/2014/08/concatenate-multiple-streams-gaplessly-with-gstreamer/)[https://coaxion.net/blog/2014/08/concatenate-multiple-streams-gaplessly-with-gstreamer/]
|
||||||
|
|
12
mixing.md
12
mixing.md
|
@ -70,5 +70,17 @@ gst-launch-1.0 \
|
||||||
mix.
|
mix.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Compositor with just one sources
|
||||||
|
|
||||||
|
It is possible for a compositor to have just one source. This example has the test source of a bouncing ball. It also has the audio test source included (muxed).
|
||||||
|
|
||||||
|
```
|
||||||
|
gst-launch-1.0 \
|
||||||
|
videotestsrc pattern=ball ! \
|
||||||
|
decodebin ! \
|
||||||
|
compositor name=mix sink_0::alpha=1 ! \
|
||||||
|
x264enc ! muxer. \
|
||||||
|
audiotestsrc ! avenc_ac3 ! muxer. \
|
||||||
|
mpegtsmux name=muxer ! queue ! \
|
||||||
|
tcpserversink host=127.0.0.1 port=7001 recover-policy=keyframe sync-method=latest-keyframe sync=false
|
||||||
|
```
|
||||||
|
|
|
@ -92,15 +92,18 @@ To send a test stream:
|
||||||
```
|
```
|
||||||
gst-launch-1.0 \
|
gst-launch-1.0 \
|
||||||
audiotestsrc ! \
|
audiotestsrc ! \
|
||||||
avenc_ac3 ! mpegtsmux ! tcpserversink port=7001 host=0.0.0.0
|
avenc_ac3 ! mpegtsmux ! \
|
||||||
|
tcpserversink port=7001 host=0.0.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
To send a file:
|
To send a file:
|
||||||
|
|
||||||
```
|
```
|
||||||
# Make sure $SRC is set to an audio file (e.g. an MP3 file)
|
# Make sure $SRC is set to an audio file (e.g. an MP3 file)
|
||||||
gst-launch-1.0 -v filesrc location=$AUDIO_SRC ! \
|
gst-launch-1.0 \
|
||||||
mpegaudioparse ! tcpserversink port=7001 host=0.0.0.0
|
filesrc location=$AUDIO_SRC ! \
|
||||||
|
mpegaudioparse ! \
|
||||||
|
tcpserversink port=7001 host=0.0.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
And to receive:
|
And to receive:
|
||||||
|
|
30
python_examples/headless.py
Normal file
30
python_examples/headless.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Sends a test stream to a fake sink.
|
||||||
|
# This is utterly pointless, but allows easy testing of GStreamer
|
||||||
|
# Python on a remote box that doesn't have video.
|
||||||
|
#
|
||||||
|
# Equivalent to:
|
||||||
|
# gst-launch-1.0 videotestsrc ! fakesink
|
||||||
|
#
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gst', '1.0')
|
||||||
|
from gi.repository import GObject, Gst
|
||||||
|
import os
|
||||||
|
|
||||||
|
Gst.init()
|
||||||
|
mainloop = GObject.MainLoop()
|
||||||
|
|
||||||
|
pipeline = Gst.Pipeline.new("pipe")
|
||||||
|
|
||||||
|
videotestsrc = Gst.ElementFactory.make("videotestsrc", "videotestsrc")
|
||||||
|
fakesink = Gst.ElementFactory.make("fakesink", "fakesink")
|
||||||
|
|
||||||
|
pipeline.add(videotestsrc)
|
||||||
|
pipeline.add(fakesink)
|
||||||
|
|
||||||
|
videotestsrc.link(fakesink)
|
||||||
|
|
||||||
|
pipeline.set_state(Gst.State.PLAYING)
|
||||||
|
mainloop.run()
|
|
@ -1,5 +1,7 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
#
|
#
|
||||||
|
# Plays a file to screen.
|
||||||
|
#
|
||||||
# Make sure the environment variable SRC is set to a playable file
|
# Make sure the environment variable SRC is set to a playable file
|
||||||
# e.g.
|
# e.g.
|
||||||
# export SRC='/tmp/me.mp4'
|
# export SRC='/tmp/me.mp4'
|
||||||
|
@ -13,9 +15,8 @@ import os
|
||||||
Gst.init()
|
Gst.init()
|
||||||
mainloop = GObject.MainLoop()
|
mainloop = GObject.MainLoop()
|
||||||
|
|
||||||
pl = Gst.ElementFactory.make("playbin", "player")
|
pipeline = Gst.ElementFactory.make("playbin", "player")
|
||||||
pl.set_property('uri','file://'+os.environ['SRC'])
|
pipeline.set_property('uri','file://'+os.environ['SRC'])
|
||||||
|
|
||||||
#running the playbin
|
pipeline.set_state(Gst.State.PLAYING)
|
||||||
pl.set_state(Gst.State.PLAYING)
|
|
||||||
mainloop.run()
|
mainloop.run()
|
||||||
|
|
31
python_examples/show_test_stream.py
Normal file
31
python_examples/show_test_stream.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Plays a test screen to screen.
|
||||||
|
#
|
||||||
|
# Equivalent to:
|
||||||
|
# gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
|
||||||
|
#
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gst', '1.0')
|
||||||
|
from gi.repository import GObject, Gst
|
||||||
|
import os
|
||||||
|
|
||||||
|
Gst.init()
|
||||||
|
mainloop = GObject.MainLoop()
|
||||||
|
|
||||||
|
pipeline = Gst.Pipeline.new("pipe")
|
||||||
|
|
||||||
|
videotestsrc = Gst.ElementFactory.make("videotestsrc", "videotestsrc")
|
||||||
|
videoconvert = Gst.ElementFactory.make("videoconvert", "videoconvert")
|
||||||
|
autovideosink = Gst.ElementFactory.make("autovideosink", "autovideosink")
|
||||||
|
|
||||||
|
pipeline.add(videotestsrc)
|
||||||
|
pipeline.add(videoconvert)
|
||||||
|
pipeline.add(autovideosink)
|
||||||
|
|
||||||
|
videotestsrc.link(videoconvert)
|
||||||
|
videoconvert.link(autovideosink)
|
||||||
|
|
||||||
|
pipeline.set_state(Gst.State.PLAYING)
|
||||||
|
mainloop.run()
|
16
rtmp.md
16
rtmp.md
|
@ -136,6 +136,8 @@ gst-launch-1.0 videotestsrc is-live=true ! \
|
||||||
|
|
||||||
### Send a file over RTMP
|
### Send a file over RTMP
|
||||||
|
|
||||||
|
Audio & video:
|
||||||
|
|
||||||
```
|
```
|
||||||
gst-launch-1.0 filesrc location=$SRC ! \
|
gst-launch-1.0 filesrc location=$SRC ! \
|
||||||
qtdemux name=demux \
|
qtdemux name=demux \
|
||||||
|
@ -148,6 +150,17 @@ gst-launch-1.0 filesrc location=$SRC ! \
|
||||||
voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.
|
voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Just video:
|
||||||
|
|
||||||
|
```
|
||||||
|
gst-launch-1.0 filesrc location=$SRC ! \
|
||||||
|
qtdemux name=demux \
|
||||||
|
demux.video_0 ! queue ! \
|
||||||
|
decodebin ! videoconvert ! x264enc bitrate=1000 tune=zerolatency ! video/x-h264 ! h264parse ! \
|
||||||
|
video/x-h264 ! queue ! flvmux name=mux ! \
|
||||||
|
rtmpsink location=$RTMP_DEST
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Can we work out why a bad RTMP brings down the other mix?
|
Can we work out why a bad RTMP brings down the other mix?
|
||||||
|
@ -168,6 +181,3 @@ gst-launch-1.0 \
|
||||||
videoscale ! video/x-raw,width=320,height=180! \
|
videoscale ! video/x-raw,width=320,height=180! \
|
||||||
mix.
|
mix.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ bit like this:
|
||||||
|
|
||||||
![Test pattern window](images/test-pattern.png "Test pattern window")
|
![Test pattern window](images/test-pattern.png "Test pattern window")
|
||||||
|
|
||||||
There are multiple test patterns available, such as
|
There are multiple test patterns available, such as:
|
||||||
|
|
||||||
| Pattern | Example |
|
| Pattern | Example |
|
||||||
| ------------- |:-------------:|
|
| ------------- |:-------------:|
|
||||||
|
@ -23,6 +23,13 @@ There are multiple test patterns available, such as
|
||||||
|
|
||||||
For the full list of patterns, see https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-videotestsrc.html
|
For the full list of patterns, see https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-videotestsrc.html
|
||||||
|
|
||||||
|
### Change the shape of a test pattern
|
||||||
|
|
||||||
|
To change the width and/or height, pass width and height immediately afterwards, e.g.
|
||||||
|
|
||||||
|
```
|
||||||
|
gst-launch-1.0 -v videotestsrc pattern=snow ! video/x-raw,width=1280,height=720 ! autovideosink
|
||||||
|
```
|
||||||
|
|
||||||
### Listen to a test audio (beep)
|
### Listen to a test audio (beep)
|
||||||
|
|
||||||
|
@ -30,6 +37,8 @@ For the full list of patterns, see https://gstreamer.freedesktop.org/data/doc/gs
|
||||||
gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink
|
gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### View test pattern and hear test audio
|
||||||
|
|
||||||
Combine both the test pattern and test audio:
|
Combine both the test pattern and test audio:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
Loading…
Reference in a new issue