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