Wie Dekodieren von AAC mit avcodec_decode_audio4?
Änderte ich in meinem code avcodec_decode_audio3 zu avcodec_decode_audio4 und fügte hinzu, die frame-handling. Aber jetzt kann ich Sie nicht Dekodieren von AAC-frames mehr.
Warum avcodec_decode_audio4 zurück -22 (ungültiges argument)?
Nach der Antwort unten, hat das etwas zu tun mit den Parametern in AVContext, die eingestellt werden müssen?
Musste ich avcodec_decode_audio4, weil ich meine aktualisierten ffmpeg und bekam dann die folgende Fehlermeldung:
[NULL @ 0xb14f020] Custom get_buffer() for use withavcodec_decode_audio3() detected.
Overriding with avcodec_default_get_buffer
[NULL @ 0xb14f020] Please port your application to avcodec_decode_audio4()
Laut Puffer Fehler in avcodec_decode_audio4() dies ist eine regression, gibt es keine andere Lösung als zurück zu ffmpeg < 0.8 ?
Den decoder mit avcodec_decode_audio4:
AVCodec *codec;
AVCodecContext *avCtx;
AVFrame * decoded_frame = NULL;
uint8_t *outbuf = static_cast<uint8_t *>(malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE));
AVPacket avPacket;
main(){
av_register_all();
codec = avcodec_find_decoder(CODEC_ID_AAC);
//set parameters
avCtx = avcodec_alloc_context3(codec);
avCtx->channels = 1;
avCtx->sample_rate = 44100;
avCtx->bit_rate=16;
if (avcodec_open2(avCtx, codec, NULL) < 0) printf("Could not open codec\n");
av_init_packet(&avPacket);
//Main decoder loop
while(1)
my_frame_decoder();
return 0;
}
void my_frame_decoder() {
//get data
...
avPacket.size = numBytes;
avPacket.data = inputBytes;
int len;
while (avPacket.size > 0) {
int got_frame = 0;
if (!decoded_frame) {
if (!(decoded_frame = avcodec_alloc_frame())) {
printf("out of memory");
return;
}
} else {
avcodec_get_frame_defaults(decoded_frame);
}
//-------------------->> returns always -22
len = avcodec_decode_audio4(avCtx, decoded_frame, &got_frame, &avPacket);
//do something with the decoded frame
...
avPacket.size -= len;
avPacket.data += len;
}
return;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach Stunden des Suchens, fand ich heraus, dass die
dec_ctx
desavcodec_decode_audio4
geöffnet werden muss, durch einedec_codec
initialisiert durchav_find_best_stream()
Ich denke das problem ist, die Parameter in Ihrem codec Kontext. Bitte https://www.ffmpeg.org/doxygen/trunk/structAVCodecContext.html für die Einstellung von Parametern, die sich von avcodec_decode_audio3 zu avcodec_decode_audio4.
Keine Lösung, aber ein workaround ist, um zurück zu älteren Versionen. Nach testen von verschiedenen builds mit avcodec_decode_audio3, ich dachte, es könnte nützlich sein, für andere zu wissen, dass ffmpeg-0.10.14.tar.bz2 aus https://ffmpeg.org/releases/ funktioniert.