1Danke
ERLEDIGT
JA
JA
ANTWORTEN
8
8
ZUGRIFFE
432
432
EMPFEHLEN
-
Hallo Freunde,
hat jemand von euch schonmal mit GStreamer gearbeitet und vielleicht ein eigenes Plugin geschrieben? Ich versuche gerade ein kleines Plugin zu schreiben, mit dem ich eine FFT (eigentlich lieber ein Spektrogramm) auf dem Audiosignal berechnen kann und wollte dafür die libgstfft verwenden. Laut der Synopsis soll man die dafür die flags benutzten die pkg-config --cflags --lib gstreamer-plugins-base-0.10 liefert und zusätzlich noch ein -lgstfft-0.10 verwenden.
Wenn ich allerdings das Plugin dann in meiner Gstreamer Kette verwenden will bekomme ich ein undefined symbol und ein ldd -r liefert mir die gleiche Meldung. Allerdings weiss ich mittlerweile nicht mehr, was mir noch fehlen könnte.
Ich verwende gst-launch-0.10 version 0.10.18
Und die ldd Ausgabe zu dem Plugin ist:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
ldd -r libgstaudioanalyse.so undefined symbol: _Z15gst_fft_f32_newii (./libgstaudioanalyse.so) linux-gate.so.1 => (0xb7f7f000) libgstfft-0.10.so.0 => /usr/lib/libgstfft-0.10.so.0 (0xb7f3e000) libgstreamer-0.10.so.0 => /usr/lib/libgstreamer-0.10.so.0 (0xb7e9a000) libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb7e5d000) libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb7e59000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e55000) libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7e50000) librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7e47000) libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7d27000) libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb7c75000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7c50000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7b5d000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7b52000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7b3a000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb79eb000) /lib/ld-linux.so.2 (0xb7f80000) libz.so.1 => /usr/lib/libz.so.1 (0xb79d5000) libpcre.so.3 => /usr/lib/libpcre.so.3 (0xb79ae000)
Hat vielleicht jemand eine Idee für mich?
Gruß
Der Wolf
-
30.08.10 12:06 #2
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Also fehlt dir die gst_fft_f32_new Funktion, als C++Code bash:1 2
c++filt <<<_Z15gst_fft_f32_newii gst_fft_f32_new(int, int)
Funktion.
Wolltest du evtl. die C Funktion gst_fft_f32_new einbinden?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ja, dass kann gut sein. Immerhin verwende ich die Funktion in einer cpp Klasse.
Allerdings verwende ich schon die ganze Zeit gstreamer Funktionen in der Klasse und hatte bisher keine Probleme.
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/** ========================================================================== * * @file main.cc -- * @brief Source file for audio analyse tool. * * * ========================================================================== */ #include "AudioAnalyse.h" // ========================================================================== // Public methods. // ========================================================================== AudioAnalyse::AudioAnalyse() { gint tmp1 = (gint) 1024; gboolean inverse = (gboolean) false; GstFFTF32 *plan = gst_fft_f32_new(tmp1, inverse); } AudioAnalyse::~AudioAnalyse() { } void AudioAnalyse::processData(GstBuffer *buffer) { gst_buffer_ref(buffer); std::cout << getMimeType(buffer) << std::endl; // std::cout << gst_fft_next_fast_length(buffer->size) << std::endl; gst_buffer_unref(buffer); } // ========================================================================== // Private methods. // ========================================================================== std::string AudioAnalyse::getMimeType(const GstBuffer *buffer) { GstStructure *properties = gst_caps_get_structure(GST_BUFFER_CAPS(buffer), 0); return std::string(gst_structure_get_name(properties)); } int AudioAnalyse::getIntValue(const GstBuffer *buffer, const char *varname) { GstStructure *properties = gst_caps_get_structure(GST_BUFFER_CAPS(buffer), 0); int value = 0, value2 = 0; gboolean success = gst_structure_get_int(properties, varname, &value); if (!success) std::cout << "Int value not readable." << std::endl; return value; } bool AudioAnalyse::getBoolValue(const GstBuffer *buffer, const char *varname) { GstStructure *properties = gst_caps_get_structure(GST_BUFFER_CAPS(buffer), 0); gboolean value = 0; gboolean success = gst_structure_get_boolean(properties, varname, &value); if (!success) std::cout << "Bool value not readable." << std::endl; return value; }
-
30.08.10 12:22 #4
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Du bekommst doch bestimmt Compiler-Warnungen (mit -Wall)?
Hast du den gst/fft/gstfftf32.h Header eingebunden?
Oder hast du die gst_fft_f32_new Funktion irgendwo selbst deklariert?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Der Kompiler warnt nur davor, dass einige Variablen unused sind. Und die Header-Datei hab ich eingebunden. Ich hänge das Plugin mal an. Ich kompiliere es mit cmake 2.6.
-
30.08.10 12:31 #6
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Es scheint das die Autoren des GStreamer Plugins nichts unternehmen um den Code von C++ aus nutzbar zu machen.
Du mußt die Header so einbinden:
GrußCode cpp:1 2 3
extern "C" { #include ... }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ah,
vielen herzlichen Dank. Das hilft mir weiter.
Gruß
Der Wolf
-
Und eine weitere Frage ... (langsam geht mir GStreamer auf den Keks)
Ich versuche gerade die caps für einen Buffer zu generieren, den ich weiter reichen will. Allerdings bekomme ich da Fehlermeldungen, die mir so leider nicht viel sagen. Der Code der die Meldungen zur Laufzeit produziert scheint folgendener zu sein.
Code c:1 2 3 4 5 6 7 8 9 10 11 12
std::cout << "Bis hierhin noch ok." << std::endl; GstBuffer *outputBuffer = gst_buffer_new_and_alloc(2 * plugin->analyse->getSignal().size()); // 4bytes for 32bit float outputBuffer->timestamp = buffer->timestamp; outputBuffer->duration = buffer->duration; static GstCaps *caps = gst_caps_new_simple( "audio/x-raw-int", "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16 ); std::cout << "Hier auch noch." << std::endl;
und zwar scheint es in der Funktion gst_caps_new_simple(...) zu passieren. Die Fehlermeldung sieht folgendermaßen aus.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Bis hierhin noch ok. (gst-launch-0.10:7968): GLib-GObject-WARNING **: can't peek value table for type `(null)' which is not currently referenced (gst-launch-0.10:7968): GLib-GObject-WARNING **: /build/buildd/glib2.0-2.16.6/gobject/gvalue.c:96: cannot initialize GValue with type `(null)', this type has no GTypeValueTable implementation (gst-launch-0.10:7968): GLib-GObject-WARNING **: /build/buildd/glib2.0-2.16.6/gobject/gtype.c:3362: type id `0' is invalid (gst-launch-0.10:7968): GLib-GObject-WARNING **: can't peek value table for type `<invalid>' which is not currently referenced Caught SIGSEGV accessing address 0x10 #0 0xb7f5e410 in __kernel_vsyscall () #1 0xb7cfac07 in poll () from /lib/tls/i686/cmov/libc.so.6 #2 0xb7dd00e6 in **** () from /usr/lib/libglib-2.0.so.0 #3 0xb7dd0497 in g_main_loop_run () from /usr/lib/libglib-2.0.so.0 #4 0xb7eae859 in gst_bus_poll () from /usr/lib/libgstreamer-0.10.so.0 #5 0x0804a4e3 in **** () #6 0x0804b966 in **** () #7 0xb7c44450 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6 #8 0x0804a201 in **** ()
Gruß
Der Wolf
-
Hat sich erledigt. Da fehlte ein NULL am Ende der Funktion. -.-
Ähnliche Themen
-
GStreamer mit perl
Von ToPeG im Forum CGI, Perl, Python, Ruby, Power ShellAntworten: 2Letzter Beitrag: 10.10.10, 16:40 -
GStreamer Pipeline startet nicht
Von Der Wolf im Forum C/C++Antworten: 3Letzter Beitrag: 13.09.10, 13:50 -
GStreamer und GTK
Von MS47475 im Forum C/C++Antworten: 0Letzter Beitrag: 13.01.08, 20:03





Zitieren
Login





