한국어
오픈소스포럼
 이곳은 다양한 오픈소스 프로젝트를 소개하고 리뷰, 활용 방법을 공유합니다.

라즈베리파이 4 미디어 플레이어를 개발하기 위해 Qt와 GStreamer 로 아주 단간하게 테스트용도로 작성한 flac 오디오 재생 프로그램. (Qt Multimedia 가 아님) GStreamer의 Hello world 소스코드 일부를 수정하였고 flac 오디오 파일을 재생 시킨다.. 

 

#include <gst/gst.h>

class MediaPlayer::MediaPlayerImpl
{
public:
    MediaPlayerImpl()
        : pipeline(nullptr), source(nullptr), demuxer(nullptr), decoder(nullptr), conv(nullptr), sink(nullptr)
        , bus(nullptr), bus_watch_id(0)
    {

    }

    static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
    {
      switch (GST_MESSAGE_TYPE (msg)) {

        case GST_MESSAGE_EOS:
          g_print ("End of stream\n");

          break;

        case GST_MESSAGE_ERROR: {
          gchar  *debug;
          GError *error;

          gst_message_parse_error (msg, &error, &debug);
          g_free (debug);

          g_printerr ("Error: %s\n", error->message);
          g_error_free (error);

          break;
        }
        default:
          break;
      }

      return TRUE;
    }

    GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
    GstBus *bus;
    guint bus_watch_id;
};


MediaPlayer::MediaPlayer()
    :pImpl(std::make_shared<MediaPlayerImpl>())
{

}

MediaPlayer::~MediaPlayer()
{
    /* Out of the main loop, clean up nicely */
     g_print ("Returned, stopping playback\n");
     gst_element_set_state (pImpl->pipeline, GST_STATE_NULL);

     g_print ("Deleting pipeline\n");
     gst_object_unref (GST_OBJECT (pImpl->pipeline));
     g_source_remove (pImpl->bus_watch_id);
}

int MediaPlayer::init(int *argc, char **argv[])
{
    /* Initialisation */
    gst_init (argc, argv);

    /* Create gstreamer elements */
    pImpl->pipeline = gst_pipeline_new ("audio-player");
    pImpl->source   = gst_element_factory_make ("filesrc",       "file-source");
    pImpl->demuxer  = gst_element_factory_make ("flacparse",      "flacparse-demuxer");
    pImpl->decoder  = gst_element_factory_make ("flacdec",     "flacdec-decoder");
    pImpl->sink     = gst_element_factory_make ("autoaudiosink", "audio-output");

    if (!pImpl->pipeline || !pImpl->source || !pImpl->demuxer || !pImpl->decoder || !pImpl->sink) {
        g_printerr ("One element could not be created. Exiting.\n");
        return -1;
    }

    /* we add a message handler */
    pImpl->bus = gst_pipeline_get_bus (GST_PIPELINE (pImpl->pipeline));
    pImpl->bus_watch_id = gst_bus_add_watch (pImpl->bus, pImpl->bus_call, nullptr);
    gst_object_unref (pImpl->bus);

    /* we add all elements into the pipeline */
    /* file-source | flacparse | flacdec-decoder | alsa-output */
    gst_bin_add_many (GST_BIN (pImpl->pipeline),
                      pImpl->source, pImpl->demuxer, pImpl->decoder, pImpl->sink, NULL);

    /* we link the elements together */
    /* file-source -> flacparse ~> flacdec-decoder -> alsa-output */

    gst_element_link_many (pImpl->source, pImpl->demuxer, pImpl->decoder, pImpl->sink, NULL);

    return 0;
}

void MediaPlayer::setSourcePath(const QString &path)
{
    /* we set the input filename to the source element */
    g_object_set (G_OBJECT (pImpl->source), "location", path.toStdString().c_str(), NULL);
}

void MediaPlayer::play()
{
    /* Set the pipeline to "playing" state*/
    gst_element_set_state (pImpl->pipeline, GST_STATE_PLAYING);
}

void MediaPlayer::pause()
{
    /* Set the pipeline to "pause" state*/
    gst_element_set_state (pImpl->pipeline, GST_STATE_PAUSED);
}

void MediaPlayer::stop()
{
    /* Set the pipeline to "stop" state*/
    gst_element_set_state (pImpl->pipeline, GST_STATE_NULL);
}

 

예제의 GStreamer 파이프라인

 

FLAC Audio Playback

Audio Playback.png

 

mediaplayer.tar.gz

 

https://gstreamer.freedesktop.org/documentation/application-development/basics/helloworld.html

번호 제목 글쓴이 날짜 조회 수
36 Pluma(C++ Plug-in Management Framework) 튜토리얼 file makersweb 2019.12.07 15191
35 GENIVI DLT(Diagnostic Log and Trace) 활용 file makersweb 2020.11.19 12988
34 GDBus 튜토리얼(GDBus tutorial) file makersweb 2019.06.30 12975
33 Dear ImGui, 경량의 C++ 용 GUI 및 Widget 라이브러리 file makersweb 2020.11.28 11222
32 ZeroMQ의 기본 메세지 패턴들 file makersweb 2020.07.31 10489
31 텔레그램(Telegram) Bot 개발 file makersweb 2019.07.21 7226
30 가볍고 쉬운 임베디드용 그래픽 라이브러리 - LVGL file makersweb 2020.09.16 5316
29 webOS소개 및 Raspberry Pi 3 에서 실행 file makersweb 2019.10.13 5222
28 Flutter Application 에서 한글(EUC-KR) 깨져서 나오는 문제 file makersweb 2022.01.06 4829
27 리눅스에서 SDL2 최신버전 컴파일과 Qt Creator로 개발환경 구성 file makersweb 2019.10.06 4582
26 [SDL2 와 OpenGL]윈도우 생성과 2D그래픽 file makersweb 2020.04.11 4445
25 AGL (Automotive Grade Linux) 개요 file makersweb 2022.06.19 3807
24 [NodeGui] JavaScript로 데스크탑 응용프로그램 작성 file makersweb 2023.02.21 3793
23 LVGL 을 통해 GUI 구현 시 한글 폰트 추가 file makersweb 2023.02.07 3623
22 Nana, C++용 크로스플랫폼 GUI 라이브러리 file makersweb 2021.01.06 3598
21 Wayland IVI Extension 간단 리뷰 file makersweb 2019.05.12 3517
20 ZeroMQ 비동기 클라이언트/서버 패턴 file makersweb 2020.08.13 3457
19 CANdevStudio 를 사용하여 CAN 네트워크 시뮬레이션 file makersweb 2021.03.09 3366
18 Flutter/Dart 와 Qt/QML 비교 file makersweb 2021.11.07 2952
17 NAppGUI, C언어용 크로스 플랫폼 GUI 라이브러리 file makersweb 2022.10.10 2681