Gstreamer под Sailfish OS не выводит звук

Я занимаюсь разработкой аудиоплеера для ОС Sailfish и пытаюсь воспроизвести файл через gstreamer, но проблема в том, что звука нет.

Я проверил gstream через консоль:

gst-launch-0.10 filesrc location = / path / to / file.ogg! расшифровка!
autoaudiosink

И это работает нормально!

Я проверил конвертацию аудио файла в аудио файл:

int
main (int   argc,
char *argv[])
{
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;

gst_init (&argc, &argv);

pipeline = gst_parse_launch ("filesrc location=/home/nemo/Music/Ringtones/Myfile.mp3 ! decodebin ! audioconvert ! vorbisenc ! oggmux ! filesink location=test.ogg", NULL);

gst_element_set_state (pipeline, GST_STATE_PLAYING);

bus = gst_element_get_bus (pipeline);
msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

if (msg != NULL)
gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);

return 0;
}

И это работает нормально!

Но, когда я пытаюсь играть в нее, нет звука:

pipeline = gst_parse_launch ("filesrc location=/home/nemo/Music/Ringtones/Myfile.mp3 ! decodebin ! audioconvert ! autoaudiosink", NULL);

Версия Gstreamer: 0.10

1

Решение

Проблема заключалась в том, что ресурсы должны быть получены перед использованием:

gst-launch статически устанавливается как «player» в конфигурации политики ресурсов, поэтому его можно запускать без дополнительной работы.

Однако, когда вы создаете свое собственное приложение, вам нужно будет самостоятельно приобрести ресурсы для воспроизведения аудио.

Проверьте https://github.com/nemomobile/libaudioresource если вы разрабатываете приложение C-only или https://github.com/nemomobile/libaudioresource-qt для приложения Qt.

Пример:

#include <gst/gst.h>
#include <audioresource.h>
#include <glib.h>
#include <unistd.h>
#include <stdio.h>

/*
* Dependencies glib2-devel, libaudioresource-devel, gstreamer-devel.
* Compile with:
* gcc `pkg-config --cflags --libs gstreamer-0.10` `pkg-config --cflags --libs audioresource` `pkg-config --cflags --libs glib-2.0` gst-example.c -o gst-example
*
* Check https://github.com/nemomobile/libaudioresource
*/

static GstElement *pipeline;
static int got_reply = 0;

static void on_acquired(audioresource_t *audio_resource, bool acquired, void *user_data)
{
got_reply = 1;
printf("on_acquired: %s\n", acquired ? "true" : "false");
if (acquired) {
// start playback here
printf("start playback\n");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
} else {
// stop playback here
}
}

static void naive_wait()
{
got_reply = 0;
while (!got_reply) {
g_main_context_iteration(NULL, false);
usleep(1000);
}
}

int main(int   argc, char *argv[])
{
audioresource_t *resource;
void *user_data = NULL;
char tmp[1024];
GstBus *bus;
GstMessage *msg;

if (argc < 2) {
printf("audio file argument needed.\n");
return 1;
}

gst_init (&argc, &argv);

printf("initialize audioresource for media player\n");
resource = audioresource_init(AUDIO_RESOURCE_MEDIA, on_acquired, user_data);

snprintf(tmp, 1024, "filesrc location=%s ! decodebin ! audiocovert ! autoaudiosink", argv[1]);
printf("create pipeline: %s\n", tmp);
pipeline = gst_parse_launch (tmp, NULL);

printf("acquire audioresource..\n");
// When you want to start playback
audioresource_acquire(resource);

// Wait for the reply for acquire..
naive_wait();

bus = gst_element_get_bus (pipeline);
msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

if (msg != NULL)
gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);

printf("release audioresource..\n");
audioresource_release(resource);

// Wait for release..
naive_wait();

// When you close your application
audioresource_free(resource);

return 0;
}

Спасибо Юхо Хямяляйнену за ответ!

1

Другие решения


По вопросам рекламы [email protected]