在perl中使用ffmpeg打印视频持续时间信息

在perl中使用ffmpeg打印视频持续时间信息,perl,time,ffmpeg,duration,Perl,Time,Ffmpeg,Duration,嗨 我正在尝试获取视频持续时间,并将其插入数据库中。 但现在我正在使用ffmpeg提取视频持续时间。 我在过去的一周里一直在做这个。 我能够在linux中实现这一点。 但在windows中,它无法打印持续时间。 这是代码 use strict; use warnings; use IPC::Open3; my @list = glob('*.mp3 *.mp4 *.mpg *.aac *.midi *m3u *.mpa *.dat *.avi'); foreach my $song (@li

嗨 我正在尝试获取视频持续时间,并将其插入数据库中。 但现在我正在使用ffmpeg提取视频持续时间。 我在过去的一周里一直在做这个。 我能够在linux中实现这一点。 但在windows中,它无法打印持续时间。 这是代码

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;
}
在这里你可以看到持续时间很好

如果我加上

print;
上述代码中的语句位于第行下方

foreach (@res) {
它将显示与您匹配的相同ffmpeg输出:

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
请注意,
后面只有一个数字

尝试:

如果
后面有一个或两个数字,它将匹配(您应该在正则表达式中转义
,否则它将匹配任何单个字符)


当您在命令行上正常运行
$ffmpeg
命令时,请发布该命令输出的示例。当我完全执行上述脚本时,它只会将此cisco2.mp4 duration:00:00.00 durationsecs:0打印出来,即它会自动检测当前文件夹中的视频并打印其持续时间。但是它的打印时间是00:00:00.00如果您添加打印时间,则持续时间秒对我来说并不重要;在foreach(@res)行之后{您可以看到ffmpeg的实际输出,它完美地显示了持续时间。但我无法搜索数组并打印它。这不是我要问的。请运行与脚本运行相同的命令,但不要在脚本中运行。直接在命令行上运行它,以便我们可以看到输出内容,并尝试查看您的regexp不是matc的原因好吧,对不起,这是我运行C:\>ffmpeg.exe-I cisco1.flv ffmpeg版本Sherpya-r10707时的输出,版权(C)2000-2007 Fabrice Bellard等。libavutil版本:49.5.0 libavcodec版本:51.45.0 libavformat版本:51.14.0构建于2007年10月11日06:25,gcc:4.2.1[Sherpya]输入#0,mov,mp4,m4a,3gp,3g2,mj2,来自“cisco1.flv”:持续时间:00:08:37.0,开始时间:0.000000,比特率:421kb/s流#0.0(und):音频:mpeg4aac,44100hz,立体声流#0.1(und):视频:h264,yuv420p,960x720,29.97fps(r)必须提供至少一个输出文件编辑您的问题并添加该文件(使用代码
按钮格式化),注释格式完全搞砸了。抱歉..这给了我同样的结果。让我告诉你,我在linux机器上尝试了我的代码,效果很好。@mac:我只是稍微修改了一下,以允许有一个可能的选项卡或多个空间。使用你提供的输入在这里工作-帮不了你更多。嘿..谢谢..它工作了..我下载了编辑了一份新的副本,并按照您所说的进行了更改,效果很好。非常感谢您。嗨,mat。您能解决这个问题吗
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