javacv + srs 录制rtmp流报异常 avcodec_send_frame() error -541478725
-
用SRS搭建一个流媒体服务器。然后使用javacv 的
FFmpegFrameGrabber
从SRS上拉流 ,并使用FFmpegFrameRecorder
录制mp4。代码如下:FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(srcUri); grabber.setOption("threads", "1"); // 设置缓存大小,提高画质、减少卡顿花屏 grabber.setOption("buffer_size", "1024000"); // 读写超时,适用于所有协议的通用读写超时 grabber.setOption("rw_timeout", "15000000"); // 探测视频流信息,为空默认5000000微秒 grabber.setOption("probesize","15000000"); // 解析视频流信息,为空默认5000000微秒 grabber.setOption("analyzeduration", "15000000"); // rtmp拉流缓冲区,默认3000毫秒 grabber.setOption("rtmp_buffer", "1000"); String outputVideoUrl = "d:\\out.mp4"; new FFmpegFrameRecorder(outputVideoUrl, grabber.getImageWidth(),grabber.getImageHeight(), grabber.getAudioChannels()); recorder.start(); Frame frame; // 录制10秒视频 int duration = 10 * 1000 * 1000; long start = grabber.getTimestamp() while((frame = grabber.grab()) != null){ if(grabber.getTimestamp() - start > duration) { break; } recorder.record(frame); }
但是当读到图片帧的时候会报下面的错误
org.bytedeco.javacv.FFmpegFrameRecorder$Exception: avcodec_send_frame() error -541478725: Error sending a video frame for encoding.
奇怪的很。用其他流媒体服务器,node-media-server 就不报错
-
最后搞了好久,发现SRS拉过来的流含有类型为Data的帧。
Stream #0:0: Data: none Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp, 163 kb/s Stream #0:2: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2560 kb/s, 60 fps, 60 tbr, 1k tbn
这个需要加个判断,record的时候把非音频和图片的帧都过滤掉。
if(frame.streamIndex != grabber.getVideoStream() && frame.streamIndex != grabber.getAudioStream()) { continue; }
完工,奥力给
-
可以教教我建立网站吗?
-
@1016686656 你要建什么网站。简单的话,wordpress了解下