项目码云(Gitee)地址:https://gitee.com/banmajio/RTSPtoRTMP
项目github地址:https://github.com/banmajio/RTSPtoRTMP
个人博客:banmajio’s blog
javacv使用ffmpeg将rtsp转rtmp直播流播放的问题解决与优化系列文章:
FFmpeg转封装rtsp到rtmp(无需转码,低资源消耗)
JavaCV中FFmpegFrameGrabber调用start()方法时出现阻塞的解决办法
JavaCV使用FFmpeg进行rtsp转rtmp直播流画面延时的优化方法
JavaCV1.5.3版本FFmpegFrameGrabber初始化的时候加载时间长的解决方法
av_write_frame() error -22 while writing video packet解决方法
JvaCV开启日志设置日志级别的方法
JvaCV推流过程中遇到内存溢出,JVM异常OOM问题的解决方法
问题分析
org.bytedeco.javacv.FrameRecorder$Exception: avio_open2 error() error -138: Could not open 'null'
[2020-04-29 16:51:14.252] [pool-1-thread-1] [ERROR] [com.junction.play.RtmpPush] : avio_open2 error() error -138: Could not open 'null'
at org.bytedeco.javacv.FFmpegFrameRecorder.startUnsafe(FFmpegFrameRecorder.java:876)
at org.bytedeco.javacv.FFmpegFrameRecorder.start(FFmpegFrameRecorder.java:401)
at org.bytedeco.javacv.FFmpegFrameRecorder.start(FFmpegFrameRecorder.java:396)
at com.junction.play.RtmpPush.push(RtmpPush.java:141)
at com.junction.play.RealPlay.play(RealPlay.java:74)
at com.junction.thread.CameraThread$MyRunnable.run(CameraThread.java:59)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
该错误时在使用JavaCV过程中很常见的一种错误。从报错信息可以看出两个关键的信息:
- 错误发生在FFmpegFrameRecorder的avio_open2()方法,该方法是用于打开FFmpeg的输入输出文件,与推流地址建立连接。而FFmpegFrameRecorder是推流的部分,可以说明拉流端没有问题,问题出现在了推流端。
- Could not open ‘null’ 可以得知要打开的推流地址为null
综上所述一般发生这种错误的原因是因为与推流端建立连接失败。可以通过以下方式排查错误发生的原因:
- 检查windows里的nginx进程有没有开。
- telnet一下rtmp地址的ip端口:
telnet的使用方法自行百度。
解决方法
检查推流端ip端口是否有问题,检查nginx服务是否启动。