enhancementhelp wanted
仓库指标
- Star
- (6,985 star)
- PR 合并指标
- (30 天内没有已合并 PR)
描述
public void toSrsPush(String cameraId) {
String rtmpUrl = "rtmp://localhost/live/livestream";
System.out.println("Starting streaming for " + cameraId);
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(cameraId);
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(rtmpUrl, grabber.getImageWidth(),grabber.getImageHeight(),grabber.getAudioChannels())) {
grabber.setOption("rtsp_transport", "tcp");
grabber.start();
System.out.println(grabber.getFrameRate());
System.out.println(grabber.getImageWidth());
System.out.println(grabber.getImageHeight());
System.out.println(grabber.getAudioChannels());
recorder.setVideoOption("preset", "ultrafast");
recorder.setVideoOption("tune", "zerolatency");
// // 判断源是否为HEVC并需要重新编码
// boolean isHEVC = grabber.getVideoCodec() == avcodec.AV_CODEC_ID_HEVC;
//
// // 如果源是HEVC,将录制器编解码器设置为H.264
// if (isHEVC) {
// recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// System.out.println("正在将HEVC重新编码为H.264");
// }
// 设置默认帧率
double frameRate = 20;
if (grabber.getFrameRate() > 0) {
frameRate = grabber.getFrameRate();
}
// 设置默认视频比特率
int videoBitrate = 4000000; // 默认为 4 Mbps
if (grabber.getVideoBitrate() > 0) {
videoBitrate = grabber.getVideoBitrate();
}
if (grabber.getAudioChannels() > 0) {
recorder.setAudioChannels(grabber.getAudioChannels());
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);// 设置音频编解码器
recorder.setSampleRate(grabber.getSampleRate());// 设置采样率
recorder.setAudioBitrate(grabber.getAudioBitrate()); // 或使用 grabber.getAudioBitrate() 如果它返回有效值
} else {
recorder.setAudioChannels(0); // 设置为0表示没有音频
}
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.setFormat("flv");
recorder.setFrameRate(frameRate);// 设置帧率
// recorder.setSampleRate(grabber.getSampleRate());
// recorder.setAudioBitrate(grabber.getAudioBitrate());
recorder.setVideoBitrate(videoBitrate);
System.out.println("Frame rate: " + frameRate);
System.out.println("Video bitrate: " + videoBitrate);
System.out.println("Audio channels: " + grabber.getAudioChannels());
System.out.println("Sample rate: " + grabber.getSampleRate());
System.out.println("Audio bitrate: " + grabber.getAudioBitrate());
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); // 确保与RTMP兼容
recorder.start(); // 启动录制器
Frame frame;
while ((frame = grabber.grab()) != null) {
System.out.println("Frame grabbed: " + frame);
recorder.record(frame); // 将捕获的帧录制到RTMP流中
}
recorder.stop(); // 停止录制
grabber.stop();
System.out.println("对 " + cameraId + " 的流媒体传输已完成");
} catch (FrameGrabber.Exception | FrameRecorder.Exception e) {
System.err.println("流媒体传输过程中出现错误: " + e.getMessage());
e.printStackTrace();
}
// this.executeFFmpegCommand(cameraId, rtmpUrl);
}
同样的代码1.5.9版本可以推送到srs服务器,而1.5.10不行,请问为什么??
The same code version 1.5.9 can be pushed to srs server, but 1.5.10 can not, please ask why?