【问题标题】:How can i read the ID3v2 tag from the MP3 file in Perl如何从 Perl 中的 MP3 文件中读取 ID3v2 标签
【发布时间】:2023-03-27 09:17:02
【问题描述】:

如何从提供的 MP3 中读取 ID3v2 标签并在 Perl 中打印所有信息?示例代码将不胜感激

【问题讨论】:

    标签: perl mp3 id3v2


    【解决方案1】:

    看来你有很多不同的选择:

    所有这些模块都在其文档中提供了一个示例,因此您可以轻松上手。

    因此,从所有这些中,我尝试在 Audio::TagLib 上尝试一下,但是个人我花了半个小时尝试安装库和模块,所以我退出并然后检查了 MP3::Tag,它立即发挥了作用。

    下面是一个我测试成功的小例子:

    use strict;
    use warnings;
    use MP3::Tag;
    use Data::Dumper;
    
    my $mp3 = MP3::Tag->new("anthony_rother-phobos.mp3");
    $mp3->get_tags();
    my $id3v2 = $mp3->{ID3v2} if exists $mp3->{ID3v2};
    print Dumper($id3v2); #returns an MP3::Tag::ID3v2=HASH object
    

    【讨论】:

    • 当然。例如MP3::Tag 对外部库没有任何依赖关系。它是纯粹的 Perl。所以如果你好奇,可以查看它的source code,看看它是怎么做的。您也可以阅读官方ID3v2 specification 来帮助您入门。
    【解决方案2】:

    对我有用的一些事情可能不是最好的解决方案。

    my $myFile = shift or die "Usage: perl task3 <file.mp3>\n";
    open myMP3File, "<$myFile" or die "Error! cant open file \n";#open mode read
    binmode(myMP3File); #read in binary mode.
    #read file and place it in buffer string
    my $length = 512;
    read (myMP3File, my $buffer, $length);
    print "Displaying ID3v2 Header for " .$myFile.": \n";
    my $tagHeader = substr($buffer, 0, 10);#first 10 bytes.
    my ($IDtag, $version, $revision, $flag, $size) = unpack('A3 h h h N4',$tagHeader);
    print "TagID    : $IDtag\n";
    print "Version  : $version\n";
    print "Revision : $revision\n";
    print "Flags    : $flag\n";
    print "Size     : $size\n";
    
    my $len = 0;
    my $ptr1 = 0;
    my $ptr2 = 0;
    
    #Reading frames after header
    while (1)
    {
        #reading 10 bytes for each frame and adding 10 bytes for next frame 
        $ptr1 += 10+$len;
        $ptr2 = $ptr1+10;
    
        #reading frame header contains 4bytes frame ID,4 bytes frame size, 2 bytes flags
        my $frameHeader = substr($buffer,$ptr1,10);
        # A null/space padding string, N 16/32 bit value(big-ending) , h hexadecimal string
        my($frameID, $frameSize, $flags) = unpack('A4 N4 h2',$frameHeader);
    
        #TALB:album-name,TCON:content-type,TIT2:title,TPE1:Artist, TRCK:Track Number,TYER: year
        if (($frameID eq 'TALB') || ($frameID eq 'TCON') || ($frameID eq 'TIT2') || ($frameID eq  'TPE1') || ($frameID eq 'TRCK') || ($frameID eq  'TYER'))
        {
        my $readFrame = substr($buffer, $ptr2, $frameSize);#reading frame content
        my $myFrame = unpack('A*($frameSize)', $readFrame);
        print "$frameID : $myFrame \n";#frame info
        $len=$frameSize;#save pointer location.
        } 
        else
        { die "Ends Here \n"; }
    }
    
    close(myMP3File);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-30
      • 2020-11-08
      • 1970-01-01
      • 2021-11-19
      • 2010-12-11
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多