2017-04-25 20 views
0

你好,我试图实现libvlc版本3.0,libvlc_new_callbacks从缓冲区数组中读取这个函数。 DocumentationLibvlc函数libvlc_new_callbacks

我得到了使用libusb从设备

static void procedimiento_de_llamada_leer_transferencia_usb(struct libusb_transfer *transferencia_usb_2) 
{ 
    if(transferencia_usb_2->status == LIBUSB_TRANSFER_COMPLETED)    
    { 
     std::cout<<"Transferencia completa"<<std::endl;      
    } 
    else std::cout<<"Error: "<<transferencia_usb_2->status<<std::endl;  

    contador_evitar_basura++;             
    if (contador_evitar_basura > 4)     
    { 
     apuntador_al_buffer_recepcion_BTS=transferencia_usb_2->buffer; 
     variable_archivo_TS.write((char *)transferencia_usb_2->buffer, tamanio_buffer); 
    } 

    int respuesta_transferencia_llamada = libusb_submit_transfer(transferencia_usb_2); 

    if(respuesta_transferencia_llamada != 0) std::cout<<"Error transferencia: "<<respuesta_transferencia_llamada<<std::endl; 
} 

居然收到USB传输功能与发送的字节数去一个文件,然后打开与libvlc该文件作为一个媒体文件来复制它,用该行指令我写接收到文件的字节数

variable_archivo_TS.write((char *)transferencia_usb_2->buffer, tamanio_buffer); 

我可以看到视频中我的计划,但该文件在不断增加,如果继续收看视频很长一段时间的文件能得到的10大小GB。我想发送的libusb收到玩家的缓冲区,但不保存在一个文件中,我创建一个指向缓冲区

unsigned char *apuntador_al_buffer_recepcion_BTS; 

apuntador_al_buffer_recepcion_BTS=transferencia_usb_2->buffer; 

那么我想实现libvlc_new_call_backs的功能的全局变量:

我通过指针apuntador_al_buffer_recepcion_BTS到函数,并设置回调打开和读取,声明seek和关闭为NULL,也许是一个错误的方法,但我想读取所有的缓冲区,所以我不想需要寻求功能

void procedimiento_media_callbacks() 
{ 
    static libvlc_media_t *media = libvlc_media_new_callbacks(
         instancia_vlc,  // vlc 
         open_callback,  //open media 
         read_callback,  //read media 
            NULL,  //NULL seak 
            NULL,  //NULL close 
    apuntador_al_buffer_recepcion_BTS); //NULL 

    libvlc_media_player_set_media(reproductor, media); 
    libvlc_media_add_option(media, funcion_leer_id());  
    libvlc_media_player_set_media(reproductor, media);   

} 

我在只使用open_callback功能点的数据不透明(缓冲区),并设置sizep到缓冲区的大小思维,

int open_callback(void *opaque, void **datap, long unsigned int *sizep) 
{ 
    *sizep = 245760; 
    *datap = opaque; 
    return 0; 
} 

在读功能我不知道这个刚刚返回大小的数据读取它

long int read_callback(void *opaque, unsigned char *buf,long unsigned int len) 
{ 
    return 245760; 
} 

但我无法得到它的工作,我找不到使用此功能的代码。

回答

1

它的工作

//! Variable para indicar la posicion del buffer a copiar a la media del reproductor. 
/*! 
    Posiciones={0,245760,491520,737280,983040,1228800,1474560,1720320,1966080,2211840,2457600,2703360,2949120,3194880,3440640,3686400,3932160,4177920,4423680,4669440}. 
*/ 
static int posicion_media_buffer=0; 

//! Función de llamada de la función libvlc_media_new_callbacks para apuntar a la posición de los datos y guardar el tamaño del buffer a leer. 
/*! 
    \param *opaque apuntador al buffer rotativo. 
    \param **datap espacio de alamacenamiento para un apuntador de datos. 
    \param *sizep apuntador al tamaño del buffer de datos. 
    \return 0 operación exitosa. 
*/ 
int abrir_media(void *opaque, void **datap, long unsigned int *sizep) 
{ 
    *sizep = tamanio_buffer;            //Asigna el tamaño de los datos 
    *datap = opaque;              //Coloca como data con el apuntador al buffer rotativo 
    return 0;                //Devuelve cero 
} 

//! Función de llamada de la función libvlc_media_new_callbacks para leer los datos. 
/*! 
    \param *opaque apuntador al buffer rotativo. 
    \param *buf apuntador al buffer de lectura. 
    \param len longuitud de los datos a leer. 
    \return devuelve la cantidad de datos leidos. 
*/ 
long int leer_media(void *opaque, unsigned char *buf,long unsigned int len) 
{ 
    len=tamanio_buffer_MPEG_TS;             //Longuitud de datos a leer igual al tamanio_buffer_MPEG_TS 
    std::memcpy(buf,((unsigned char*)opaque+posicion_media_buffer), len);  //copiar los dtoas del buffer rotativo al buffer de lectura 
    procedimiento_retardo_milisegundos(2);          //Retardo par evitar uso excesivo del CPU 
    posicion_media_buffer+=tamanio_buffer_MPEG_TS;        //Aumentar posición_media_buffer con los datos ya leidos 

    if(posicion_media_buffer>4669440||funcion_leer_estado_hotplug()!=1)   //Si posicion_media_buffer mayor a 4669440 ó dispositivo desconectado 
     posicion_media_buffer=0;            //posicion_media_buffer igual a cero 

    return tamanio_buffer_MPEG_TS;            //Devuelve la cantidad de datos leidos 
} 

//! Funcion de llamada de la función libvlc_media_new_callbacks para colocar la nueva posición en el buffer de datos. 
/*! 
    \param *opaque apuntador al buffer rotativo. 
    \param offset posicion de nuevos datos leidos. 
    \return 0 operación exitosa. 
*/ 
int posicionar_media(void *opaque, uint64_t offset) 
{ 
    offset=0; //offset igual a cero 
    return 0; //retorna cero 
} 

//! Procedimiento procedimiento_media_callbacks. 
/*! 
    Procedimeinto para obtener la data media y luego mandarlar a reproducir con el reproductor. 
*/ 
void procedimiento_media_callbacks(void) 
{ 
    media = libvlc_media_new_callbacks( //media igual a los datos BTS que llegan la pueert USB su llenado es asincrónico 
         instancia_vlc,  //Instancia vlc 
          abrir_media,  //función de llamada abrir_media() 
          leer_media,  //función de llamada leer_media() 
         posicionar_media,  //función de llamada posicionar_media() 
            NULL,  //NULL cerrar media 
    apuntador_al_buffer_recepcion_BTS); //Apuntador al buffer roatativo 

    libvlc_media_add_option(media, funcion_leer_id());          //Se coloca el ID del canal deseado a reproducir 
    libvlc_media_player_set_media(reproductor, media);          //Se coloca el medio media en el reporductor 
    libvlc_media_player_play(reproductor);             //Reproducir 
} 
+0

感谢你一个例子,我如何使代码的一部分,我试图让这个工作太,目前不成功,但你的例子是向前发展非常有帮助 – amigo421