DVD subtitle stream in SDL(thinkvd开发日志)

  在开发thinkvd dvd subtitle视频时,SDL中显示dvd字幕流,在ffplay.c中运行是正常的,但把它嵌入到QT中,再由SDL来显示就不行,跟踪了很久。

   在字幕与视频合并的地方video_image_display(VideoState *is),把每帧都保存为png图片,发现在非嵌入QT情况下,它的每一帧带字幕的图片显示都正常,在嵌入情况下,只有少部分图片缺少字幕,应该来说也可以显示字幕。但字幕基本上只闪了一下。

在跟踪过程中发现一个现象:当保存图片时,SDL中能看到部分字幕,只是闪烁比较厉害,当时感觉是需要Delay一下,于是在video_image_display     中加了Delay,情况要好一些,但闪烁问题一直还是存在,无论把它延时多少

 

也想把subtitle stream共享到qt中,再在qt中实现视频数据与字幕流合并,但感觉这样实现的逻辑有点复杂,如果没有其它更好的办法只能这样。但个人一直坚信,合并字幕流后的视频里面已经存在字幕数据了,应该能显示才对。

再次对video_image_display进行了分析,它原来的结束是显示SDL_DisplayYUVOverlay(vp->bmp, &rect),而现在把它提前return了,它的调用关系video_refresh_timer->video_display->video_image_display, 调用完成之后,会立即处于后面的逻辑is->pictq_size--;,而这时在QT中正在COPY数据,COPY数据相对来说是比较慢的,在这个生产者与消费者模式下共享内存时,需要加一个同步机制,用于消费者还没有把数据完全COPY出来之前,生产者需要waiting.于是加了两个变量用于同步dts,pts,当dts>pts,让生产者ffplay waiting.
 就这样,qt中用SDL渲染dvd subtile基本正常了。
 

subtitle_thread中加上lock防止dvd subtitle stream被update,但少数subtile还有点闪烁
DVD subtitle stream in SDL(thinkvd开发日志)_第1张图片

你可能感兴趣的:(thread,Stream,image,video,qt,delay)