本文介紹了將MP3音頻文件和MP4電影相結合的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
使用Java和XGUGER-以下代碼將MP3音頻文件和MP4電影文件組合在一起,并輸出組合的MP4文件。
我希望輸出視頻的持續時間等于輸入視頻文件的持續時間
如果我將循環條件設置為:
while (containerVideo.readNextPacket(packetvideo) >= 0)
它進行了400次迭代–使電影播放了15秒。就是我想要的。
但由于某種原因,音頻在10秒后被切斷-使電影的最后5秒靜音。
看起來視頻IStreamCoder的單次迭代的時長與音頻IStreamCoder的單次迭代的時長不同。
如何才能讓聲音填滿電影的整個15秒?
String inputVideoFilePath = "in.mp4";
String inputAudioFilePath = "in.mp3";
String outputVideoFilePath = "out.mp4";
IMediaWriter mWriter = ToolFactory.makeWriter(outputVideoFilePath);
IContainer containerVideo = IContainer.make();
IContainer containerAudio = IContainer.make();
// check files are readable
if (containerVideo.open(inputVideoFilePath, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("Cant find " + inputVideoFilePath);
if (containerAudio.open(inputAudioFilePath, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("Cant find " + inputAudioFilePath);
// read video file and create stream
IStreamCoder coderVideo = containerVideo.getStream(0).getStreamCoder();
if (coderVideo.open(null, null) < 0)
throw new RuntimeException("Cant open video coder");
IPacket packetvideo = IPacket.make();
int width = coderVideo.getWidth();
int height = coderVideo.getHeight();
// read audio file and create stream
IStreamCoder coderAudio = containerAudio.getStream(0).getStreamCoder();
if (coderAudio.open(null, null) < 0)
throw new RuntimeException("Cant open audio coder");
IPacket packetaudio = IPacket.make();
mWriter.addAudioStream(1, 0, coderAudio.getChannels(), coderAudio.getSampleRate());
mWriter.addVideoStream(0, 0, width, height);
while (containerVideo.readNextPacket(packetvideo) >= 0) {
containerAudio.readNextPacket(packetaudio);
// video packet
IVideoPicture picture = IVideoPicture.make(coderVideo.getPixelType(), width, height);
coderVideo.decodeVideo(picture, packetvideo, 0);
if (picture.isComplete())
mWriter.encodeVideo(0, picture);
// audio packet
IAudioSamples samples = IAudioSamples.make(512, coderAudio.getChannels(), IAudioSamples.Format.FMT_S32);
coderAudio.decodeAudio(samples, packetaudio, 0);
if (samples.isComplete())
mWriter.encodeAudio(1, samples);
}
coderAudio.close();
coderVideo.close();
containerAudio.close();
containerVideo.close();
mWriter.close();
推薦答案
代碼不錯。謝謝。要捕獲剩余的音頻,請在末尾添加一個循環來讀取音頻包,直到沒有更多的音頻包。
while (samples.isComplete() ) {
containerAudio.readNextPacket(packetaudio);
coderAudio.decodeAudio(samples, packetaudio, 0);
writer.encodeAudio(iAudioStream, samples);
Utility.console(String.format("%s %d", Utility.timeStamp(),
samples.getPts() ));
}
這篇關于將MP3音頻文件和MP4電影相結合的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,