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小
解決策は、収集された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
では、まず再サンプリングのプロセスが必要です.利用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