Page 1 of 1

Getting Raw Audio Data with libVLC on Qt Application

Posted: 15 Mar 2022 19:04
by brianuuu
Hello, I have been developing a Qt Application that uses libVLC to display output from game capture cards for video/audio analysis.
I have all the video output working fine for a while now and I want to start looking into how to get audio data to first doing visualizations and ultimately do audio analysis.

The tutorial I'm following is from here:
https://wiki.videolan.org/Stream_to_mem ... _tutorial/

However, when I initialize vlc instance with the smem options, the callback functions doesn't get called at all, I'm not sure what I'm missing...
Here's my code, I also include the part where it starts the mediaplayer with capture card in case there are things that affects it:

Code: Select all

// Audio prerender callback static void cbAudioPrerender (void* p_audio_data, uint8_t** pp_pcm_buffer , unsigned int size) { qDebug() << "test" } // Audio postrender callback static void cbAudioPostrender(void* p_audio_data, uint8_t* p_pcm_buffer, unsigned int channels, unsigned int rate, unsigned int nb_samples, unsigned int bits_per_sample, unsigned int size, int64_t pts ) { } VLCWrapper::VLCWrapper(QLabel* videoWidget, QSlider* volumeSlider, QWidget *parent) : QWidget(parent) , m_volumeSlider(volumeSlider) , m_videoWidget(videoWidget) { char smem_options[256]; sprintf(smem_options , "#transcode{acodec=s16l}:smem{" "audio-prerender-callback=%lld," "audio-postrender-callback=%lld," "audio-data=%lld}" , (long long int)(intptr_t)(void*)&cbAudioPrerender , (long long int)(intptr_t)(void*)&cbAudioPostrender , (long long int)&ctxAudio); const char* const vlc_args[] = { "--intf", "dummy", "--vout", "dummy", "--sout", smem_options }; m_instance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args); m_mediaPlayer = libvlc_media_player_new(m_instance); ctx.m_label = m_videoWidget; ctx.m_pixels = new uchar[VIDEO_WIDTH * VIDEO_HEIGHT * 4]; memset(ctx.m_pixels, 0, VIDEO_WIDTH * VIDEO_HEIGHT * 4); } bool VLCWrapper::start(const QString &vdev, const QString &adev) { if (vdev.isEmpty() && adev.isEmpty()) return false; m_media = libvlc_media_new_location(m_instance, "dshow://"); // Video QString vdevOption = ":dshow-vdev="; vdevOption += vdev.isEmpty() ? "none" : vdev; libvlc_media_add_option(m_media, vdevOption.toStdString().c_str()); // Audio QString adevOption = ":dshow-adev="; adevOption += adev.isEmpty() ? "none" : adev; libvlc_media_add_option(m_media, adevOption.toStdString().c_str()); // Aspect ratio, resolution libvlc_media_add_option(m_media, ":dshow-aspect-ratio=16:9"); // Caching libvlc_media_add_option(m_media, ":live-caching=0"); // Pass to player and release media libvlc_media_player_set_media(m_mediaPlayer, m_media); libvlc_media_release(m_media); // Set the callback to extract the frame or display it on the screen ctx.m_frame = QImage(VIDEO_WIDTH, VIDEO_HEIGHT, QImage::Format_ARGB32); ctx.m_frame.fill(QColor(0,0,0)); libvlc_video_set_callbacks(m_mediaPlayer, lock, unlock, display, &ctx); libvlc_video_set_format(m_mediaPlayer, "BGRA", VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_WIDTH * 4); // Play media int result = libvlc_media_player_play(m_mediaPlayer); if (result == -1) { return false; } else { libvlc_video_set_adjust_int(m_mediaPlayer, libvlc_video_adjust_option_t::libvlc_adjust_Enable, true); return true; } }

Re: Getting Raw Audio Data with libVLC on Qt Application

Posted: 15 Mar 2022 21:16
by Rémi Denis-Courmont
You can't use both at the same time. smem is not part of the supported LibVLC API.

