0

私はこのapi を使用していますが、私を混乱させるコード例に出くわしました。インターフェイスはデータ型であるため、「new」を使用してインターフェイスにオブジェクトを割り当てることができることを知っています。以下のコードから理解できないのは、変数「cc」と「audioDecoder」に、割り当てられた値が割り当てられている理由です。私の知る限り、これらの変数は新しいオブジェクトに割り当てる必要があります。誰かがここで何が起こっているのか説明できますか?

try {
// open media file 
DefaultMediaPlayer player = new DefaultMediaPlayer("/home/me/walking.wav");

// get some properties of the first audio stream 
IDecoder audioDecoder = player.getAudioStreamDecoder(0);
ICodecContextWrapper cc = audioDecoder.getCodecContext();

int sampleFormat = cc.getSampleFormat();
int sampleRate = cc.getSampleRate();
int bytesPerSample = AVSampleFormat.getBytesPerSample(sampleFormat);
long channelLayout = cc.getChannelLayout();
int channelCount = AVChannelLayout.getChannelCount(channelLayout);
AudioFormat.Encoding encoding;

if (AVSampleFormat.isPlanar(sampleFormat) || AVSampleFormat.isReal(sampleFormat))
    throw new LibavException("unsupported output sample format");
else if (AVSampleFormat.isSigned(sampleFormat))
    encoding = AudioFormat.Encoding.PCM_SIGNED;
else
    encoding = AudioFormat.Encoding.PCM_UNSIGNED;

// create Java InputStream for audio stream raw data
SampleInputStream sis = new SampleInputStream(sampleRate * bytesPerSample * channelCount, true);

// create AudioInputStream from the SampleInputStream
AudioInputStream audioStream = new AudioInputStream(sis, new AudioFormat(encoding, sampleRate,
    bytesPerSample * 8, channelCount, bytesPerSample * channelCount, sampleRate, 
    ByteOrder.BIG_ENDIAN.equals(ByteOrder.nativeOrder())), -1);

// create adapter between Libav audio frames and the SampleInputStream
Frame2AudioFrameAdapter resampler = new Frame2AudioFrameAdapter(channelLayout, channelLayout, sampleRate, 
    sampleRate, sampleFormat, sampleFormat);

// get audio mixer for the audio stream format
PlaybackMixer audioMixer = PlaybackMixer.getMixer(audioStream.getFormat());

// connect all streams
audioDecoder.addFrameConsumer(resampler);
resampler.addAudioFrameConsumer(sis);
audioMixer.addInputStream(audioStream); 

// enable audio stream decoding
player.setAudioStreamDecodingEnabled(0, true);

// start playback
audioMixer.play();
player.play();

// wait until the playback stops
player.join();

// release system resources
player.close();
resampler.dispose();
PlaybackMixer.closeAllMixers();
} catch (Exception ex) {
    Logger.getLogger(PlaybackSample.class.getName()).log(Level.WARNING, "unable to play audio", ex);
}
4

3 に答える 3

1

このように常にオブジェクトを作成する必要はありません

SomeClass obj=new SomeClass();

あなたはこのようないくつかのケースを持つことができます

public class OtherClass
{
  public SomeClass getSomeClassObject()
 {
    return new SomeClass();
 }
}

given that SomeClass is accesible within OtherClass

以下のように使用できます

OtherClass other=new OtherClass();
SomeClass come=other.getSomeClassObject();
于 2013-01-03T04:08:07.967 に答える
1

APIドキュメントを読んだ場合。メソッドDefaultMediaPlayer.getAudioStreamDecoder

タイプIDecoderのインスタンスを返しています。そのため、src では戻り値の型を IDecoder 型の audioDecoder 変数に割り当てます。

// get some properties of the first audio stream 
IDecoder audioDecoder = player.getAudioStreamDecoder(0);
ICodecContextWrapper cc = audioDecoder.getCodecContext();

のみを使用してインターフェイス タイプにオブジェクトを割り当てることができるというルールはありませんnew。メソッドの戻り値の型からオブジェクト インスタンスを割り当てることができます。

同様に、このメソッドはvariable に割り当てられているIDecoder.getCodecContext()instance のオブジェクトを返します。ICodecContextWrappercc

于 2013-01-03T04:08:30.960 に答える
0
ICodecContextWrapper cc = audioDecoder.getCodecContext();

getCodecContext はおそらく次のようなものです。

ICodecContextWrapper getCodecContext() {

return new ICodecContextWrapper() {
  //override methods
};

}
于 2013-01-03T04:09:33.283 に答える