嗨 我想要獲取視頻持續時間並將視頻插入到數據庫中。 但現在我正在使用ffmpeg提取視頻持續時間。 我正在爲此工作過去1周。 我能夠在linux中完成這項工作。 但在Windows中,它只是無法打印持續時間。 這是代碼。在perl中使用ffmpeg打印視頻持續時間信息
use strict;
use warnings;
use IPC::Open3;
my @list = glob('*.mp3 *.mp4 *.mpg *.aac *.midi *m3u *.mpa *.dat *.avi');
foreach my $song (@list){
print "$song \n";
my $filename = $song;
my %videoInfo = videoInfo($filename);
print "duration: " . $videoInfo{'duration'}. "\n";
print "durationsecs: " . $videoInfo{'durationsecs'}. "\n\n";
}
sub videoInfo {
# ffmpeg command
my $ffmpeg = 'C:\ffmpeg.exe';
my %finfo = (
'duration' => "00:00:00.00",
'durationsecs' => "0"
);
my $file = shift;
# escaping characters
$file =~ s/(\W)/$1/g;
open3("nul", "nul", \*ERPH, "$ffmpeg -i $file") or die "can't run $ffmpeg\n";
my @res = <ERPH>;
foreach (@res) {
#duration
if (m!Duration: ([0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9])!) {
$finfo{'duration'} = $1;
}
}
my $tenths = substr($finfo{'duration'}, 9, 2);
my $seconds = substr($finfo{'duration'}, 6, 2);
my $minutes = substr($finfo{'duration'}, 3, 2);
my $hours = substr($finfo{'duration'}, 0, 2);
$finfo{'durationsecs'} = ($tenths * .01) + $seconds + ($minutes * 60) + ($hours * 360);
return %finfo;
}
我在C:\中安裝了ffmpeg,並給出了路徑。
ffmpeg工作正常,並顯示比特率,編解碼器等等等等(在這裏我已經刪除它,因爲我只需要持續時間)但它的絕對不打印任何持續時間,它只是打印00:00:00.00。
我懷疑它在數組中的搜索問題。
請幫助我通過這個獲得..
這裏是輸出中,當我從命令提示符
C:\>ffmpeg.exe -i cisco1.flv
FFmpeg version Sherpya-r10707, Copyright (c) 2000-2007 Fabrice Bellard, et al.
libavutil version: 49.5.0
libavcodec version: 51.45.0
libavformat version: 51.14.0
built on Oct 11 2007 06:25:25, gcc: 4.2.1 [Sherpya]
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cisco1.flv':
Duration: 00:08:37.0, start: 0.000000, bitrate: 421 kb/s
Stream #0.0(und): Audio: mpeg4aac, 44100 Hz, stereo
Stream #0.1(und): Video: h264, yuv420p, 960x720, 29.97 fps(r)
Must supply at least one output file
在這裏你可以看到的時間是運行良好的ffmpeg。
如果我在上面的代碼添加
print;
聲明如下行
foreach (@res) {
它會顯示相同的ffmpeg的輸出
請在命令行中正常運行時發佈'$ ffmpeg'命令的輸出示例。 – Mat 2011-04-18 10:38:02
當我執行上面的腳本,它只是打印我這個cisco2.mp4 持續時間:00:00:00.00 durationsecs:0這是它會自動檢測當前文件夾中的視頻並打印其持續時間。但它的印刷00:00:00.00持續時間對我來說並不重要,如果你添加印刷品;在foreach(@res){@res} {fore} {@res} {@@@}之後,您可以看到ffmpeg的實際輸出,它完美地顯示了持續時間。但我無法搜索並打印它。 – mac 2011-04-18 10:42:41
這不是我問的問題。運行腳本運行的相同命令,但不在腳本內。直接在命令行上運行它,以便我們可以看到輸出是什麼,並嘗試瞭解爲什麼您的正則表達式不匹配它還有另一個問題。 – Mat 2011-04-18 10:44:00