簡體   English   中英

如何使用Java xuggler合並視頻中的兩種不同音頻

[英]how to merge two different audio in video using java xuggler

我需要幫助將兩個單獨的音頻文件連接在一起。 我的第一條音軌持續7秒鍾,我希望第二條音軌在第一條音軌之后立即播放。

以下是我的代碼:

private void initVideo(String fileName){
    String inputAudioFilePath = "/Users/Document/Desktop/audio.mp3";

    createEmptyMP4(folder + "/" + fileName + ".mp4");
    writer = makeWriter(folder + "/" + fileName + ".mp4");
    screenBounds = Toolkit.getDefaultToolkit().getScreenSize();
    writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4,screenBounds.width, screenBounds.height);
    startTime = System.nanoTime();

    IContainer containerAudio = IContainer.make();

    if(containerAudio.open(inputAudioFilePath, IContainer.Type.READ, null) < 0){
        throw new IllegalArgumentException("Cant find " + inputAudioFilePath);
    }

    // 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();
    writer.addAudioStream(1, 0, coderAudio.getChannels(), coderAudio.getSampleRate());
    int a = -1;
    ArrayList<IAudioSamples> audioPac = new ArrayList<IAudioSamples>();

    while ((a = containerAudio.readNextPacket(packetaudio)) >= 0){
        if (a >= 0){
            // audio packet
            IAudioSamples samples = IAudioSamples.make(512, coderAudio.getChannels(), IAudioSamples.Format.FMT_S32);
            coderAudio.decodeAudio(samples, packetaudio, 0);
            audioPac.add(samples);
        }
    }

    for(int j=0; j < 300; j++){ 
        writer.encodeAudio(1, audioPac.get(j)); 
    }

    coderAudio.close();
    containerAudio.close();
}

假設您已經打開了兩個音頻文件:

coderAudio1 <--- first.mp3

coderAudio2 <--- second.mp3

將所有音頻的第一個樣本寫入刻錄機 ,完成后,開始寫入第二個音頻樣本。

通過一些更改和控制,您可以在兩個音頻之間添加視頻幀。

我寫了這段代碼,但是在文件上出現錯誤,我不知道原因。

import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.xuggler.IAudioSamples;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IPacket;
import com.xuggle.xuggler.IStreamCoder;

/**
 *
 * @author Pasban
 */
public class xuggleMergeAudioTest {

    public static void main(String[] args) {
        IContainer countainer1 = IContainer.make();
        countainer1.open("audio.mp3", IContainer.Type.READ, null);
        IStreamCoder audio1 = countainer1.getStream(0).getStreamCoder();
        audio1.open(null, null);


        IContainer countainer2 = IContainer.make();
        countainer2.open("audio2.mp3", IContainer.Type.READ, null);
        IStreamCoder audio2 = countainer2.getStream(0).getStreamCoder();
        audio2.open(null, null);

        IMediaWriter mWriter = ToolFactory.makeWriter("concatinated.mp3");
        mWriter.addAudioStream(0, 0, audio1.getChannels(), audio1.getSampleRate());

        IPacket packet = IPacket.make();
        while (countainer1.readNextPacket(packet) >= 0) {
            IAudioSamples samples = IAudioSamples.make(512, audio1.getChannels(), IAudioSamples.Format.FMT_S32);
            audio1.decodeAudio(samples, packet, 0);
            mWriter.encodeAudio(0, samples);
        }

        while (countainer2.readNextPacket(packet) >= 0) {
            IAudioSamples samples = IAudioSamples.make(512, audio2.getChannels(), IAudioSamples.Format.FMT_S32);
            audio2.decodeAudio(samples, packet, 0);
            mWriter.encodeAudio(0, samples);
        }

        mWriter.close();

    }
}

您還從Xuggle嘗試了此演示: https : //code.google.com/p/xuggle/source/browse/trunk/java/xuggle-xuggler/src/com/xuggle/mediatool/demos/ConcatenateAudioAndVideo.java? r = 929

我認為您也必須檢查兩個音頻通道中的通道和采樣率是否也都達到了。

Creo que esta es una medjora,Sirve para n archivos de audio

import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.xuggler.IAudioSamples;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IPacket;
import com.xuggle.xuggler.IStreamCoder;

public class Concatenador_Audios {
public static void main(String[] args) {
        ConcatenarAudios("D:\\out concatenate.mp3", "D:\\in Audio (1).mp3", "D:\\in Audio (2).mp3", "D:\\in Audio (3).mp3");
    }

    public static void ConcatenarAudios(String Ruta_AudioConcatenado,String... ruta_Audio) {
        int n = ruta_Audio.length;
        IMediaWriter mWriter = ToolFactory.makeWriter(Ruta_AudioConcatenado);

        IPacket packet = IPacket.make();
        for (int i = 0; i < n; i++) {
            IContainer container = IContainer.make();
            container.open(ruta_Audio[i], IContainer.Type.READ, null);
            IStreamCoder audio = container.getStream(0).getStreamCoder();
            audio.open(null, null);
            if (i == 0) {
                mWriter.addAudioStream(0, 0, audio.getChannels(), audio.getSampleRate());
            }
            while (container.readNextPacket(packet) >= 0) {
                IAudioSamples samples = IAudioSamples.make(512, audio.getChannels(), IAudioSamples.Format.FMT_S32);
                audio.decodeAudio(samples, packet, 0);
                mWriter.encodeAudio(0, samples);
            }
            container.close();
            audio.close();
            }

            mWriter.close();
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM