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

라즈베리파이 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

번호 제목 글쓴이 날짜 조회 수
37 Wayland IVI Extension 간단 리뷰 file makersweb 2019.05.12 4537
36 GDBus 튜토리얼(GDBus tutorial) file makersweb 2019.06.30 14279
35 텔레그램(Telegram) Bot 개발 file makersweb 2019.07.21 8582
34 리눅스에서 SDL2 최신버전 컴파일과 Qt Creator로 개발환경 구성 file makersweb 2019.10.06 5208
33 webOS소개 및 Raspberry Pi 3 에서 실행 file makersweb 2019.10.13 6086
32 도커(docker)설치 및 기본 명령어 makersweb 2019.12.02 2897
31 Pluma(C++ Plug-in Management Framework) 튜토리얼 file makersweb 2019.12.07 16377
30 [SDL2 와 OpenGL]윈도우 생성과 2D그래픽 file makersweb 2020.04.11 5363
29 ZeroMQ의 기본 메세지 패턴들 file makersweb 2020.07.31 11948
28 ZeroMQ 비동기 클라이언트/서버 패턴 file makersweb 2020.08.13 4543
» Qt와 GStreamer 로 작성한 flac 오디오 재생 예제 file makersweb 2020.09.05 2970
26 가볍고 쉬운 임베디드용 그래픽 라이브러리 - LVGL file makersweb 2020.09.16 6816
25 윈도우에서 안드로이드 flutter 프로그래밍 개발환경 구축(with Visual Studio Code) file makersweb 2020.09.16 3757
24 GENIVI DLT(Diagnostic Log and Trace) 활용 file makersweb 2020.11.19 14233
23 Dear ImGui, 경량의 C++ 용 GUI 및 Widget 라이브러리 file makersweb 2020.11.28 12731
22 라즈베리파이4에서 openFrameworks 예제 실행 file makersweb 2020.12.13 2733
21 Nana, C++용 크로스플랫폼 GUI 라이브러리 file makersweb 2021.01.06 4913
20 라즈베리파이에서 Redis의 Pub/Sub 패턴을 사용하는 Electron 응용프로그램 file makersweb 2021.01.31 3512
19 Protocol Buffers 를 이용한 직렬화 with Conan Package Manager file makersweb 2021.02.24 2184
18 CANdevStudio 를 사용하여 CAN 네트워크 시뮬레이션 file makersweb 2021.03.09 4468
 
단일배너