经过测试发现,cvCreateTrackbar函数中count参数的最大值是32767,如果调用函数时count>32767,那么滚动条将会不能拖动。
如果视频的总帧数大于32767,那么可以考虑使用目前帧数占总帧数的百分比来显示滚动条。
我的处理方式如下,但是会有播放速度过快的问题,正在想办法解决,大家有什么好办法欢迎给我留言:
#include<highgui.h> CvCapture* capture = NULL; int next_frame = 0; int amount = 34225;//经过调试的值,用cvGetCaptureProperty得到的不是真实值 int rate = 0; int position = 0; void on_change(int pos) { next_frame = ((double)pos/32767)*amount; printf("%d,%d\n" , pos , next_frame); cvSetCaptureProperty(capture , CV_CAP_PROP_POS_FRAMES , next_frame); position = pos; } void main() { cvNamedWindow("myVideoPlayer"); capture = cvCreateFileCapture("F:\\Youku Files\\transcode\\第四集.avi"); IplImage* frame = NULL; frame = cvQueryFrame(capture); if(frame == NULL) { return; } cvShowImage("myVideoPlayer",frame); //amount = (int)cvGetCaptureProperty(capture , CV_CAP_PROP_FRAME_COUNT); //printf("%d\n" , amount); rate = (int)cvGetCaptureProperty(capture , CV_CAP_PROP_FPS); printf("%d\n" , rate); if(amount) { //cvCreateTrackbar("Position" , "myVideoPlayer" , &position , amount , NULL);//amount超过了count参数的最大值32767,所以不能拖动 cvCreateTrackbar("Position" , "myVideoPlayer" , &position , 32767 , on_change); } while(true) { frame = cvQueryFrame(capture); if(frame == NULL) { break; } cvShowImage("myVideoPlayer",frame); //++position; ++position; //我觉得position应该增加32767/34225,但cvSetTrackbarPos的position必须是整型,所以最少只能增加1了 cvSetTrackbarPos("Position" , "myVideoPlayer" , position);//添加了这条语句会使视频播放速度看上去加快了,因为cvSetTrackbarPos会调用on_change函数,由于视频的帧数大于cvCreateTrackbar能设置的最大帧数,所以position增加1,就会导致next_frame增加1.04,即下一帧是当前帧后的第1.04帧 char c = cvWaitKey(1000/rate); if(c == 27) { break; } } cvReleaseCapture(&capture); cvDestroyWindow("myVideoPlayer"); }