1

Sailfish OS 用のオーディオ プレーヤーを開発していて、gstreamer 経由でファイルを再生しようとしていますが、問題: 音が出ません。

コンソール経由で gstream を確認しました:

gst-launch-0.10 filesrc location=/path/to/file.ogg ! デコードビン!自動オーディオシンク

そして、それはうまく機能しています!

オーディオファイルをオーディオファイルに変換することをテストしました:

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

4

1 に答える 1

1

問題は、リソースを使用する前に取得する必要があるためです。

gst-launch は、リソース ポリシー構成で "player" として静的に設定されるため、追加の作業なしで実行できます。

ただし、独自のアプリケーションを作成する場合は、オーディオ再生リソースを自分で取得する必要があります。

C のみのアプリケーションを開発している場合はhttps://github.com/nemomobile/libaudioresourceを、Qt アプリケーションの場合はhttps://github.com/nemomobile/libaudioresource-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;
}

答えてくれたJuho Hämäläinenに感謝します!

于 2015-01-20T16:45:44.797 に答える