Bắt đầu với GStreamer - Dòng lệnh

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 the GST_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ính location.
  • 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.

comments powered by Disqus