Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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.");
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }