Compile The Latest gstreamer 1.15 on Ubuntu Linux 18.04 LTS
While working on a way to embed Key Length Value (KLV) metadata in a MPEG-2 TS video stream, I found that ffmpeg can copy and extract KLV, but cannot insert it. There were some indications that the latest gstreamer has something under development, so I had to figure out how to compile gstreamer from the GIT repository, to get the latest mpegtsmux features.The cryptic official gstreamer compile guide is here:
https://gstreamer.freedesktop.org/documentation/frequently-asked-questions/git.html#
As usual, the best way to do development work is on a virtual machine, so that you don't mess up your host. I use Oracle Virtualbox on a Macbook Pro. I downloaded Ubuntu Linux 18.04 LTS Server, made a 64 bit Virtualbox machine and installed the XFCE desktop, to get a light weight system that runs smoothly in a virtual environment.
The problem with the cryptic official guide is that it probably works on the machine of a developer that has been doing this for a few years, but on a fresh virtual machine, a whole zoo of dependencies are missing and will be discovered the hard way.
Install The GCC Compiler
If you haven't done so already, install a minimal desktop and the development tools:$ sudo apt update
$ sudo apt install xfce4
$ sudo apt install build-essential
Then log out and in again, to get your beautifully simple XFCE desktop with a minimum of toppings.
Prepare a Work Directory
Make a directory to work in:$ cd
$ mkdir gstreamer
$ cd gstreamer
Dependencies
Set up all the dependencies that the official guide doesn't tell you about. Some of these may pull in additional dependencies and others may not be strictly necessary, but it got me going:$ sudo apt install gtk-doc-tools liborc-0.4-0 liborc-0.4-dev libvorbis-dev libcdparanoia-dev libcdparanoia0 cdparanoia libvisual-0.4-0 libvisual-0.4-dev libvisual-0.4-plugins libvisual-projectm vorbis-tools vorbisgain libopus-dev libopus-doc libopus0 libopusfile-dev libopusfile0 libtheora-bin libtheora-dev libtheora-doc libvpx-dev libvpx-doc libvpx? libqt5gstreamer-1.0-0 libgstreamer*-dev libflac++-dev libavc1394-dev libraw1394-dev libraw1394-tools libraw1394-doc libraw1394-tools libtag1-dev libtagc0-dev libwavpack-dev wavpack
$ sudo apt install libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev
$ sudo apt install libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev
$ sudo apt install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libudev-dev
$ sudo apt install libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer*dev gstreamer-tools gstreamer*good gstreamer*bad
$ sudo apt install libicu-dev libsqlite3-dev libxslt1-dev libssl-dev
$ sudo apt install flex bison nasm
As you can see, the official guide is just ever so slightly insufficient.
Check Out Source Code From GIT
Now, after all the above preparations, you can check out the whole gstreamer extended family as in the official guide:$ for module in gstreamer gst-plugins-base gst-plugins-good gst-plugins-ugly gst-plugins-bad gst-ffmpeg; do git clone git://anongit.freedesktop.org/gstreamer/$module ; done
...long wait...
BTW, if you do a long running process on another machine (real or virtual) over ssh, use screen:
$ ssh -t herman@server screen -R
Then, when the process is running, you can detach with ^aD and later reconnect to the screen session with the same command above.
See what happened:
$ ls
gst-ffmpeg gst-plugins-bad gst-plugins-base gst-plugins-good gst-plugins-ugly gstreamer
Run The autogen.sh Scripts
Go into each directory and run ./autogen.sh. If you get errors looking like 'nasm/yasm not found or too old... config.status: error: Failed to configure embedded Libav tree... configure failed', then of course you need to hunt down the missing package and add it with for example 'sudo apt install nasm', then try autogen.sh again.Build and install the gstreamer and gst-plugins-base directories first, otherwise you will get a complaint about 'configure: Requested 'gstreamer-1.0 >= 1.15.0.1' but version of GStreamer is 1.14.0'.
You will get bazillions of compiler warnings, but should not get any errors. All errors need to be fixed somehow and patches submitted upstream, otherwise you won't get a useful resulting program, but the warnings you can leave to the project developers - let them eat their own dog food. To me, warnings is a sign of sloppy code and I don't want to fix the slop of young programmers who haven't learned better yet:
$ cd gstreamer; ./autogen.sh
$ make
$ sudo make install
$ cd ..
$ cd gst-plugins-base; ./autogen.sh
$ make
$ sudo make install
$ cd ..
Gstreamer has plugins that are in various stages of development/neglect, called The Good, The Bad and The Ugly. Sometimes there is even a Very Ugly version. These two linked movies are rather more entertaining than compiling gstreamer, so that will give you something to do on your other screen.
$ cd gst-plugins-good; ./autogen.sh
$ make
$ sudo make install
$ cd ..
$ cd gst-plugins-bad; ./autogen.sh
$ make
$ sudo make install
$ cd ..
$ cd gst-plugins-ugly; ./autogen.sh
$ make
$ sudo make install
$ cd ..
$ cd gst-ffmpeg; ./autogen.sh
$ make
$ sudo make install
$ cd ..
The Proof Of The Pudding
The mpegtsmux multiplexer can be used to insert KLV metadata into a video stream:$ gst-inspect-1.0 mpegtsmux|grep klv
meta/x-klv
I eventually figured out the syntax and there is now a complete example of how to take Humpty Dumpty apart and put him back together again, in here:
https://www.aeronetworks.ca/2018/05/mpeg-2-transport-streams.html
The above link explains this example pipeline below:
$ gst-launch-1.0 -e mpegtsmux name=mux ! filesink location=dayflightnew.ts \
filesrc location=dayflight.klv ! meta/x-klv ! mux. \
filesrc location=dayflight.ts ! 'video/x-h264, stream-format=byte-stream, alignment=au' ! mux.
Some more research is required to write a little application to prepare the meta data and I suggest that you string things together through sockets or FIFOs.
La Voila!
Herman
Hello!
ReplyDeleteThanks for the info!
Have you found a final solution for reassembling data+video?