0

こんにちは私はビデオの長さを取得し、ビデオと一緒にデータベースに挿入しようとしています。しかし今、私はffmpegを使用してビデオの長さを抽出する作業をしています。私は過去1週間これに取り組んでいます。私はこれをLinuxで動作させることができます。しかし、ウィンドウでは、期間を印刷することはできません。これがコードです。

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は正常に動作しており、ビットレート、コーデックなどを表示しています(ここでは、Durationのみが必要なため、削除しました)しかし、jusは期間を印刷せず、00:00:00.00を印刷します。

配列内の検索の問題が疑われます。

これを乗り越えるのを手伝ってください。

コマンドプロンプトからffmpegを実行したときの出力は次のとおりです

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

ここでは、期間が問題ないことがわかります。

追加した場合

print;

上記のコードの次の行のステートメント

foreach (@res) {

同じffmpeg出力が表示されます

4

1 に答える 1

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

の後に1桁しかないことに注意してください.

試す:

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

(の後に1桁または2桁ある場合は一致します(正規表現で.はエスケープする必要があります。そうでない場合は、任意の1文字と一致します)。.

$ 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
于 2011-04-18T11:04:06.320 に答える