你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教下,播放avi如何实现快进退啊 ???

[复制链接]
hpdell 提问时间:2018-8-22 09:56 /
请教下,播放avi如何实现快进退啊 ???

自己捣鼓了了一下,没有成功,代码如下:

void AVI_TimeSet(FIL *_pFile, VideoPlayCtrlRTOS   *_VideoPlayCtrl)
{
        uint32_t fpos = _pFile->fptr;
  uint32_t uiPos = 0;
        uint32_t BytesRD = 0;
        uint32_t offset = 0;
        uint8_t  *tempbuf = 0;
        uint8_t  *pbuf = 0;

        uiPos = (_pFile->obj.objsize / _VideoPlayCtrl->Totsec) * g_tWav.uiCurTime;  //每次前进 g_tWav.uiCurTime 秒钟的数据量
        tempbuf   = mymalloc(SRAMEX,   AVI_MAX_SIZE);            // 申请视频buf 120KByte or 1MB
       
        while(1)
        {
                if(fpos < _pFile->obj.objsize)
                {
                        fpos += uiPos;
                        if(fpos > (_pFile->obj.objsize - AVI_MAX_SIZE))
                        {
                                fpos = _pFile->obj.objsize - AVI_MAX_SIZE;
                        }       
                }
                else
                {
                        if(fpos > uiPos)
                                fpos -= uiPos;
                        else
                                fpos=0;        
                }
                f_lseek (_pFile, fpos);      //偏移到数据开始的地方

                if(fpos == 0)
                        AVI_GetFrame(&AVI_Handel, _pFile);   //从 0 开始寻找, 这个测试 ok
                else
                {

                        pbuf = tempbuf;
                        f_read(_pFile, pbuf, AVI_MAX_SIZE, (UINT*)&BytesRD );
                        pbuf = tempbuf;
                        offset = __AVI_SearchID(pbuf,  AVI_MAX_SIZE, AVI_Handel.aviInfo.VideoFLAG);   //寻找视频帧
                       
                        // Read first Frame info
                        __AVI_GetStreamInfo( &AVI_Handel, pbuf + offset );  //获取流信息
                       
                        if(AVI_Handel.aviInfo.StreamID == AVI_VIDS_FLAG)//显示帧
                        {
                                // go to the first frame offset in the avi file
                                f_lseek(_pFile,  fpos + offset  );//偏移到流数据开始处
                               
                                  // Get the current frame size
                                AVI_Handel.FrameSize = AVI_Handel.aviInfo.StreamSize;
                               
                                break;
                        }
                        else if(AVI_Handel.aviInfo.StreamID == AVI_AUDS_FLAG)
                        {
                                // go to the first frame offset in the avi file
                                f_lseek(_pFile,  fpos + offset  );//偏移到流数据开始处
                               
                                  // Get the current frame size
                                AVI_Handel.FrameSize = AVI_Handel.aviInfo.StreamSize;
                               
                                break;
                        }
                }
        }
        myfree(SRAMEX, tempbuf);                //释放内存
}


经过上面查找后,进入正常播放状态,貌似只能够 播放一帧,后续识别到的

AVI_Handel.aviInfo.StreamID  这个数据流的值为 0  ???????????????????

收藏 评论2 发布时间:2018-8-22 09:56

举报

2个回答
feixiang20 回答时间:2018-8-23 00:03:40
循环语句里参数值没有改变么,检查偏移是不是对

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

hpdell 回答时间:2018-8-23 10:47:01
feixiang20 发表于 2018-8-23 00:03
循环语句里参数值没有改变么,检查偏移是不是对

循环播放里面,如果我不使用 快进退功能,播放是完全没有问题的啊,

循环播放里面是有进行偏移的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版