라즈베리파이 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
https://gstreamer.freedesktop.org/documentation/application-development/basics/helloworld.html
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
16 | 라즈베리파이4에서 openFrameworks 예제 실행 | makersweb | 2020.12.13 | 1387 |
15 | Dear ImGui, 경량의 C++ 용 GUI 및 Widget 라이브러리 | makersweb | 2020.11.28 | 10240 |
14 | GENIVI DLT(Diagnostic Log and Trace) 활용 | makersweb | 2020.11.19 | 10631 |
13 | 윈도우에서 안드로이드 flutter 프로그래밍 개발환경 구축(with Visual Studio Code) | makersweb | 2020.09.16 | 1609 |
12 | 가볍고 쉬운 임베디드용 그래픽 라이브러리 - LVGL | makersweb | 2020.09.16 | 4375 |
» | Qt와 GStreamer 로 작성한 flac 오디오 재생 예제 | makersweb | 2020.09.05 | 1865 |
10 | ZeroMQ 비동기 클라이언트/서버 패턴 | makersweb | 2020.08.13 | 2633 |
9 | ZeroMQ의 기본 메세지 패턴들 | makersweb | 2020.07.31 | 9633 |
8 | [SDL2 와 OpenGL]윈도우 생성과 2D그래픽 | makersweb | 2020.04.11 | 3841 |
7 | Pluma(C++ Plug-in Management Framework) 튜토리얼 | makersweb | 2019.12.07 | 14698 |
6 | 도커(docker)설치 및 기본 명령어 | makersweb | 2019.12.02 | 1249 |
5 | webOS소개 및 Raspberry Pi 3 에서 실행 | makersweb | 2019.10.13 | 4634 |
4 | 리눅스에서 SDL2 최신버전 컴파일과 Qt Creator로 개발환경 구성 | makersweb | 2019.10.06 | 3771 |
3 | 텔레그램(Telegram) Bot 개발 | makersweb | 2019.07.21 | 6557 |
2 | GDBus 튜토리얼(GDBus tutorial) | makersweb | 2019.06.30 | 11670 |
1 | Wayland IVI Extension 간단 리뷰 | makersweb | 2019.05.12 | 2988 |