Assertion desc failed at libswscale/swscale_internal.h:674和ffmpeg的各种key+value

简介: Assertion desc failed at libswscale/swscale_internal.h:674和ffmpeg的各种key+value

报错的函数:

sws_getContext()


因为参数出了问题,比如宽高信息不对。



但其实是下面这个函数引起的,它会首先解码以小部分数据,但后得到编码和流的信息,如果如果设置的码流探测内存小,或者时间短,这个函数有可能得不到全部的信息,比如宽高等。

avformat_find_stream_info


这个问题是码流探测时没有获取到足够的信息,如视频的width和height。

可以根据提示增加码流探测时间,或者码流探测缓冲区大小。


av_dict_set(&options, “probesize”, “6048000”, 0);//后面这个是byte,要根据流的比特率设置,码流探测时接收到的流放在这个缓冲区。

//av_dict_set(&options, “max_analyze_duration”, “1000000”, 0);//这种方法在ffmpeg6.0中无法生效

ic->max_analyze_duration = 10 * AV_TIME_BASE;
avformat_find_stream_info(ic, NULL);


如果这两个需要设置很大才能获取到码流信息,比如5s那么需要考虑传输过来的流是否在网络中丢包严重,或者发送端机器性能问题导致流编码和封装有问题,这个探测时间花费多少s,就相当于凭空多了多少s延时。

如果是udp传输,记得加上1316字节设置,不然即使本机传输,也有大量丢包。

ffmpeg -re -i westLife.mp4 -f mpegts udp://127.0.0.1:5000?pkt_size=1316


补:这个缓冲区的内容也可以设置为只参数码流分析不参与解码,这样码流探测时间就不会带来延时:

ic->flags |= AVFMT_FLAG_NOBUFFER;
 re = avformat_find_stream_info(ic, NULL);


目前笔者测试这个没有见到效果,且用了之后延时更大。


ffmpeg在接收流时会维护三个缓冲区,除了上面的探测缓冲区A外,还有接收缓冲区B,也就是av_read_frame读的那个缓冲区,还有一个就是解码缓冲区C,也就是下面这个函数设置的缓冲区:

av_opt_set(decodec_ctx_v->priv_data, "tune", "zerolatency", 0);


以下是设置接收缓冲区B的代码:

av_dict_set(&options, "buffer_size", "3554432", 0);
av_dict_set(&options, "fifo_size", "3554432", 0);//200Mb


这些key+value值都可以用在命令中的,只需要改成:-key value就可以了,如-buffer_size 3554432 -tune zerolatency等。

这个还需要结合系统的socket和udp分配的内存大小,参考:修改udp的缓冲区大小

关于udp推流还有一些key和value,如下:

buffer_size=size

Set the maximum UDP socket buffer size in bytes.

fifo_size=units

Set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes. If not specified defaults to 7*4096.

overrun_nonfatal=1|0

Survive in case of UDP receiving circular buffer overrun. Default value is 0.


Watch a stream over UDP, with a max reordering delay of 0.5 seconds:

ffplay -max_delay 500000 -rtsp_transport udp rtsp://server/video.mp4

收到udp流后还需要排序,max_delay设置最大排序时间


overrun_nonfatal=1|0

Survive in case of UDP receiving circular buffer overrun. Default value is 0.

当缓冲区满了以后是否崩掉,默认崩掉。

在ffmpeg官方文档http://ffmpeg.org/ffmpeg-all.html可以查看


rtbufsize

减少采集缓存

av_dict_set(&p_device_options,“rtbufsize”,str_buf_size,0);

rtbufsize是缓存的大小,摄像头和麦克风的数据采集出来之后会先放到这个buf中然后才能取出来做解码或编码,buf大小根据自己的需求算出来设定。

audio_buffer_size

减少音频采集sampels数量

av_dict_set(&p_device_options, “audio_buffer_size”,“30”, 0);

音频采集如果不设置一般是采集出来1920个samples,如果没记错android采集出来的samples更多应该超过10000个,这么多的samples做编码的时候aac格式需要1024个samples,循环编完之后才能再次去取新的麦克风数据,所以需要减少。


thxchtb3wcn3k_d11fc1ff3db9431d8ad7575e9297ae48.png

相关文章
|
缓存 Ubuntu Java
Tool之Bazel:Bazel的简介、安装、使用方法之详细攻略
Tool之Bazel:Bazel的简介、安装、使用方法之详细攻略
|
设计模式 Java
Java反射(Class、反射实例化、反射与单例、获取类结构)附带相关面试题
1.了解反射,2.Class类的三种实例化方法,3.反射机制与对象实例化,4.反射与单例设计模式,5.通过反射获取类结构的信息
462 0
|
安全 算法 C++
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(三)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
253 0
|
编解码 算法 vr&ar
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(二)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
460 1
|
5月前
|
机器人 API 定位技术
具身智能干货|ROS2理论与实践系列(二):ROS2通信机制核心
机器人是一种高度复杂的系统性实现,一个完整的机器人应用程序可能由若干功能模块组成,每个功能模块可能又包含若干功能点,在不同功能模块、不同功能点之间需要频繁的进行数据交互。比如以导航中的路径规划模块为例: 路径规划时就需要其他功能模块输入数据,并输出数据以被其他模块调用。 输入的数据有地图服务提供的地图数据、定位模块提供的机器人位姿数据、人机交互模块提供的目标点数据......。 输出的路径信息则被运动控制订阅或是回显在人机交互界面上。 那么这些相对独立的功能模块或功能点之间是如何实现数据交互的呢?在此,我们就需要介绍一下ROS2中的通信机制了。
417 62
|
9月前
|
PyTorch 算法框架/工具
Jetson学习笔记(四):pth(torch模型文件)转trt(tensorrt引擎文件)实操
关于如何使用torch2trt工具将PyTorch模型转换为TensorRT引擎文件的实操指南。
425 1
Jetson学习笔记(四):pth(torch模型文件)转trt(tensorrt引擎文件)实操
|
C++ 数据格式
LabVIEW传递接收C/C++DLL指针
LabVIEW传递接收C/C++DLL指针
319 1
|
10月前
编译QCefView+VS2019+QT5.15.2
本文介绍了如何编译QCefView项目,并在VS2019和Qt 5.15.2环境下集成,包括编译结果、要点、cmake部署Qt的方法和相关参考链接。
524 2
编译QCefView+VS2019+QT5.15.2