public AudioTranscoder(AudioEncoder audioEncoder, AudioDecoder audioDecoder = null) { decoder = audioDecoder; encoder = audioEncoder; if (audioDecoder != null) { resampler = new Resampler(audioDecoder, audioEncoder); } buffer = new AudioFifoBuffer(audioEncoder.SampleFormat, audioEncoder.Channels); }
public static void InitOutputFrame(AVFrame **frame, AudioEncoder encoder, int maxFrameSize) { if ((*frame = ffmpeg.av_frame_alloc()) == null) { throw new FFmpegException(ffmpeg.AVERROR(ffmpeg.ENOMEM), "Failed to allocate output frame."); } (*frame)->nb_samples = Math.Min(maxFrameSize, encoder.FrameSize); (*frame)->channel_layout = encoder.ChannelLayout; (*frame)->format = (int)encoder.SampleFormat; (*frame)->sample_rate = encoder.SampleRate; int ret; if ((ret = ffmpeg.av_frame_get_buffer(*frame, 0)) < 0) { ffmpeg.av_frame_free(frame); throw new FFmpegException(ret, "Failed to allocate output frame samples."); } }
public void WriteFrameToEncoder(AudioEncoder encoder) { AVFrame *outputFrame = null; Util.InitOutputFrame(&outputFrame, encoder, GetBufferSize()); try { byte *[] outputDataArray = outputFrame->data; fixed(byte **dataPtr = &outputDataArray[0]) { if (ffmpeg.av_audio_fifo_read(audioFifo, (void **)dataPtr, outputFrame->nb_samples) < outputFrame->nb_samples) { throw new FFmpegException(ffmpeg.AVERROR_UNKNOWN, "Failed to read data from fifo buffer."); } } encoder.WriteNextAudioFrame(outputFrame); } finally { ffmpeg.av_frame_free(&outputFrame); } }