【发布时间】:2017-05-15 21:35:55
【问题描述】:
您好,我正在尝试实现 libvlc 3.0 版的此功能,libvlc_new_callbacks 以从缓冲区数组中读取。 Documentation
我有一个使用 libusb 从设备接收 USB 传输的函数
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;
}
实际上传输的字节转到一个文件,然后用 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 传递给函数,并将回调设置为打开和读取,将搜索和关闭声明为 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 函数将数据指向 opaque(buffer) 并将 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;
}
但我无法让它工作,我找不到使用此功能的代码。
【问题讨论】: