这种安卓游戏sdl erro是什么意思,有没有苹果大佬比安卓多解释一下

上一篇描述了音频解码与播放現在讲解下视频解码与播放。

接口把解码后的数据取回来解码后的数据格式AVFrame是解码后的原始数据。解码时由于IPB帧的关系所以可能会连續发送几帧数据(多次调用avcodec_send_packet后)才能成功解出一帧数据。解码后的数据放到FrameQueue中FrameQueue是一个循环队列其实就是个固定大小的数组,FrameQueue里有个rindex/windex成员來控制读写另一部分有另外一个线程会从FrameQueue把解码后的数据经过图片格式转换、音视频同步控制处理把图片数据渲染到SDL上显示。FrameQueue 通过keep_last成员來决定是否保存上一帧的图像用于同步显示使用。

 // 获取解码后的一帧数据
 //是否丢弃丢弃失去同步的视频帧 
 //如果PacketQueue队列没有数据通知读数據线程。否则读一帧数据
 
//FrameQueue队列是否可以写入,也就是队列是否满
 
视频解码函数如上其中有些地方需要注意的就是"FLUSH"数据的处理。初始化時和每一个seek都会往 PacketQueue队列加入"FLUSH"数据包并且把队列里面的serial成员++,表示下一帧数据不在同一序列中而在解码时遇到"FLUSH"数据包时需要给解码器发“冲洗命令”avcodec_flush_buffers,原因是解码器中可能已经存入待解码的数据(IPB帧解码顺序的缘故)所以需要把之前的数据清掉来处理接下来的解码动作。
另一部分的格式转换与视频渲染部分ffplay.c中渲染线程调用顺序如下:
 
refresh_loop_wait_event函数中,会根据返回的时间判断是否需要延迟播放时间也就是视频哃步。
 
函数是从FrameQueue队列中取出解码后的数据计算当前帧与上一帧的PTS,计算是否需要同步视频同步原理大致是这么一个过程:首先视频同步有三种方式(1)视频同步到音频,(2)音频同步到视频(3)音视频同步到外部时钟。目前使用的是第一种视频同步到音频就是以音頻的时钟为主,上一篇我们已经记录了音频播放时的时钟以它为基准来判断视频的时钟是超前还是落后,以此来达到同步同步过程是┅个你追我赶的过程,每隔一段时间会校准下防止两者同步误差越来越大
1、当前帧与上一帧播放间隔时间:理想的间隔时间(lastvp.pts-vp.pts)这个间隔时间是理想值,也就是根据PTS来计算的按道理每帧时间间隔是一致的。
并且delay>AV_SYNC_FRAMEDUP_THRESHOLD 表示视频时钟超前同步时钟且超出了同步区域这种情况是說视频播放过快已经超出了预定的太不值范围,那么需要视频播放需要延迟等待同步时钟及时sleep(delay + diff);第三:diff >= sync_threshold 视频时钟超前同步时钟 那么视频播放要放慢脚步,delay扩大至2倍
2、frame_timer 表示一个序列的开始时间。每个序列都是从0开始也就是音视频从时间轴上的某个点为基准。delay是经过同步後的到的时间使用frame_timer+delay 表示同一个序列中视频播放流逝的时间总和。
 
 //当前帧与上一帧播放间隔时间:理想的间隔时间(lastvp.pts-vp.pts)
 //如果frame_timer + delay 下一帧的播放時间未到则显示上一帧并返回延迟时间
 //is->frame_timer 同一个播放序列视频播放的时间总长,上一帧开始播放到的时间
 //delay:上一帧播放到结束的延迟时間
 
 //默认是以音频时钟为主
 // 视频时钟超前于同步时钟,且超过同步域值但上一帧播放时长超长
 
解码同步之后,接着是进行播放显示本文使用SDL2.0进行视频渲染,注意格式转换就行了ffplay.c里参考就行了。本文使用SDL_UpdateYUVTexture 将视频数据转成YUV格式进行播放

 
 

这页怎么配(求苹果大佬比安卓哆解答sdl,hdd啥的也解释一下,一步一步来)这是我的镜像(andows.img形式),谢谢!


我要回帖

更多关于 苹果大佬比安卓多 的文章

 

随机推荐