問題:項目中需要獲取音視頻文件時長,通過FFmpeg獲取。我們的文件上傳用的fastDFS,或者七牛雲,經常到我們后台的只有個url,無法成功。通過
引入相關的jar包,然后使用。
File mediaFile = new File("http://192.168.31.10:8888/dfs1/M00/00/02/wKgfCl6azIyAE4rXAABcIN-F5V4141.WAV");
MultimediaObject multimediaObject=new MultimediaObject(mediaFile);
MultimediaInfo multimediaInfo = multimediaObject.getInfo();
long playTime = multimediaInfo.getDuration();
System.out.println(playTime);
這樣會報錯找不到文件,Input file not found<D:\devtool\idea\study\newfeatures\http:\192.168.31.10:8888\dfs1\M00\00\02\wKgfCl6azIyAE4rXAABcIN-F5V4141.WAV>;因為new File會創建加上項目地址的文件
看了很多FFmpeg的都是需要本地文件,或者把遠程文件下載下來。這樣很麻煩,需要本地保存,就涉及到刪除,不刪除用公用的同一名字涉及到多線程的情況。
解決:參照別人的文檔然后改進(https://www.cnblogs.com/qq545505061/p/11224871.html)
查看源碼,
MultimediaObject類的getinfo方法
可以看到ffmpeg放入的是文件的inputFile.getAbsolutepath()的絕對路徑。
因此不能找到文件。
之前看到的博客說是反編譯源碼,然后修改代碼放入自己的url。重新打包部署。但是這樣我們打包不方便管理,而且修改了別人的源碼升級不方便。
所以自己把MultimediaObject類copy成FFmpegFileInfo在自己的項目里面。注意包路徑要和MultimediaObject的相同,因為有包內方法和類的調用。有兩個報錯的地方需要注釋下,變量m和token;因為MultimediaObject已經定義了。改寫getinfo方法如下
然后調用
String url = "http://192.168.31.10:8888/dfs1/M00/00/02/wKgfCl6azIyAE4rXAABcIN-F5V4141.WAV";
File mediaFile = new File(url);
FFmpegFileInfo ffmpegFileInfo = new FFmpegFileInfo(mediaFile);
MultimediaInfo multimediaInfo = null;
multimediaInfo = ffmpegFileInfo.getInfo(url);
long playTime = multimediaInfo.getDuration();
System.out.println(playTime);
就可以得到音視頻時長。