java使用ffmpeg压缩的视频不能播放 // 构建FFmpeg命令 String[] command = {ffmpegpath, "-i", inputFile.getAbsolutePath(), "-c:v", "libx264", "-crf", "23", "-preset", "medium", "-c:a", "aac", "-b:a", "128k", outputPath}; // 执行FFmpeg命令 ProcessBuilder processBuilder = new ProcessBuilder(command); Process process = processBuilder.start(); // 等待命令执行完成 int exitCode = process.waitFor();,并且一直卡着
时间: 2024-01-12 13:03:53 浏览: 127
基于java实现对长短视频进行片段的裁剪选择+MediaMetadataRetriever获取视频帧+ffmpeg视频裁剪压缩
在使用FFmpeg进行视频压缩时,有时可能会遇到命令执行卡住的情况。这可能是由于FFmpeg命令执行时需要等待输入流或输出流的原因导致的。
为了解决这个问题,你可以在创建ProcessBuilder对象时,添加对输入流和输出流的处理。这样可以避免命令执行过程中阻塞。
以下是一个修改后的示例代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class VideoCompression {
public static void main(String[] args) {
String ffmpegpath = "path/to/ffmpeg";
String inputFile = "path/to/input.mp4";
String outputPath = "path/to/output.mp4";
try {
// 构建FFmpeg命令
String[] command = {ffmpegpath, "-i", inputFile, "-c:v", "libx264", "-crf", "23", "-preset", "medium", "-c:a", "aac", "-b:a", "128k", outputPath};
// 执行FFmpeg命令
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
// 处理输入流和错误流,以避免命令执行阻塞
InputStream inputStream = process.getInputStream();
InputStream errorStream = process.getErrorStream();
// 开启线程读取输入流
Thread inputThread = new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
});
inputThread.start();
// 开启线程读取错误流
Thread errorThread = new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
});
errorThread.start();
// 等待命令执行完成
int exitCode = process.waitFor();
System.out.println("Exit code: " + exitCode);
// 等待线程结束
inputThread.join();
errorThread.join();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
```
在上述代码中,我们创建了两个线程来处理输入流和错误流。这样,当FFmpeg命令执行时,我们可以实时读取命令的输出结果,避免命令执行过程中卡住。
请注意,根据你的FFmpeg路径和输入/输出文件路径,需要相应地修改示例代码中的路径。另外,你可能需要根据实际需求调整FFmpeg命令的参数。
希望这可以解决你遇到的问题。如果问题仍然存在,请提供更多的信息,我将尽力帮助你解决。
阅读全文