Bài vết này là về GStreamer riêng trên Linux.
Cài đặt
https://gstreamer.freedesktop.org/documentation/installing/on-linux.html
Chạy video theo cách đơn giản
Để chạy một video từ dòng lệnh, chúng ta có thể dùng lệnh gst-launch-1.0.
gst-launch-1.0 is a tool that builds and runs basic GStreamer pipelines.
In its simplest form, a PIPELINE-DESCRIPTION is a list of elements separated by exclamation marks (!). Properties may be appended to elements in the form property=value.
Please note that gst-launch-1.0 is primarily a debugging tool. You should not build applications on top of it. For applications, use the gst_parse_launch() function of the GStreamer API as an easy way to construct pipelines from pipeline descriptions.
A pipeline consists of elements and links. Elements can be put into bins of different sorts. Elements, links, and bins can be specified in a pipeline description in any order.
Vui lòng đọc nội dung ở đây để hiểu hơn về GStreamer pipeline.
Trước tiên chúng ta hãy thử chạy video theo cách đơn giản nhất, đó là dùng playbin
.
Playbin provides a stand-alone everything-in-one abstraction for an audio and/or video player.
Tìm hiểu thêm về playbin tại đây.
Ví dụ, mình có một video đặt ở /home/user/Videos/trailer_1080p_h264_mp3.avi (mọi người có thể tải video demo tại http://linode.boundarydevices.com/videos/trailer_1080p_h264_mp3.avi):
$ gst-launch-1.0 playbin uri=file:///home/user/Videos/trailer_1080p_h264_mp3.avi
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
Redistribute latency...
Redistribute latency...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstPulseSinkClock
Got EOS from element "playbin0".
Execution ended after 0:00:33.057856101
Setting pipeline to NULL ...
Freeing pipeline ...
Thử hiển thị video với một video sink khác:
$ gst-launch-1.0 playbin uri=file:///home/user/Videos/trailer_1080p_h264_mp3.avi \
video-sink=glimagesink
Như chúng ta đã biết, playbin
sẽ tự động lựa chọn những element phù hợp. Hãy cùng thử xem chính xác thì những element
nào được sử dụng trong pipeline trên.
Chú ý: Việc lựa chọn các element còn phụ thuộc vào phần cứng, driver, môi trường đồ họa, …, nên kết quả có thể sẽ khác
với máy của mọi người.
Một cách khác đơn giản và trực quan để kiểm tra là sử dụng pipeline graphs.
These are
.dot
files, readable with free programs like GraphViz, that describe the topology of your pipeline, along with the caps negotiated in each link.To obtain
.dot
files, simply set theGST_DEBUG_DUMP_DOT_DIR
environment variable to point to the folder where you want the files to be placed.gst-launch-1.0
will create a.dot
file at each state change, so you can see the evolution of the caps negotiation.
$ export GST_DEBUG_DUMP_DOT_DIR=/tmp/pipe_graph
$ mkdir -p $GST_DEBUG_DUMP_DOT_DIR
$ gst-launch-1.0 playbin uri=file:///home/user/Videos/trailer_1080p_h264_mp3.avi
Sẽ có nhiều file .dot
được tạo ra, hãy thử xem một trong số chúng nào. Các bạn có thể convert file .dot
thành ảnh
bằng câu lệnh dot
thuộc gói graphviz
.
$ ls $GST_DEBUG_DUMP_DOT_DIR
0.00.00.013971195-gst-launch.NULL_READY.dot 0.00.00.209734072-gst-launch.PAUSED_PLAYING.dot 0.00.33.329271430-gst-launch.PAUSED_READY.dot
0.00.00.205720496-gst-launch.READY_PAUSED.dot 0.00.33.266401422-gst-launch.PLAYING_PAUSED.dot
$ dot -Tpng $GST_DEBUG_DUMP_DOT_DIR/0.00.33.266401422-gst-launch.PLAYING_PAUSED.dot > /tmp/pipeline.png
Custom pipeline
Vậy là chúng ta có thể dễ dàng chạy một video với playbin
, nhưng nếu chúng ta muốn chỉ định các element theo ý chúng
ta thì phải làm thế nào? Sau đây là một ví dụ khác cho việc chạy video:
$ gst-launch-1.0 filesrc location=/home/user/Videos/trailer_1080p_h264_mp3.avi \
! avidemux ! h264parse \
! avdec_h264 ! videoconvert \
! xvimagesink
Các thành phần của pipeline trên là:
filesrc
: Đọc file. Đường dẫn tới file có thể được gán thông qua thuộc tínhlocation
.avidemux
: Demultiplex file avi thành audio và video.h264parse
: Parses H.264 streams.avdec_h264
: libav h264 decoder.xvimagesink
: videosink dành cho X.
Thông tin về một plugin có thể được lấy ra thông qua lệnh gst-inspect-1.0. Ví dụ:
$ gst-inspect-1.0 filesrc
Factory Details:
Rank primary (256)
Long-name File Source
Klass Source/File
Description Read from arbitrary point in a file
Author Erik Walthinsen <[email protected]>
Plugin Details:
Name coreelements
Description GStreamer core elements
Filename /usr/lib64/gstreamer-1.0/libgstcoreelements.so
Version 1.18.4
License LGPL
Source module gstreamer
Source release date 2021-03-15
Binary package Fedora GStreamer package
Origin URL http://download.fedoraproject.org
GObject
+----GInitiallyUnowned
+----GstObject
+----GstElement
+----GstBaseSrc
+----GstFileSrc
Implemented Interfaces:
GstURIHandler
Pad Templates:
SRC template: 'src'
Availability: Always
Capabilities:
ANY
Element has no clocking capabilities.
URI handling capabilities:
Element can act as source.
Supported URI protocols:
file
Pads:
SRC: 'src'
Pad Template: 'src'
Element Properties:
blocksize : Size in bytes to read per buffer (-1 = default)
flags: readable, writable
Unsigned Integer. Range: 0 - 4294967295 Default: 4096
do-timestamp : Apply current stream time to buffers
flags: readable, writable
Boolean. Default: false
location : Location of the file to read
flags: readable, writable, changeable only in NULL or READY state
String. Default: null
name : The name of the object
flags: readable, writable, 0x2000
String. Default: "filesrc0"
num-buffers : Number of buffers to output before sending EOS (-1 = unlimited)
flags: readable, writable
Integer. Range: -1 - 2147483647 Default: -1
parent : The parent of the object
flags: readable, writable, 0x2000
Object of type "GstObject"
typefind : Run typefind before negotiating (deprecated, non-functional)
flags: readable, writable, deprecated
Boolean. Default: false
Thông tin của filesrc
không nhiều lắm, các bạn có thể thử với các plugin khác để xem thông tin của chúng.
Element Properties
là những thuộc tính mà chúng ta có thể gán từ dòng lệnh. Những thành phần khác như Pads
hay
Element Signals
thì được dùng trong code nhiều hơn.
Queue
Thực ra, pipeline phía trên mới chỉ hiển thị video chứ không hề có audio. Để có thể xử lý cả video và audio cùng một lúc, chúng ta cần một element tên là queue.
The queue will create a new thread on the source pad to decouple the processing on sink and source pad.
Sau đây là cách dùng queue
:
$ gst-launch-1.0 filesrc location=/home/user/Videos/trailer_1080p_h264_mp3.avi \
! avidemux name=dm \
dm. ! queue ! mpegaudioparse ! avdec_mp3 \
! audioconvert ! audioresample ! pulsesink \
dm. ! queue ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink
Xem thêm: queue2, multiqueue.