2011-04-18 48 views
0

嗨 我想要獲取視頻持續時間並將視頻插入到數據庫中。 但現在我正在使用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的輸出

+0

請在命令行中正常運行時發佈'$ ffmpeg'命令的輸出示例。 – Mat 2011-04-18 10:38:02

+0

當我執行上面的腳本,它只是打印我這個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

+0

這不是我問的問題。運行腳本運行的相同命令,但不在腳本內。直接在命令行上運行它,以便我們可以看到輸出是什麼,並嘗試瞭解爲什麼您的正則表達式不匹配它還有另一個問題。 – Mat 2011-04-18 10:44:00

回答

2

您相匹配:

if (m!Duration: ([0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9])!) { 

但是輸出是:

Duration: 00:08:37.0, start: 0.000000, bitrate: 421 kb/s 

請注意,在.之後只有一位數字。

嘗試:

if (m!Duration:\s+([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9][0-9]?)!) { 

它將匹配,如果有一個或兩個數字的.後(你應該逃避在正則表達式.,否則它匹配任何單個字符)。

$ cat input 
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 
$ cat input | perl -ne 'if (m!Duration:\s+([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9][0-9]?)!) { print $1, "\n"; }' 
00:08:37.0 
+0

對不起。這給了我相同的結果。讓我給你打電話,我在linux機器上試過我的代碼,它工作正常。 – mac 2011-04-18 11:10:27

+1

@mac:我改變它只是爲了允許一個可能的選項卡或多個空間。在這裏與您提供的輸入一起工作 - 不能幫助您更多。 – Mat 2011-04-18 11:22:07

+0

嘿..謝謝..它的工作..我下載了一個新的副本,並作出改變,因爲你說,它的工作..謝謝你soooo多.. – mac 2011-04-18 11:22:12