硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2128|回复: 13
收起左侧

[音频视频处理] 请教下,播放avi如何实现快进退啊 ???

[复制链接]

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
发表于 2018-8-22 09:55:58 | 显示全部楼层 |阅读模式
请教下,播放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  ???????????????????








回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-8-22 10:51:58 | 显示全部楼层
你先能正常播放?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2018-8-22 11:12:20 | 显示全部楼层
emWin现在支持AVI格式,调用比较方便.

其中emf格式视频,参考此贴实现即可
http://www.armbbs.cn/forum.ph ... 3687&extra=page%3D1
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2018-8-22 12:08:58 | 显示全部楼层

如果不进行快进退操作是没有问题的
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2018-8-22 12:09:22 | 显示全部楼层
本帖最后由 hpdell 于 2018-8-22 12:12 编辑
eric2013 发表于 2018-8-22 11:12
emWin现在支持AVI格式,调用比较方便.

其中emf格式视频波形,参考此贴实现即可

我没有使用 gui 提供 播放 avi 的函数
你们提供的历程里面是使用 emf 格式的,快进退我也看了一下,但是最终都是调用 gui 提供的库函数实现的,所以最终也还是没有看明白啊
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-8-22 15:20:47 | 显示全部楼层
你的快进快推是随机的还是?  类似于电脑上进度条随机点,还是只是加快速度播放?
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2018-8-22 17:23:59 | 显示全部楼层
在水一方 发表于 2018-8-22 15:20
你的快进快推是随机的还是?  类似于电脑上进度条随机点,还是只是加快速度播放?

类似电脑上面的进度条 的类型来实现可进可退功能的

进度条是根据播放 的总时间设置的
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-8-22 21:43:27 | 显示全部楼层
hpdell 发表于 2018-8-22 17:23
类似电脑上面的进度条 的类型来实现可进可退功能的

进度条是根据播放 的总时间设置的

这个不好做,你可以先avi.顺序播放好弄。
进度条不好弄,你可以看下索引indx好像是这个,我也没看明白
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2018-8-23 10:48:07 | 显示全部楼层
在水一方 发表于 2018-8-22 21:43
这个不好做,你可以先avi.顺序播放好弄。
进度条不好弄,你可以看下索引indx好像是这个,我也没看明白

目前如果不进行快进退操作,顺序播放是完全没有问题的,当然,除之前说的 图像有点闪烁外
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-8-23 11:13:38 | 显示全部楼层
hpdell 发表于 2018-8-23 10:48
目前如果不进行快进退操作,顺序播放是完全没有问题的,当然,除之前说的 图像有点闪烁外

普通的快进就是把等待时长超短,你随机点击进度条就有了个索引的问题!索引你可以看看avi  2.0 有个说明
文件大于1g。有个说明
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2018-8-23 11:30:13 | 显示全部楼层
在水一方 发表于 2018-8-23 11:13
普通的快进就是把等待时长超短,你随机点击进度条就有了个索引的问题!索引你可以看看avi  2.0 有个说明
...

如果太麻烦了,暂时先放一边,以后有空再研究研究
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-8-23 12:50:13 | 显示全部楼层
hpdell 发表于 2018-8-23 11:30
如果太麻烦了,暂时先放一边,以后有空再研究研究

比较麻烦的,文件大于1g有个跳转的问题! 所以进度条不好做
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
 楼主| 发表于 2018-8-23 14:34:24 | 显示全部楼层
在水一方 发表于 2018-8-23 12:50
比较麻烦的,文件大于1g有个跳转的问题! 所以进度条不好做

刚刚貌似在哪个地方看到,实现快进退时,进度条设置为 avi 视频的总帧数(也就是不用设置为播放总时间),

然后根据滑动进度条所处的位置再来寻找到滑动条是到了第 xx 帧,这个方法貌似可以,

有空研究一下看看
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-8-23 15:07:31 | 显示全部楼层
hpdell 发表于 2018-8-23 14:34
刚刚貌似在哪个地方看到,实现快进退时,进度条设置为 avi 视频的总帧数(也就是不用设置为播放总时间),
...

你试试 就知道了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 20:45 , Processed in 0.204396 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表