我是靠谱客的博主 唠叨龙猫,这篇文章主要介绍java ffmpeg 转码一、使用java ffmpeg相关包转码二、使用ffmpeg工具转码,现在分享给大家,希望可以做个参考。

一、使用java ffmpeg相关包转码

转: Java 视频转码(转为MPEG-4格式)

 1、引入相关依赖

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacpp</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>org.bytedeco.javacpp-presets</groupId> <artifactId>opencv-platform</artifactId> <version>3.4.1-1.4.1</version> </dependency> <dependency> <groupId>org.bytedeco.javacpp-presets</groupId> <artifactId>ffmpeg-platform</artifactId> <version>3.4.2-1.4.1</version> </dependency>

2、视频转码工具类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import org.bytedeco.javacv.Frame; import org.bytedeco.javacpp.avcodec; import org.bytedeco.javacv.FrameGrabber; import org.bytedeco.javacv.FrameRecorder; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.FFmpegFrameRecorder; /** * 视频转码工具类 */ public class VideoConvertUtil { public void convert(String inputFile, String outputFile) throws Exception { FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(inputFile); Frame captured_frame; FFmpegFrameRecorder recorder = null; try { grabber.start(); recorder = new FFmpegFrameRecorder(outputFile, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels()); recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); recorder.setFormat("mp4"); recorder.setFrameRate(grabber.getFrameRate()); recorder.setSampleRate(grabber.getSampleRate()); recorder.setVideoBitrate(grabber.getVideoBitrate()); recorder.setAspectRatio(grabber.getAspectRatio()); recorder.setAudioBitrate(grabber.getAudioBitrate()); recorder.setAudioOptions(grabber.getAudioOptions()); recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); recorder.start(); while (true) { captured_frame = grabber.grabFrame(); if (captured_frame == null) { System.out.println("转码完成"); break; } recorder.record(captured_frame); } } catch (FrameRecorder.Exception e) { e.printStackTrace(); } finally { if (recorder != null) { try { recorder.close(); } catch (Exception e) { System.out.println("recorder.close异常" + e); } } try { grabber.close(); } catch (FrameGrabber.Exception e) { System.out.println("frameGrabber.close异常" + e); } } } }

二、使用ffmpeg工具转码

参考:java+ffmpeg实现mp4转m3u8切片(ts)

前提是要安装FFmpeg,如果不安装需要把ffmpeg执行文件放在包里指定执行文件的路径

在实际开发中,可以通过java调用cmd命令,使用ffmpeg进行切片操作

ffmpeg -i D:/m3u8/demo.mp4 -c:v copy -c:a copy -f ssegment -segment_format mpegts -segment_list D:/m3u8/hls/test.m3u8 -segment_time 10 D:/m3u8/hls/test%05d.ts


ffmpeg -i /a/1.avi -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 10 /a/b/1.m3u8

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
private static boolean process(List<String> command) throws FFmpegException { String sys = System.getProperties().getProperty("os.name").toLowerCase(); if(sys .startsWith("win")) { return processWin(command); } return processLinux(command); } private static boolean processWin(List<String> command) throws FFmpegException { if (null == command || command.size() == 0) { return false; } try { Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start(); new PrintStream(videoProcess.getErrorStream()).start(); new PrintStream(videoProcess.getInputStream()).start(); int exitcode = videoProcess.waitFor(); return exitcode != 1; } catch (Exception e) { } } private static boolean processLinux(List<String> command) throws FFmpegException{ if (null == command || command.size() == 0) { return false; } StringBuffer cmd = new StringBuffer(); for (int i = 0; i < command.size(); i++) { cmd.append(command.get(i) + " "); } try { Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(cmd.toString()); InputStream stderr = proc.getErrorStream(); InputStreamReader isr = new InputStreamReader(stderr); BufferedReader br = new BufferedReader(isr); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line + "n"); } log.info(sb.toString()); } catch (Exception e) { log.error("执行:" + cmd + "出错", e); } return true; }

最后

以上就是唠叨龙猫最近收集整理的关于java ffmpeg 转码一、使用java ffmpeg相关包转码二、使用ffmpeg工具转码的全部内容,更多相关java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部