【问题标题】:Editing Artist Name in MP3 file Perl Script ID3V2 tag在 MP3 文件 Perl 脚本 ID3V2 标记中编辑艺术家姓名
【发布时间】:2014-01-04 20:01:11
【问题描述】:

我正在尝试编写一个 Perl 代码来编辑 ID3V2 标签,即开始的艺术家名称我可以寻找和阅读它但是当我尝试编写新的时它只是用新的艺术家名称替换文件的所有内容并损坏我是新手,所以请给我一些指导,因为我不打算使用下面的库是我尝试过的代码。

#!/usr/bin/perl

use Fcntl qw( SEEK_SET );

my($fh, $filename, $byte_position, $byte_value);

$filename = $ARGV[0];

open(IN, "+>", $filename);
#open IN, $filename;

seek(IN,0,SEEK_SET);
read IN, $temp, 128;

print $temp;
print "\n";

seek(IN,14,SEEK_SET);
read IN, $temp, 16;
print "Artist is :" .$temp;
print "\n";


sysseek(IN,14,SEEK_SET);
#want to replace the Artist Name with new one.
syswrite (IN,$newArtist);

print "\n";

close(IN);

【问题讨论】:

  • @toolic cpansearch.perl.org/src/ILYAZ/MP3-Tag-1.13/lib/MP3/Tag/ID3v2.pm 在此源代码中,如果您可以向我强调任何对我有帮助的事情,在我的情况下,这对我来说有点太复杂了。跨度>
  • 虽然 id3v1 标签在固定偏移处具有固定大小,但 id3v2 标签具有可变大小并且没有固定偏移。此外,字符串可以采用各种字符集,然后有几个 id3v2 的次要版本。如果你真的不想使用现有的库,我希望你能在阅读格式规范和重新实现所有内容时玩得开心。
  • 你为什么要尝试不使用 CPAN 模块?

标签: perl id3v2


【解决方案1】:

您的open 调用会截断文件。您需要使用+< 而不是+> 打开文件以进行读取和写入而不截断它。

更多信息请参见perldoc -f open

【讨论】:

    【解决方案2】:

    如果有人在这里寻找解决方案,这对我有用。

    my $myFile  = shift or die "Usage: <file.mp3> <artist> <title>\n";
    my $newArtist   = shift or die "Usage: <file.mp3> <artist> <title>\n";
    my $newTitle    = shift or die "Usage:<file.mp3> <artist> <title> \n";
    
    #Pack data for artist name and title. creating frame of size 4byte.
    my $artist_len = length($newArtist);
    my $title_len = length($newTitle);
    my $artist = pack('N',$artist_len);
    my $title = pack('N',$title_len);
    
    print"\n New artist name will be >>". $newArtist."\n";
    print"\n New title will be >> ". $newTitle ."\n";
    
    my $encoding = ":raw :bytes";
    open myMP3, "+<$encoding",$myFile or die "Error!Can NOT open the MP3 file.\n";
    open OUT_FILE, "+>$encoding", 'new.mp3' or die "Error!Can NOT open the file to write.\n";
    
    my $length = 512;
    read (myMP3, my $buffer, $length);
    chomp($buffer);
    
    #reading the first 10 bytes of the ID3v2 Header
    my $tagheader = substr($buffer, 0, 10);
    my ($IDtag, $version, $revision, $flags, $size) = unpack('A3 h h h N4',$tagheader);
    print OUT_FILE $tagheader;
    
    my $len = 0;
    my $ptr1 = 0;
    my $ptr2 = 0;
    
    while(1)
    {    
       #reading 10 bytes for each frame and adding 10 bytes for next frame  
        $ptr1 += 10+$len;
        $ptr2 = $ptr1+10;
    
       #reading header 
       #4bytes frame ID,
       #4bytes frame size
       #2bytes flags
        my $frameHeader = substr($buffer,$ptr1,10);
        my($frameID, $frameSize, $flag) = 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);
            my $myFrame = unpack('A*($frameSize)' ,$readFrame);
            if ($frameID eq "TPE1")
            {
                    print OUT_FILE $frameID;
                    print OUT_FILE $artist;
                    print OUT_FILE $flag;
                    print OUT_FILE $newArtist;
             }
    
            elsif ($frameID eq "TIT2") 
            {
                    print OUT_FILE $frameID;
                    print OUT_FILE $title;
                    print OUT_FILE $flag;
                    print OUT_FILE $newTitle;
            }
    
            else 
            {
                print OUT_FILE $frameHeader;
                print OUT_FILE $readFrame;
            }
        }
        else 
        {
             my $leng = length($buffer) - $ptr1;
             my $music = substr($buffer, $ptr1, $leng);
             print OUT_FILE $music;
    
             seek(myMP3 , 10 , 0);
             seek(OUT_FILE, 10 , 0);
             while(<OUT_FILE>)
             {
                print myMP3 $_;
             }
             unlink 'new.mp3';
    
            #close files
            close(myMP3);
            close(OUT_FILE);
    
            die "\n Update success!\n";
    
        }
        $len=$frameSize;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多