bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.45k stars 1.57k forks source link

按顺序推流多个文件 #2021

Open sunflower-zzn opened 1 year ago

sunflower-zzn commented 1 year ago

如何按顺序推流多个webm文件?

sunflower-zzn commented 1 year ago
public void liveStreamingVideos(List<String> urls, String rtmpAddress) {
        try {
            avutil.av_log_set_level(avutil.AV_LOG_INFO);
            FFmpegLogCallback.set();
            int count = 0;
            for (String url : urls) {
                FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(url);
                grabber.setOption("analyzeduration", "10000");
                grabber.setFormat("webm");
                grabber.start();
                int frameWidth = grabber.getImageWidth();
                int frameHeight = grabber.getImageHeight();
                // 实例化FFmpegFrameRecorder,将SRS的推送地址传入
                FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(rtmpAddress, 800, 450, 1);
                recorder.setFrameRate(25);  // 设置帧率
                recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);   // 视频编码格式
                recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 音频编码格式
                recorder.setFormat("flv");
                recorder.start();
                count++;
                Frame frame = null;

                // 释放探测时缓存下来的数据帧,避免pts初始值不为0导致画面延时
//                grabber.flush();
                Frame pkt = null;
                long startTime = System.currentTimeMillis();
                while ((pkt = grabber.grabAtFrameRate()) != null) {
                    Thread.sleep(4);
                    recorder.setTimestamp(1000 * (System.currentTimeMillis() - startTime));
                    recorder.record(pkt);
                }
                grabber.close();
            }
        } catch (Exception e) {
            BytePointer buffer = new BytePointer(256);
            av_strerror(-32, buffer, buffer.capacity());
            buffer.getString();
            LoggerUtil.error(LOGGER, "推流失败", e);
        }
    }
steeveen commented 1 year ago

try to create several grabber to do that.