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 就不报错

@ycyq LNMP

@1016686656 你要建什么网站。简单的话,wordpress了解下

可以教教我建立网站吗?

最后搞了好久,发现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;
}

完工,奥力给