mfc下调用vlc播放ps流视频文件
为什么视频播放的时候没有任何反应,我取的每一帧的数据应该没有问题,然后放到了vlc播放器缓冲区里了,但是就没有播放不出来,我想问是不是我读取本地磁盘文件太慢了?还是其他原因?
UINT CNativeVideo::Work(void)
{
HWND Hwnd = this->GetDlgItem(IDC_NativePlay)->GetSafeHwnd();
int nStartPlayFlag = 0;
int nFlag = 0;
int nCount = 0;
char *pFrame = (char *)malloc(1024*150);
LONG ReadSize = 0;
LONG found = 1;
LONG frameSize = 0;
LONG hasCalSize = 0;
char ReadBuf[DATA_LENGTH] ={0};
char *pTem = NULL;
CFile vidoeFile;
if (!vidoeFile.Open(m_filename,CFile::modeRead)) //打开本地录像文件
{
MessageBox("文件打开失败","警告",MB_OK);
return 0;
}
libvlc_instance_t *p_instance;
libvlc_media_t *p_media;
libvlc_media_player_t *p_media_player;
int vlc_argc = 0;
char *vlc_argv[100];
vlc_argv[vlc_argc++] = "--ignore-config";
p_instance = libvlc_new(vlc_argc, vlc_argv);
p_media = libvlc_media_new_location(p_instance, "udp://127.0.0.1:1236");
p_media_player = libvlc_media_player_new_from_media(p_media);
libvlc_media_release(p_media);
p_media = NULL;
libvlc_media_player_set_hwnd(p_media_player, (void*)Hwnd);
libvlc_media_player_set_buffertime(p_media_player, 0);
while (1)
{
LONG surp = ReadSize - hasCalSize; //将前一次读取的不完整的一帧拷贝到缓冲区的最前面
if (( surp!=0)&&(pTem !=NULL))
{
memcpy(ReadBuf,pTem,surp);
}
ReadSize = vidoeFile.Read(ReadBuf+surp,DATA_LENGTH-surp);
if (ReadSize<=0)
{
break;
}
hasCalSize = 0;
found = 1;
ReadSize +=surp;
while(found==1) //先表示为1,然后对readBuff区进行查找完整的一帧
{
found = 0;
frameSize = CalOneFrameSize(ReadBuf+hasCalSize,ReadSize-hasCalSize,&found);
if (found == 1) //找到完整的一帧
{
memcpy(pFrame,ReadBuf+hasCalSize,frameSize*sizeof(char));
CString str;
str.Format("%x",pFrame[6]);
libvlc_media_player_pushdata(p_media_player, (unsigned char *)pFrame, frameSize);
nStartPlayFlag++;
if (nStartPlayFlag == START_PLAY)
{
libvlc_media_player_play(p_media_player);
}
hasCalSize += frameSize;
}
}
pTem = ReadBuf+ hasCalSize; //缓冲区剩下的不是完整的一帧
}
vidoeFile.Close();
libvlc_media_player_set_position(p_media_player, 0);
libvlc_media_player_stop(p_media_player);
libvlc_media_player_release(p_media_player);
p_media_player = NULL;
libvlc_release(p_instance);
p_instance = NULL;
free(pFrame);
pFrame = NULL;
return 0;
}
/*计算完整一帧的长度*/
LONG CNativeVideo::CalOneFrameSize(char *buf,LONG bufSize,LONG *found)
{
DWORD code = 0;
unsigned char *ptr = NULL; //必须是无符号char类型
LONG i = 0;
LONG frameSize = 0;
LONG BeginIndex = 0;
if (buf == NULL||found == NULL)
{
return 0;
}
*found = 0;
ptr = (unsigned char *)buf;
while(code != 0x000001ba) //找到一帧的开始标示符
{
if (i>=bufSize) //出错
{
return 0;
}
code = (code<<8)+ptr[i];
i++;
}
code =0;
BeginIndex = i;
while((code != 0x000001b9)&&(code != 0x000001ba)) //找到下一帧的起始位置或者文件结束位置
{
if (i>=bufSize)
{
return 0;
}
code =(code<<8)+ptr[i];
i++;
}
*found = 1;
frameSize = i-BeginIndex;
return frameSize; //返回一帧长度
}