Please refer to the official API documentation, not old wiki articles.

Re: Getting Raw Audio Data with libVLC on Qt Application

Posted: 15 Mar 2022 22:25
by brianuuu
You can't use both at the same time. smem is not part of the supported LibVLC API.

Please refer to the official API documentation, not old wiki articles.
Thanks for the reply, I can see there's libvlc_audio_set_callbacks() that can give me raw audio data as well? But in this case I will need to implement playing audio manually is that correct?
In VLC Player you can visualize the audio with spectrum etc., was it done in a similar way?

Re: Getting Raw Audio Data with libVLC on Qt Application

Posted: 16 Mar 2022 12:11
by Rémi Denis-Courmont
Yes, yes, and no.

Re: Getting Raw Audio Data with libVLC on Qt Application

Posted: 17 Mar 2022 16:01
by brianuuu
Yes, yes, and no.
I see, so I have manage to play the audio using Qt with raw PCM data, but when I try to change the audio format, it always forced to use s16l, the code I'm using:

Code: Select all

libvlc_audio_set_callbacks(m_mediaPlayer, cbAudioPlay, nullptr, nullptr, nullptr, nullptr, &ctxAudio); libvlc_audio_set_format(m_mediaPlayer, "f32l", 48000, 2);
I tried changing the sample rate and it does change accordingly, but format doesn't change.

And here's the output:

Code: Select all

main generic debug: creating audio output main audio output debug: looking for audio output module matching "amem,none": 6 candidates main audio output debug: using audio output module "amem" ----> main audio output debug: output 's16l' 48000 Hz Stereo frame=1 samples/4 bytes main volume debug: looking for audio volume module matching "any": 2 candidates main volume debug: using audio volume module "integer_mixer" main audio output debug: input 's16l' 44100 Hz Stereo frame=1 samples/4 bytes main audio filter debug: looking for audio filter module matching "scaletempo": 16 candidates scaletempo audio filter debug: format: 44100 rate, 2 nch, 4 bps, fl32 scaletempo audio filter debug: params: 30 stride, 0.200 overlap, 14 search scaletempo audio filter debug: 1.000 scale, 1323.000 stride_in, 1323 stride_out, 1059 standing, 264 overlap, 617 search, 2204 queue, fl32 mode main audio filter debug: using audio filter module "scaletempo" main audio output debug: conversion: 's16l'->'f32l' 44100 Hz->44100 Hz Stereo->Stereo main audio converter debug: looking for audio converter module matching "any": 8 candidates audio_format audio converter debug: s16l->f32l, bits per sample: 16->32 main audio converter debug: using audio converter module "audio_format" main audio output debug: conversion pipeline complete main audio output debug: conversion: 'f32l'->'s16l' 44100 Hz->44100 Hz Stereo->Stereo main audio converter debug: looking for audio converter module matching "any": 8 candidates audio_format audio converter debug: f32l->s16l, bits per sample: 32->16 main audio converter debug: using audio converter module "audio_format" main audio output debug: conversion pipeline complete main audio resampler debug: looking for audio resampler module matching "any": 3 candidates main audio resampler debug: using audio resampler module "ugly"

Re: Getting Raw Audio Data with libVLC on Qt Application

Posted: 17 Mar 2022 16:31
by Rémi Denis-Courmont
There is a bug in the documentation. You need to use "FL32".

Re: Getting Raw Audio Data with libVLC on Qt Application

Posted: 17 Mar 2022 17:28
by brianuuu
There is a bug in the documentation. You need to use "FL32".
I have tried FL32 too, but still doesn't change, I even tried others like S16N, S32N, S32L, nothing affects it :(
For reference I'm using revision 3.0.16-0-g5e70837d8d

Re: Getting Raw Audio Data with libVLC on Qt Application

Posted: 18 Mar 2022 12:42
by unidan
Hi, you can also create a visualization plugin if you want an entrypoint where you get the audio stream without blocking the audio playback. That's how visualization are working in VLC, to answer your question.