Last active
November 25, 2022 03:35
-
-
Save binjoo/5037232 to your computer and use it in GitHub Desktop.
JAVA:通过FFMPEG获得视频的播放时间信息
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package net.binjoo.demo; | |
| import java.io.BufferedReader; | |
| import java.io.InputStreamReader; | |
| import java.util.List; | |
| import org.apache.oro.text.regex.MalformedPatternException; | |
| import org.apache.oro.text.regex.MatchResult; | |
| import org.apache.oro.text.regex.Pattern; | |
| import org.apache.oro.text.regex.PatternCompiler; | |
| import org.apache.oro.text.regex.PatternMatcher; | |
| import org.apache.oro.text.regex.Perl5Compiler; | |
| import org.apache.oro.text.regex.Perl5Matcher; | |
| /** | |
| * jakarta-oro-2.0.8 http://jakarta.apache.org/oro/ | |
| **/ | |
| public class FFMPEG { | |
| public static void main(String[] args) { | |
| String result = processFLV("E:\\mmpp.MP4"); | |
| PatternCompiler compiler = new Perl5Compiler(); | |
| try { | |
| String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s"; | |
| String regexVideo = "Video: (.*?), (.*?), (.*?)[,\\s]"; | |
| String regexAudio = "Audio: (\\w*), (\\d*) Hz"; | |
| Pattern patternDuration = compiler.compile(regexDuration, Perl5Compiler.CASE_INSENSITIVE_MASK); | |
| PatternMatcher matcherDuration = new Perl5Matcher(); | |
| if (matcherDuration.contains(result, patternDuration)) { | |
| MatchResult re = matcherDuration.getMatch(); | |
| System.out.println("视频时间\t===\t" + re.group(1)); | |
| System.out.println("开始时间\t===\t" + re.group(2)); | |
| System.out.println("bitrate 码率 单位 kb\t===\t" + re.group(3)); | |
| } | |
| Pattern patternVideo = compiler.compile(regexVideo, Perl5Compiler.CASE_INSENSITIVE_MASK); | |
| PatternMatcher matcherVideo = new Perl5Matcher(); | |
| if (matcherVideo.contains(result, patternVideo)) { | |
| MatchResult re = matcherVideo.getMatch(); | |
| System.out.println("编码格式\t===\t" + re.group(1)); | |
| System.out.println("视频格式\t===\t" + re.group(2)); | |
| System.out.println("分辨率\t===\t" + re.group(3)); | |
| } | |
| Pattern patternAudio = compiler.compile(regexAudio, Perl5Compiler.CASE_INSENSITIVE_MASK); | |
| PatternMatcher matcherAudio = new Perl5Matcher(); | |
| if (matcherAudio.contains(result, patternAudio)) { | |
| MatchResult re = matcherAudio.getMatch(); | |
| System.out.println("音频编码\t===\t" + re.group(1)); | |
| System.out.println("音频采样频率\t===\t" + re.group(2)); | |
| } | |
| } catch (MalformedPatternException e) { | |
| e.printStackTrace(); | |
| } | |
| } | |
| // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) | |
| private static String processFLV(String inputPath) { | |
| /* | |
| * if (!checkfile(inputPath)){ _log.warn(inputPath+" is not file"); | |
| * return false; } | |
| */ | |
| List<String> commend = new java.util.ArrayList<String>(); | |
| commend.add("e:\\ffmpeg ");// 可以设置环境变量从而省去这行 | |
| commend.add("ffmpeg"); | |
| commend.add("-i"); | |
| commend.add(inputPath); | |
| try { | |
| ProcessBuilder builder = new ProcessBuilder(); | |
| builder.command(commend); | |
| builder.redirectErrorStream(true); | |
| Process p = builder.start(); | |
| // 1. start | |
| BufferedReader buf = null; // 保存ffmpeg的输出结果流 | |
| String line = null; | |
| // read the standard output | |
| buf = new BufferedReader(new InputStreamReader(p.getInputStream())); | |
| StringBuffer sb = new StringBuffer(); | |
| while ((line = buf.readLine()) != null) { | |
| System.out.println(line); | |
| sb.append(line); | |
| continue; | |
| } | |
| int ret = p.waitFor();// 这里线程阻塞,将等待外部转换进程运行成功运行结束后,才往下执行 | |
| // 1. end | |
| return sb.toString(); | |
| } catch (Exception e) { | |
| // System.out.println(e); | |
| return null; | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment