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

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

번호 제목 글쓴이 날짜 조회 수
35 openFrameworks 한글 폰트 설정 및 출력하기 file makersweb 2023.02.19 196
34 Flutter 위젯의 상태관리에 대해서 file makersweb 2023.04.06 447
33 OTA 오픈소스 프로젝트 makersweb 2022.08.03 469
32 도커(docker)설치 및 기본 명령어 makersweb 2019.12.02 482
31 CopperSpice 에 대해서 (C++ Gui 라이브러리) file makersweb 2022.01.02 536
30 라즈베리파이4에서 openFrameworks 예제 실행 file makersweb 2020.12.13 559
29 Windows에서 Qt Creator + CMake + vcpkg 로 C++ 개발환경 구성 (POCO 라이브러리 DirectoryWatcher 예제) file makersweb 2023.01.14 656
28 라즈베리파이에서 Redis의 Pub/Sub 패턴을 사용하는 Electron 응용프로그램 file makersweb 2021.01.31 680
27 Chromium과 Ozone 층 file makersweb 2022.03.03 726
26 윈도우에서 안드로이드 flutter 프로그래밍 개발환경 구축(with Visual Studio Code) file makersweb 2020.09.16 794
25 ZeroMQ 를 이용한 Qt 응용프로그램 간 통신 file makersweb 2021.08.28 829
24 VSCode 와 Qbs 플러그인으로 C/C++ 개발환경 구성 file makersweb 2021.09.12 842
23 NAppGUI, C언어용 크로스 플랫폼 GUI 라이브러리 file makersweb 2022.10.10 856
22 Protocol Buffers 를 이용한 직렬화 with Conan Package Manager file makersweb 2021.02.24 860
21 C++를 위한 Lottie 라이브러리 with SDL2 file makersweb 2021.08.15 962
20 [NodeGui] JavaScript로 데스크탑 응용프로그램 작성 file makersweb 2023.02.21 1066
19 LVGL 을 통해 GUI 구현 시 한글 폰트 추가 file makersweb 2023.02.07 1073
» Qt와 GStreamer 로 작성한 flac 오디오 재생 예제 file makersweb 2020.09.05 1139
17 Flutter/Dart 와 Qt/QML 비교 file makersweb 2021.11.07 1400
16 CANdevStudio 를 사용하여 CAN 네트워크 시뮬레이션 file makersweb 2021.03.09 1689