如何在Android中使用java从mp4中提取音频到mp3?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在Android中使用java从mp4中提取音频到mp3?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4556字,纯文字阅读大概需要7分钟。
内容图文
![如何在Android中使用java从mp4中提取音频到mp3?](/upload/InfoBanner/zyjiaocheng/704/c2ed0eb5d5fc4b19b0480a291e4b6a7c.jpg)
我想在Android平台上将mp4视频转换为mp3音频文件?
我该怎么做?
其实我测试了一些JAR.
首先,使用JAAD lib进行测试.
import java.io.File;
import java.io.RandomAccessFile;
import java.util.List;
import net.sourceforge.jaad.aac.Decoder;
import net.sourceforge.jaad.aac.SampleBuffer;
import net.sourceforge.jaad.mp4.MP4Container;
import net.sourceforge.jaad.mp4.api.AudioTrack;
import net.sourceforge.jaad.mp4.api.Frame;
import net.sourceforge.jaad.mp4.api.Movie;
import net.sourceforge.jaad.mp4.api.Track;
import net.sourceforge.jaad.util.wav.WaveFileWriter;
public class Main2 {
public static void main(String[] args) {
System.out.println("dfd");
try {
decodeMP4("C:/a/input.mp4","./out.wav");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("over");
}
private static void decodeMP4(String in, String out) throws Exception {
WaveFileWriter wav = null;
try {
final MP4Container cont = new MP4Container(new RandomAccessFile(in, "r"));
final Movie movie = cont.getMovie();
final List<Track> tracks = movie.getTracks(AudioTrack.AudioCodec.AAC);
if(tracks.isEmpty()) throw new Exception("movie does not contain any AAC track");
final AudioTrack track = (AudioTrack) tracks.get(0);
wav = new WaveFileWriter(new File(out), track.getSampleRate(), track.getChannelCount(), track.getSampleSize());
final Decoder dec = new Decoder(track.getDecoderSpecificInfo());
Frame frame;
final SampleBuffer buf = new SampleBuffer();
while(track.hasMoreFrames()) {
frame = track.readNextFrame();
dec.decodeFrame(frame.getData(), buf);
wav.write(buf.getData());
}
}
finally {
if(wav!=null) wav.close();
}
}
}
但它会引发错误
"java.lang.ClassCastException: net.sourceforge.jaad.mp4.boxes.impl.PixelAspectRatioBox cannot be cast to net.sourceforge.jaad.mp4.boxes.impl.sampleentries.codec.CodecSpecificBox
at net.sourceforge.jaad.mp4.api.VideoTrack.<init>(VideoTrack.java:62)
at net.sourceforge.jaad.mp4.api.Movie.createTrack(Movie.java:65)
at net.sourceforge.jaad.mp4.api.Movie.<init>(Movie.java:46)
at net.sourceforge.jaad.mp4.MP4Container.getMovie(MP4Container.java:134)
at Main2.decodeMP4(Main2.java:30)
at Main2.main(Main2.java:18)"
解决方法:
这个问题有点过于复杂.我知道如何实现它.
这里是从视频文件中提取音频数据的代码,但它是PCM数据,而不是mp3:
public class AudioFromVideo{
private String audio,video;
private MediaCodec amc;
private MediaExtractor ame;
private MediaFormat amf;
private String amime;
public AudioFromVideo(String srcVideo,String destAudio){
this.audio=destAudio;
this.video=srcVideo;
ame=new MediaExtractor();
init();
}
public void init(){
try {
ame.setDataSource(video);
amf=ame.getTrackFormat(1);
ame.selectTrack(1);
amime=amf.getString(MediaFormat.KEY_MIME);
amc=MediaCodec.createDecoderByType(amime);
amc.configure(amf, null, null, 0);
amc.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void start(){
new AudioService(amc,ame,audio).start();
}
private class AudioService extends Thread{
private MediaCodec amc;
private MediaExtractor ame;
private ByteBuffer[] aInputBuffers,aOutputBuffers;
private String destFile;
@SuppressWarnings("deprecation")
AudioService(MediaCodec amc,MediaExtractor ame,String destFile){
this.amc=amc;
this.ame=ame;
this.destFile=destFile;
aInputBuffers=amc.getInputBuffers();
aOutputBuffers=amc.getOutputBuffers();
}
@SuppressWarnings("deprecation")
public void run(){
try {
OutputStream os=new FileOutputStream(new File(destFile));
long count=0;
while(true){
int inputIndex=amc.dequeueInputBuffer(0);
if(inputIndex==-1){
continue;
}
int sampleSize=ame.readSampleData(aInputBuffers[inputIndex], 0);
if(sampleSize==-1)break;
long presentationTime=ame.getSampleTime();
int flag=ame.getSampleFlags();
ame.advance();
amc.queueInputBuffer(inputIndex, 0, sampleSize, presentationTime, flag);
BufferInfo info=new BufferInfo();
int outputIndex=amc.dequeueOutputBuffer(info, 0);
if (outputIndex >= 0) {
byte[] data=new byte[info.size];
aOutputBuffers[outputIndex].get(data, 0, data.length);
aOutputBuffers[outputIndex].clear();
os.write(data);
count+=data.length;
Log.i("write", ""+count);
amc.releaseOutputBuffer(outputIndex, false);
} else if (outputIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
aOutputBuffers = amc.getOutputBuffers();
} else if (outputIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {}
}
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
例如,要从视频文件video.mp4中提取音频数据,并将提取的日期保存到audio.pcm文件中,请编写如下代码:
String videoPath=PATH+"/video.mp4";
String audioPath=PATH+"/audio.pcm";
new AudioFromVideo(video.audio).start();
如果您需要mp3数据,可以使用lame mp3 lib将PCM数据编码为MP3格式.我有所有代码.但是将它们全部粘贴在这里并不值得.
内容总结
以上是互联网集市为您收集整理的如何在Android中使用java从mp4中提取音频到mp3?全部内容,希望文章能够帮你解决如何在Android中使用java从mp4中提取音频到mp3?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。