FFMPEG more samples than frame size(avcodec_encode_audio 2)のソリューション

1763 ワード

実際のプロジェクトでは、オーディオデバイスから収集されたオーディオのタイプとエンコーダタイプ(aac,amr)は通常一致しない.
では、まず再サンプリングのプロセスが必要です.利用swr_convert再サンプリング.
この時、私たちは別の問題に直面するかもしれません.encode_audioの時に出会った
more samples than frame size(avcodec_encode_audio 2)の問題です.
問題の原因はエンコーダのframe_ですsize比で採取したfram->nb_samples小
/* check for valid frame size */
    if (frame) {
        if (avctx->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
            if (frame->nb_samples > avctx->frame_size) {
                av_log(avctx, AV_LOG_ERROR, "more samples than frame size (avcodec_encode_audio2)
"); return AVERROR(EINVAL); } } else if (!(avctx->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) { if (frame->nb_samples < avctx->frame_size && !avctx->internal->last_audio_frame) { ret = pad_last_frame(avctx, &padded_frame, frame); if (ret < 0) return ret; frame = padded_frame; avctx->internal->last_audio_frame = 1; } if (frame->nb_samples != avctx->frame_size) { av_log(avctx, AV_LOG_ERROR, "nb_samples (%d) != frame_size (%d) (avcodec_encode_audio2)
", frame->nb_samples, avctx->frame_size); ret = AVERROR(EINVAL); goto end; } } }

解決策は、収集されたframeデータがAUDIO FIFOに保存されるたびに、等しく揃えることです.
ちょうどframe_sizeサイズのデータ(ここはちょうどいいので、ネット上でAVframeを分割すると言われていますが、本人はffmpeg 2.1でこの方法では解決できません)、これらのデータを一気にencodeします.
残りのデータがあれば次のencodeに格納します.audio_を使用できますfifo_データを操作する
http://www.ffmpeg.org/doxygen/1.0/audio__fifo_8c-source.html