4

xugglerを使用してビデオファイル(.avi、*。mp4など)からオーディオファイル(* .mp3、.wavなど)を作成しようとしています。これが私のコードです

Code:
IMediaReader reader = ToolFactory.makeReader("D:/Frames/my.mp4");
IMediaWriter writer = ToolFactory.makeWriter("D:/a.mp3",reader);
int sampleRate = 44100;
int channels = 1;
writer.addAudioStream(0, 0, ICodec.ID.CODEC_ID_MP3, channels, sampleRate);
while (reader.readPacket() == null);

しかし、それは私のためにオーディオファイルを作成しません。私が間違っているところを教えてください。あなたがそれを修正するか、この目的のために私のものとは異なる他のコードを提供するなら、私は感謝するでしょう。

4

5 に答える 5

16

この問題についてインターネットでたくさん検索した後、私はJAVE(Java Audio Video Encoder)でこれと同じ作業を行うことができることを発見したので、それを試してみて、それは私のために動作します..だから私はそこに解決策を投稿すると思いましたそうでなければ同じ問題に直面し、彼/彼女は私の作品を見ることができます。

実際には舞台裏でffmpegを使用しており、ビデオファイルからオーディオを抽出します。ここにJAVEのリンクがあり ますhttp://www.sauronsoftware.it/projects/jave/index.php

そこにある一例も見てください。あなたの便宜のためにここに投稿しています。

File source = new File("source.mp4");
File target = new File("target.mp3");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(new Integer(128000));
audio.setChannels(new Integer(2));
audio.setSamplingRate(new Integer(44100));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs); 

うまくいけば、それはあなたを助けるでしょう..!

于 2012-10-03T14:48:09.250 に答える
3

これは古い投稿ですが、私の答えが誰かに役立つことを願っています:

問題のコードと同じコードを使用していましたが、そのコードを使用して一部のファイルを変換できなかったため、問題が発生しました。

この回答では、ファイルを開き、音声が含まれている場合はファイルを作成します。それ以外の場合、ファイルは作成されません。この方法は、ファイルのオーディオ部分を抽出する正しい方法です。

同じパターンをビデオに適用できます。このコードはそれにもアイデアを与えると思います。

package test.video;

import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.MediaToolAdapter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.mediatool.event.IAudioSamplesEvent;
import com.xuggle.mediatool.event.ICloseEvent;
import com.xuggle.mediatool.event.IOpenCoderEvent;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IStreamCoder;

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

    public static void main(String[] args) throws Exception {
        String file = "pasban/22.mp4";
        String to = "pasban/22.mp3";
        convert(file, to);
    }

    public static void convert(String from, final String to) {
        IMediaReader mediaReader = ToolFactory.makeReader(from);
        final int mySampleRate = 44100;
        final int myChannels = 2;

        mediaReader.addListener(new MediaToolAdapter() {

            private IContainer container;
            private IMediaWriter mediaWriter;

            @Override
            public void onOpenCoder(IOpenCoderEvent event) {
                container = event.getSource().getContainer();
                mediaWriter = null;
            }

            @Override
            public void onAudioSamples(IAudioSamplesEvent event) {
            if (container != null) {
                  if (mediaWriter == null) {
                    mediaWriter = ToolFactory.makeWriter(to);

                    mediaWriter.addListener(new MediaListenerAdapter() {

                          @Override
                          public void onAddStream(IAddStreamEvent event) {
                              IStreamCoder streamCoder = event.getSource().getContainer().getStream(event.getStreamIndex()).getStreamCoder();
                              streamCoder.setFlag(IStreamCoder.Flags.FLAG_QSCALE, false);
                              streamCoder.setBitRate(128);
                              streamCoder.setChannels(myChannels);
                              streamCoder.setSampleRate(mySampleRate);
                              streamCoder.setBitRateTolerance(0);
                          }
                      });

                    mediaWriter.addAudioStream(0, 0, myChannels, mySampleRate);
                }
                    mediaWriter.encodeAudio(0, event.getAudioSamples());
                    //System.out.println(event.getTimeStamp() / 1000);
                }
            }

            @Override
            public void onClose(ICloseEvent event) {
                if (mediaWriter != null) {
                    mediaWriter.close();
                }
            }
        });

        while (mediaReader.readPacket() == null) {
        }
    }
}
于 2015-07-10T18:21:21.750 に答える
2

ライターにパケットのリーダーをリッスンさせる必要があります。

reader.addListener(writer);

それを機能させるために必要なのはそれだけです。

于 2013-05-09T21:02:33.910 に答える
0

私のコードでは、@KostasAndrianopoulosの答えに従ってください。例外をスローします:「エラー操作は許可されていません。ヘッダーをコンテナーに書き込めませんでした.....」変更後のコードは次のとおりです。

    IMediaReader reader = ToolFactory.makeReader("D:\\123.flv");
    IMediaWriter writer = ToolFactory.makeWriter("D:\\output.mp3", reader);
    int sampleRate = 44100;
    int channels = 2;
    writer.setMaskLateStreamExceptions(true);
    writer.addAudioStream(1, 0, ICodec.ID.CODEC_ID_MP3, channels, sampleRate);
    reader.addListener(writer);
    while(reader.readPacket() == null)
        ;

すべてがOKですが、最も重要なことは、なぜかわかりません。addAudioStreamの最初のパラメーター(ドキュメントを読んだ後)の意味は何ですか、それで誰かが私にいくつかの情報を教えてくれますか、ありがとう。

于 2014-11-28T03:25:47.517 に答える
-1

これは改善だと思います。n個のオーディオファイルに適しています。

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();
        }
    }
}
于 2018-01-01T12:28:54.437 に答える