Потоковая передача LibVLC в память p_audio_data

Я использую LibVLC для потоковой передачи аудиофайла в память, чтобы его можно было отправлять по частям через сокет UDP.

Я следил за руководством здесь: https://wiki.videolan.org/Stream_to_memory_%28smem%29_tutorial/

Вот мой код:

   void handleStream(void* p_audio_data, uint8_t* p_pcm_buffer, unsigned int channels,
            unsigned int rate, unsigned int nb_samples, unsigned int bits_per_sample, size_t size, int64_t pts)
        {
        char *buffer;
        int dataSize = size;
        int messageSize;
    int dataSent = 0;

    //cout << p_pcm_buffer << endl;

    // While we have data to write
    while (dataSize > 0)
    {
        // Set the size of the next message to send
        if (dataSize > MESSAGE_SIZE)
        {
            messageSize = MESSAGE_SIZE;
        }
        else
        {
            messageSize = dataSize;
        }

        // Write the data to the socket
        buffer = new char[dataSize];
        memcpy(buffer, p_pcm_buffer + dataSent, messageSize);

        sendto(multicastSocket, buffer, MESSAGE_SIZE, 0, (struct sockaddr *) &multicastDestInfo, sizeof(multicastDestInfo));

        dataSize -= messageSize;
        dataSent += messageSize;

        delete[] buffer;
    }

    // Free the temporary stream buffer
    free(p_pcm_buffer);
}

Проблема, с которой я столкнулся, заключается в том, что мне нужно указать в обратном вызове handleStream, в какой сокет отправлять данные. Учебник LibVLC подразумевает, что я могу указать объект, переданный через

void* p_audio_data

Но я не могу найти никаких ресурсов о том, как его установить.

Будем очень благодарны любой помощи!


person Christofer Klassen    schedule 02.04.2015    source источник


Ответы (1)


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

struct Myparam{
    //your socket param
    struct SocketStruct socket;
    //other params
}
..
Myparam* pUserData = new Myparam();
param->socket = multicastSocket;

..

sprintf(smem_options
  , "#transcode{vcodec=h264}:smem{"
     "video-prerender-callback=%lld,"
     "video-postrender-callback=%lld,"
     "video-data=%lld,"
     "no-time-sync},"
  , (long long int)(intptr_t)(void*)&cbVideoPrerender
  , (long long int)(intptr_t)(void*)&cbVideoPostrender 
  , (long long int)(intptr_t)(void*)pUserData
  );
person Yasin Yildirim    schedule 19.01.2016