Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to push to srs server #2232

Open
whr2349 opened this issue May 16, 2024 · 1 comment
Open

Unable to push to srs server #2232

whr2349 opened this issue May 16, 2024 · 1 comment

Comments

@whr2349
Copy link

whr2349 commented May 16, 2024

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?

@saudet
Copy link
Member

saudet commented May 16, 2024

The hack that used to work for this doesn't work anymore since FFmpeg 6.1. It needs to be upgraded it here:
https://github.com/bytedeco/javacpp-presets/blob/master/ffmpeg/cppbuild.sh#L122
/cc @nanguantong

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants