【问题标题】:Perl Audio file durationPerl 音频文件持续时间
【发布时间】:2015-07-25 05:12:17
【问题描述】:

我正在编写一个音频播放列表生成器。但是,我希望它不仅在严格的行中输出名称和编号,而且还输出 音频文件的持续时间。如果没有这样的黑客,我有什么办法可以做到:

print "#: $number\tDuration: ";
system("mp3info -p \"%m:%s\" \"$track\"");
print "\tNAME: $name";

如果有什么重要的话,我的 perl 版本是v5.16.3

【问题讨论】:

  • 你看过 MP3::Info 模块了吗? metacpan.org/pod/MP3::Info
  • @TrentonTrama 恐怕它只适用于 mp3,不适用于其他音频格式。更准确地说,我只需要 mp3 和 flac。
  • 如果您只需要这两种格式,您可以使用 MP3::Info 和 Audio::FLAC::Decoder 或 Audio::FLAC::Header 的组合。解码器有一个time_total 函数,它返回总秒数。标头返回一个包含文件时间段的哈希。

标签: perl audio metadata


【解决方案1】:

理想情况下,您希望根据文件内容而不是扩展名来确定文件类型,File::Type 可以为此派上用场。 MP3::Info 和 Audio::Flac::Header 是写得很好的 perl 模块。

use File::Type;
use MP3::Info;
use Audio::FLAC::Header;

my $duration = -1;
my $ft = File::Type->new()->checktype_filename($track);

$duration = Audio::FLAC::Header
              ->new($track)
              ->tags()
              ->{trackTotalLengthSeconds} 
              if($ft eq 'audio/flac');

$duration = MP3::Info
              ->get_mp3info($track)
              ->{SECS} 
              if($ft eq 'audio/mpeg3');

【讨论】:

  • 是否可以使用一些通用的方法,而不是用不同的方法包含不同的模块?
  • 您可以使用 libavcodec 之类的库 - ffmpeg 背后的引擎。这知道不同的文件类型,但核心引擎在 c 中。 Video::FFmpeg 可以为所欲为。
  • 我会在克服安装 FFmpeg 模块的错误后立即回答。
  • 就我而言,我使用了这个答案:stackoverflow.com/questions/6239350/…my $duration = `ffmpeg -i \"$track\" 2>&1 | grep Duration | awk '{print \$2;}' | tr -d ,`;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2010-11-17
  • 2020-06-02
相关资源
最近更新 更多