<dependency> <groupId>net.bramp.ffmpeg</groupId> <artifactId>ffmpeg</artifactId> <version>0.6.2</version> </dependency>
import net.bramp.ffmpeg.FFmpeg; import net.bramp.ffmpeg.FFmpegExecutor; import net.bramp.ffmpeg.FFprobe; import net.bramp.ffmpeg.builder.FFmpegBuilder; import net.bramp.ffmpeg.probe.FFmpegProbeResult; import net.bramp.ffmpeg.probe.FFmpegStream; import org.junit.Test; import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; public class TestFFmpegWrapper { @Test public void testVideo() throws IOException { FFmpeg ffmpeg = new FFmpeg("ffmpeg"); FFprobe ffprobe = new FFprobe("ffprobe"); final FFmpegProbeResult probe = ffprobe.probe("e:/hls/Spring_Insight-Milestone_3-Screencast.mp4"); final List<FFmpegStream> streams = probe.getStreams().stream().filter(fFmpegStream -> fFmpegStream.codec_type != null).collect(Collectors.toList()); final Optional<FFmpegStream> audioStream = streams.stream().filter(fFmpegStream -> FFmpegStream.CodecType.AUDIO.equals(fFmpegStream.codec_type)).findFirst(); final Optional<FFmpegStream> videoStream = streams.stream().filter(fFmpegStream -> FFmpegStream.CodecType.VIDEO.equals(fFmpegStream.codec_type)).findFirst(); if (!audioStream.isPresent()) { System.err.println("未发现音频流"); } if (!videoStream.isPresent()) { System.err.println("未发现视频流"); } FFmpegBuilder builder = new FFmpegBuilder() .setInput("e:/hls/Spring_Insight-Milestone_3-Screencast.mp4") // Filename, or a FFmpegProbeResult .overrideOutputFiles(true) // Override the output if it exists .addOutput("e:/hls/output.mp4") // Filename for the destination .setFormat("mp4") // Format is inferred from filename, or can be set //.setTargetSize(250_000) // Aim for a 250KB file .setAudioBitRate(audioStream.isPresent() ? audioStream.get().bit_rate : 0) .setVideoBitRate(videoStream.isPresent() ? videoStream.get().bit_rate : 0) .disableSubtitle() // No subtiles .setAudioChannels(1) // Mono audio .setAudioCodec("aac") // using the aac codec .setAudioSampleRate(48_000) // at 48KHz .setAudioBitRate(32768) // at 32 kbit/s .setVideoCodec("libx264") // Video using x264 .setVideoFrameRate(24, 1) // at 24 frames per second .setVideoResolution(640, 480) // at 640x480 resolution .setStrict(FFmpegBuilder.Strict.EXPERIMENTAL) // Allow FFmpeg to use experimental specs .done(); FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe); // Run a one-pass encode executor.createJob(builder).run(); // Or run a two-pass encode (which is better quality at the cost of being slower) executor.createTwoPassJob(builder).run(); } @Test public void testAudio() throws IOException { FFmpeg ffmpeg = new FFmpeg("ffmpeg"); FFprobe ffprobe = new FFprobe("ffprobe"); final FFmpegProbeResult probe = ffprobe.probe("e:/hls/test/output.wav"); final List<FFmpegStream> streams = probe.getStreams().stream().filter(fFmpegStream -> fFmpegStream.codec_type != null).collect(Collectors.toList()); final Optional<FFmpegStream> audioStream = streams.stream().filter(fFmpegStream -> FFmpegStream.CodecType.AUDIO.equals(fFmpegStream.codec_type)).findFirst(); if (!audioStream.isPresent()) { System.err.println("未发现音频流"); } FFmpegBuilder builder = new FFmpegBuilder() .setInput("e:/hls/test/output.wav") .overrideOutputFiles(true) .addOutput("e:/hls/test/output-wav.m3u8") .setFormat("wav") .setAudioBitRate(audioStream.isPresent() ? audioStream.get().bit_rate : 0) .setAudioChannels(1) .setAudioCodec("aac") // using the aac codec .setAudioSampleRate(audioStream.get().sample_rate) .setAudioBitRate(audioStream.get().bit_rate) .setStrict(FFmpegBuilder.Strict.STRICT) .setFormat("hls") .addExtraArgs("-hls_wrap", "0", "-hls_time", "5", "-hls_list_size", "0") .done(); FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe); // Run a one-pass encode executor.createJob(builder).run(); } }
本博客文章绝大多数为原创,少量为转载,代码经过测试验证,如果有疑问直接留言或者私信我。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
标签:
FFMpeg
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理