c++ - LibVLC 流式传输到内存 p_audio_data

标签 c++ sockets memory stream libvlc

我一直在使用 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

但我找不到任何关于如何实际设置它的资源。

如有任何帮助,我们将不胜感激!

最佳答案

您可以为需要发送的参数定义结构或类。

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
  );

关于c++ - LibVLC 流式传输到内存 p_audio_data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29422710/

相关文章:

c++ - Cocos2Dx中Singleton的正确实现方式

c - 在 C 中,如何在不关闭/关闭套接字的情况下写入数据后指示 EOF?

c - libncurses : non-blocking STDIN + select on socket

c - 如何使内存总线饱和

php - 大型数组的 PHP QuickHash 经验

c++ - 浮点除法的软件实现,舍入问题

c++ - 带有 cocos2d-x 3 beta 2 的 Xcode 5.1 中的链接器错误

c++ - 在ubuntu中编译c++程序

如果多连接网络服务器中有一段时间不活动,则关闭套接字

c++ - 在 CUDA 上生成决策树