一、sws_scale 出现 bad src image pointers
往往是转化时视频源帧出现的问题,如果通过普通的拷贝可能拷贝不完整导致出现问题。
解决:
获取帧后 通过 av_frame_move_ref API 将解码的帧全部拷贝到vp中。
二、音频同步的问题
1.视频帧通过av_q2d()流的time_base乘视频帧的pts获得此帧的播放实际时间
2.音频帧通过av_q2d()流的time_base乘音频帧的pts获取音频帧的播放时间(注意:音频帧播放时间并不是实际的,需要av_gettime_realvae() /1000000.0来设置时钟)
三、视频画面大小的设置
每次调用视频刷新,检测UI显示窗口是否发生变换,如果发生变化,重新创建SwsContext,然后将新的宽高传入。
四、视频中止遇到的部分问题
个人在开发过程中遇到线程无法退出,其实是设计的帧队列在没有时会一直阻塞,在结束线程前需要将阻塞的队列唤醒,然后在等待退出。
五、内存泄露的问题
一般是AVPacket中结构体内部的资源未释放,博主采用的是STL的List因此先用av_packet_unref()先将内部资源释放掉在通过STL的pop将结构体完全释放掉。
帧资源如果帧队列也采用List的话同理。
注:如果采用av_packet_free会导致指针称为空指针,与STL的pop产生冲突,因此不能直接释放掉
六、AVPacket队列的优化
· 低延迟应用:队列大小通常在10到50个包之间。
· 常规视频播放:队列大小在50到100个包之间较为合适。
· 高比特率视频或高帧率视频:可能需要100到300个包。
(个人:由于本人项目中在限制包数量时候因为设置了一个cond 导致 在put_packet与get_packet函数中都有唤醒cond的操作有了死锁的出现,导致在结束线程时候会一直等待join()
解决:又添加了一个cond 专门来唤醒包队列达到限制时候的阻塞。
)
七、线程安全问题
博主遇到线程阻塞问题,其主要问题主要在包队列函数存在死锁导致线程阻塞始终回收不了
八、Seek问题
在发送seek请求后,可以通过avformat_seek_file(旧API)来找相关位置,serial作用是判断在刷新视频帧那里是否是同一段的(不一样的话如果不直接丢弃会造成程序阻塞,因为如果视频帧比音频帧快是需要有个delay等待的)