javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题

javacpp-ffmpeg系列:java

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

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

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

补充:函数

javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题测试

前言:ui

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

关于avformat_find_stream_info函数的补充:orm

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

1、解决办法

(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秒

2、其余解决办法

一、跳过avformat_find_stream_info函数

若是已知源流媒体源的信息,能够选择跳过这个函数,直接设置给AVFormatContext设置参数;

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

固然也能够尝试读取一帧视频帧或音频帧,能够读取到一些基本信息

相关文章
相关标签/搜索