[Linux 音视频技术] 我写的mkv转MP4的软件,和copy文件一样快

Jun 2nd, 2009

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2009/06/02/mkv_to_mp4.html

一个小程序,主要是用来解开封装,然后在用mp4来封装,所以问题都在封装上面,没有必要在转一次.

必须安装mkvtoolnix,mp4box,mediainfo.这三个软件.先用mediainfo得到信息后,用mkvtoolnix来解封装.在用mp4box来封装

使用方法

#mkv_to_mp4.pl  视频名.mkv

 

#!/usr/bin/perl -w
use Data::Dumper;
use strict;
next unless $ARGV[0];
my $f_name = $ARGV[0];
my $d_name = $ARGV[0];
$d_name =~ s/mkv/mp4/g;
print "$d_name 存在" if (-e $d_name);
sleep 1;
die if (-e $d_name);
open MEDIAINFO,"/usr/bin/mediainfo  \"$f_name\" 2>&1 |" or print "$!";
my %info = ();
my $name;
    while()
    {
        chomp;
        s/\s+//g;
        next if /^\s*$/;
        if (! /:/){
                $name = $_;
                $info{$name} = {};
        }

        if(/:/)
        {
                #print $name;
                my ($key,$values);
                ($key,$values) = split(/:/,$_);
                $info{$name}->{$key} = $values;
        }

    }

close MEDIAINFO;
print "$f_name,";
my $mkvextract = "mkvextract tracks \"$f_name\" 1:\"$f_name.264\"";
my $mp4box =   " -add \"$f_name.264\" -add \"$f_name.aac\" \"$d_name\"";
foreach(%info){
        my  $hash = $_;
        if($hash eq "Video")
        {
                print "Video\n";
                print "Format,$info{$hash}->{'Framerate'}\n" if ($info{$hash}->{'Framerate'});
                $mp4box = "MP4Box -fps $info{$hash}->{'Framerate'}".$mp4box if ($info{$hash}->{'Framerate'});

        }
  }
foreach(%info){
        my  $hash = $_;
        if($hash =~ /^(Audio.*)/)
        {
                print "ID,$info{$hash}->{'ID'}\n" if ($info{$hash}->{'ID'});
                print "CodecID,$info{$hash}->{'CodecID'}\n" if ($info{$hash}->{'CodecID'} eq "A_AAC");
                print "Language,$info{$hash}->{'Language'}\n" if ($info{$hash}->{'Language'});
                  $mkvextract = $mkvextract." $info{$hash}->{'ID'}:\"$f_name.aac\" " if  ($info{$hash}->{'CodecID'} eq "A_AAC");
        }
}
system($mkvextract);
system($mp4box);
unlink "$f_name.264" if (-e "$f_name.264");
unlink "$f_name.aac" if (-e "$f_name.aac");
Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. 当当网
    Jun 2nd, 2009 at 15:36
    Reply | Quote | #1

    第一次来,居然搞了个沙发!博主,你那个东东免费的吧!

  2. admin
    Jun 2nd, 2009 at 22:34
    Reply | Quote | #2

    那个东东,当然免费……………..哈哈,代码都拿出来了

  3. yoyicue
    Oct 23rd, 2010 at 10:05
    Reply | Quote | #3

    sh: Illegal option -d

  4. yoyicue
    Oct 23rd, 2010 at 10:40
    Reply | Quote | #4

    yoyicue :
    sh: Illegal option -d

    @yoyicue
    原因是安装了 mkvtoolnix 和 mediainfo 但是没有安装 gpac (mp4box)

  5. yoyicue
    Oct 23rd, 2010 at 10:41
    Reply | Quote | #5

    yoyicue :

    yoyicue :
    sh: Illegal option -d

    @yoyicue
    原因是安装了 mkvtoolnix 和 mediainfo 但是没有安装 gpac (mp4box)

    囧 还是报 sh: Illegal option -d

  6. Sam
    Dec 5th, 2010 at 12:27
    Reply | Quote | #6

    我试了你的程序,前面都正常,看得出这个是个不错的程序,转换速度很快,我感觉好于国外的script,但可惜到最后好像是打开aac文件出错,LZ帮助解释一下,多谢了。

    Opening file /media/ST500/哈利波特与阿兹卡的囚犯.mkv.aac failed
    Error importing /media/ST500/哈利波特与阿兹卡的囚犯.mkv.aac: Requested URL is not valid or cannot be found