javacpp-ffmpeg系列:

 javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片

 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据

 javacpp-FFmpeg系列之3: 图像数据转换(BGR与BufferdImage互转,RGB与BufferdImage互转)

 

前言:

在对实时媒体流进行拉流的时候,会遇到长时间无画面,甚至有时候达到一分钟,实在不能忍。于是开始定位问题所在,一开始怀疑是网络问题,经过其他方式拉流(vlc)测试发现不是网络的问题;那么只能是代码的问题了,定位代码时发现代码一直阻塞在avformat_find_stream_info这里。

关于avformat_find_stream_info函数的补充:

avformat_find_stream_info这个函数的作用不仅会检索视频的一些信息(宽、高、帧率等),而且会持续的读取和解码一些视频帧和音频帧,读取到的帧会放到缓存中。

一、解决办法

(1)rtsp解决办法

rtsp可以通过设置rtsp_transport为tcp的方式来降低检索时长,相对于默认的udp的很多限制,tcp会更可靠

(2)rtsp/rtmp通用解决办法

设置probesize,这个值可以限制最大的读取缓存,比如500*1024就是500k,500k可以保证高清视频也可以读取到一帧视频帧,如果太小就会导致读取不到完整视频帧的问题,所以这个大小需要通过实际情况进行控制。

设置max_analyze_duration,比如设置为5 * AV_TIME_BASE,这个值可以设置avformat_find_stream_info这个函数的持续时长,超过这个时间不结束也会结束,我们设置为5秒

二、其他解决办法

1、跳过avformat_find_stream_info函数

如果已知源流媒体源的信息,可以选择跳过这个函数,直接设置给AVFormatContext设置参数;

2、尝试手动读取视频帧和音频帧进行解析

当然也可以尝试读取一帧视频帧或音频帧,可以读取到一些基本信息