从视频文件中提取出特定音轨

最近从皇后OpenMV下了若干KTV歌库。

KTV文件包含两个音轨,一个是正常音轨,和MV一样,另一个音轨只有伴奏。

想把其中的伴奏提出来,成功从鸟之家找到方法。

需要用到mplayer,mencoder及解码器。

测试环境:Ubuntu 12.10,

第一步:

先用”mplayer filename”命令确定需要提取的音轨。filename为指向文件的路径。

Playing /home/nerd/音乐/国语-梁静茹-可惜不是你.mpg.
Detected file format: MPEG-PS format (libavformat)
[mpeg @ 0xb5eca5e0]max_analyze_duration reached
[lavf] stream 0: video (mpeg2video), -vid 0
[lavf] stream 1: audio (mp2), -aid 0
[lavf] stream 2: audio (mp2), -aid 1
VIDEO: [MPG2] 720×480 0bpp 29.970 fps 9200.0 kbps (1123.0 kbyte/s)

上面从终端截取的部分提示可以看到,共有两条音轨,aid分别为0和1,通过“mplayer filename -aid 0或1″来确定哪条音轨是伴奏音轨。

执行:

mencoder filename -ovc frameno -oac mp3lame -lameopts cbr:br=320 -aid 1 -o novideo.avi

  • -ovc frameno表示不进行视频转换
  • -oac mp3lame表示转换为mp3,使用的是lame
  • -lameopts cbr:br=320表示输出码率为320kbps
  • -aid 1表示提取的音轨ID为1
  • -o novideo.avi表示输出文件为novideo.avi

生成一个只有音频的avi文件。

第二步:

mplayer -dumpaudio novideo.avi -dumpfile 国语-梁静茹-可惜不是你.mp3

就会生成“国语-梁静茹-可惜不是你.mp3”文件。删除“novideo.avi”文件即可。

 

 

 

可以用脚本来简化步骤。

#!/bin/bash
mencoder $1 -ovc frameno -oac mp3lame -lameopts cbr:br=320 -aid $2 -o novideo.avi
Filename=`basename $1`                                 #去除路径
NAME=`echo “$Filename” | cut -d’.’ -f1`                #去除后缀
mplayer -dumpaudio novideo.avi -dumpfile $NAME.mp3
rm novideo.avi

保存为“2mp3.sh”文件,执行“chmod +x 2mp3.sh”。

执行“./2mp3.sh 文件名 音轨id”即可。

 

以上使用的是OpenMV的KTV歌库,能正常提取。

为了测试从PT80下了部分KTV,播放正常,但是输出的AVI文件不到200KB,无法播放,终端提示:

Too many video packets in the buffer: (4096 in 8264760 bytes).
Maybe you are playing a non-interleaved stream/file or the codec failed?
For AVI files, try to force non-interleaved mode with the -ni option.
MPEG: No audio stream found -> no sound.

增加了-ni选项无效果。原因不明。

 

废话不多说,命令如下:

废话不多说,命令如下:

1      mplayer -ao pcm ./a.mp4 -ao pcm:file=”outfile.wav”
2      lame -h -b 192 outfile.wav a.mp3