mfc下调用vlc播放ps流视频文件

简易2017 2013-10-22 09:09:04
为什么视频播放的时候没有任何反应,我取的每一帧的数据应该没有问题,然后放到了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; //返回一帧长度
}
...全文
344 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-12-21
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
简易2017 2013-11-21
  • 打赏
  • 举报
回复
原因是因为创建p_media时的参数不正确,下面这个是播放网络视频的 p_media = libvlc_media_new_location(p_instance, "udp://127.0.0.1:1236"); 如果需要播放本地视频,其实不需要每帧读取,直接给出路径然后播放即可。 p_media = libvlc_media_new_location(p_instance, m_filename); 关于你说你没有libvlc_media_player_pushdata,我想应该是版本不一样吧。 我的文件头部作者信息是: * Authors: Clément Stenac <zorglub@videolan.org> * Jean-Paul Saman <jpsaman@videolan.org> * Pierre d'Herbemont <pdherbemont@videolan.org> 如果需要我可以发你。我的邮箱是lixin171254@sina.cn
老狼主 2013-11-19
  • 打赏
  • 举报
回复
兄台:问题解决了吗?这个libvlc_media_player_pushdata函数是自己写的吗?VLC提供的API里面没找到你这个函数啊?

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