2015-04-02 171 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 
);