如何用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); } } }); }
核心疑问
- 如何在上述代码中添加逻辑,实现同时将H264写入文件、并通过UDP输出MJPEG到本地端口?具体语法和添加位置是什么?我尝试过多种组合但仅能实现二选一。
- 如何优化UDP输出视频的模糊问题?
内容的提问来源于stack exchange,提问作者roba
相关产品推荐
相关产品推荐

