现在可以用Socket连接到IP摄相机,并获取MJPEG视频流,
如何获取FFD8和FFD9之间的数据包?请熟悉的朋友介绍下,谢谢

解决方案 »

  1.   

    int n_first =_string.Find(L"FFD8");
    if(n_first>=0)
    {//如果找到FFD8
    int n_second=_string.Find(L"FFD9",n_first+4);//从查找到的第一个位置开始向后查找 
    if(n_second>n_first)
    {
    if(n_second >n_first+4)
    {
    Out_string = _string.Mid(n_first,n_second - n_first+4);//抛出一个完整指令
    }
      

  2.   

    如果比较请用strcmp(),因为数据流里难免有‘0’这些符号,用字符串寻找的时候已经截断了,造成数据丢失~
      

  3.   


    Socket接收到的视频数据包,都存储到source.txt文件中,
    然后读这个文件,找FFD8和FFD9之间的数据,写入dest.jpg文件中;
    下面的算法不知道是否正确,查看dest.jpg文件看到不清楚。//保存接收到的MJPEG流数据包
        char   Dest[3000]; //存储接收到的数据包      
        nRet=0; //接收到的数据包长度

    FILE* fp;  //写文件
    fp= fopen("source.txt", "wb");

    while(1 == bFlag)        
    {   
    nRet = recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);        
    if(nRet>0) 
    {
    Dest[nRet]=0; //添加结束标记
    }

    if (NULL != fp)
    {
    fwrite(Dest, nRet,1, fp);
    }

    Sleep(1);
    } //while(1 == bFlag) 

    fclose(fp); //从文本文件中读FFD8和FFD9之间的数据,保存到一张图片中
    #define MAX_SIZE  1024*500void CIPVideoDlg::OnButton5() 
    {
    unsigned char chBuf[MAX_SIZE] = {0};
        unsigned char chBegin[2] = {0xFF,0xD8};
        unsigned char chEnd[2] =   {0xFF,0xD9};
        int iLen = 0;
        int iBegin = 0;
        int iEnd = 0;

        FILE* fp = fopen("source.txt", "rb+"); //读写方式打开二进制文件
        if (fp != NULL)
        {
            fseek(fp, 0, SEEK_END); //文件指针定向到文件结尾
            iLen = ftell(fp);       //获取文件长度  
            fseek(fp, 0, SEEK_SET); //定位到文件开始位置
            fread(chBuf, 1, iLen, fp);
            int ioffset = 0;        //偏移量,一次移动两个字节

            while (1)
            {
    //查找 FF D8
                if (!memcmp(chBuf+ioffset, chBegin, 2))
                {
                    iBegin = ioffset;
                }

    //查找 FF D9
                if (!memcmp(chBuf+ioffset, chEnd, 2))
                {
                    iEnd = ioffset;
                    break;
                }

                ioffset += 2;
            }
        }
        fclose(fp);

        fp = fopen("dest.jpg", "wb");
        if (NULL != fp)
        {
            fwrite(chBuf+iBegin, iEnd-iBegin+2,1, fp);
        }
        fclose(fp);
    }
      

  4.   

    把socket接收的数据包都存储到source.txt文件中;
    然后查找是否有FFD8和FFD9,有的话把FFD8和FFD9之间的数据存储到新的图片中,然后把source.txt文件中的FFD9之前的数据删除,
    该如何实现呢?