You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jaffree FFmpeg同时输出MJPEG到UDP端口并录制H264

双路摄像头录制与实时显示问题

现有程序背景

  • 我有一个Java程序,可显示双路摄像头画面,并以FHD 30fps的H264/H265格式录制到文件。
  • 初始使用Sarxos Webcam进行摄像头设置与画面显示,但录制时会切换到Jaffree FFmpeg;录制期间Sarxos必须释放摄像头权限,无法同时继续显示画面。
  • 曾尝试用Xuggler/Sarxos录制,但Sarxos仅能获取原始视频,1920x1080分辨率下仅能提供5fps的视频,无法满足帧率需求。

当前目标与尝试

我希望将Jaffree输出的MJPEG流导向本地端口,以便录制期间通过Sarxos Webcam阅读器读取并显示画面。

通过终端命令可同时实现录制与端口输出:

ffmpeg -f dshow -video_size 1920x1080 -rtbufsize 944640k -framerate 25 -vcodec mjpeg -i video="Logitech Webcam C930e" -pix_fmt yuv420p -c:v libx264 outFHDx25.mp4 -f mpegts udp://localhost:1234?pkt_size=188&buffer_size=65535

另一个终端可通过以下命令查看端口流:

ffplay -i udp://localhost:1234

但端口输出的视频比录制到文件的视频略显模糊,需要优化建议。注意:Jaffree FFmpeg不包含FFPlay。

现有Jaffree单路录制代码

public static FFmpeg createTestFFmpeg() {
    String camera1Ref = "video=" + cam1Vid + ":audio=" + cam1Aud;
    return FFmpeg.atPath()
        .addArguments("-f", "dshow")  // Windows平台选择dshow设备
        .addArguments("-video_size", resString)  // 视频分辨率,例如1920x1080          
        .addArguments("-rtbufsize", rtBufResultString) 
        .addArguments("-thread_queue_size", threadQ)
        .addArguments("-framerate", fpsString)   // 捕获帧率,例如30fps         
        .addArguments(codec, vidString)  // 设置摄像头的捕获编码模式
        .addArgument(audio) // 音频开关(on/off)
        .addArguments("-i", camera1Ref)   // 要捕获的摄像头设备名
        .addArguments("-pix_fmt", pixFmt)
        .addArguments("-c:v", enc2)  // 视频编码器,例如"libx264"或"h264_nvenc"
        .addArguments(enc3, enc4)  // 例如enc3="-crf", enc4="20"
        .addArguments(enc5, enc6)  // 例如enc5="-gpu:v", enc6="0"
        .addArguments(enc7, enc8)  // 例如enc7="-cq:v", enc8="20"
        .addArguments(enc9, enc10)  // 例如enc9="-rc:v", enc10="vbr"
        .addArguments(enc11, enc12)  // 例如enc11="-tune:v", enc12="ll"
        .addArguments(enc13, enc14)  // 例如enc13="-preset:v", enc14="p1" 
        .addArguments(enc15,enc16)  // 例如enc15="-b:v", enc16="0"
        .addArguments(enc17, enc18)  // 例如enc17="-maxrate:v", enc18="5000k"
        .addArguments(enc19, enc20)  // 例如enc19="-bufsize:v", enc20="5000k"
        .addArguments(enc21, enc22)  // 例如enc21="-profile:v", enc22="main"
        .addArgument(noFFStats) // "-nostats",停止输出进度统计
        .addArguments("-loglevel", ffLogLevel)  // 错误日志级别
        .addArgument(bannerResultString)  // "-hide_banner",隐藏启动横幅
        .addArguments("-rtbufsize", rtBufResultString) 
        .setOverwriteOutput(true)   // 覆盖已存在的输出文件
        .addOutput(
            UrlOutput
                .toUrl(filePathL))                    
        .setProgressListener(new ProgressListener(){
            @Override
            public void onProgress(FFmpegProgress progress){
               if(ffProgress){ 
                    System.out.println(progress);
               } 
            }
        });
}

核心疑问

  1. 如何在上述代码中添加逻辑,实现同时将H264写入文件、并通过UDP输出MJPEG到本地端口?具体语法和添加位置是什么?我尝试过多种组合但仅能实现二选一。
  2. 如何优化UDP输出视频的模糊问题?

内容的提问来源于stack exchange,提问作者roba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:41:03