音视频开发遇到的部分问题(个人向)

一、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等待的)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rain_ZZX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值