2015-04-02 169 views
1

我一直在使用LibVLC来将音频文件流式传输到内存,以便它可以通过UDP套接字一块一块发送。LibVLC流式传输到内存p_audio_data

我在这里以下教程: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 

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

任何援助将不胜感激!

回答

0

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

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