2016-05-15 15 views
0

Ich versuche, Audio zu AAC mit Profil FF_PROFILE_AAC_LOW durch die folgenden Einstellungen zu kodieren.So kodieren Sie Audio zu AAC mit Profil FF_PROFILE_AAC_LOW

oc_cxt->profile = FF_PROFILE_AAC_LOW; 

auch vom Ausgang der av_dump_format, bekam ich diesen

Metadata: 
encoder   : Lavf57.36.100 
Stream #0:0: Audio: aac (LC) (mp4a/0x6134706D), 44100 Hz, stereo, fltp, 192 kb/s 

Aber der Ausgang ist anders. Alles ist in Ordnung, außer der Ausgang ist AAC, nicht AAC (LC). Durch ffprobe Verwendung zu erkennen, wird die Ausgangsinformation

$ ffprobe o.m4a 
... 
Stream #0:0(und): Audio: aac (mp4a/0x6134706D), 44100 Hz, stereo, fltp, 195 kb/s (default) 
... 

AAC (LC) ist das gewünschte Ergebnis ich brauche.

Aber von der Befehlszeile kann ffmpegAAC (LC) Ausgabe erzeugen. Unten ist ein kleiner Test.

$ ffmpeg -f lavfi -i aevalsrc="sin(440*2*PI*t):d=5" aevalsrc.m4a 
$ ffprobe aevalsrc.m4a 
... 
Stream #0:0(und): Audio: aac (LC) (mp4a/0x6134706D), 44100 Hz, mono, fltp, 69 kb/s (default) 
... 

Wie kann ich FF_PROFILE_LOW wählen AAC (LC) Ausgabe zu erhalten?

Antwort

1

Dies wurde durch neue ffmpeg api verursacht, die ich nicht bemerkt habe.

Die zusätzlichen Daten müssen nach avcodec_open2 in AVStream->codecpar->extradata kopiert werden. Danach kann das ffprobe erkennen, dass die Ausgabe das Format ist, das ich brauche, AAC (LC).

Nachstehend ist ein Code-Schnipsel aus ffmpeg.c

if (!ost->st->codecpar->extradata && avctx->extradata) { 
    ost->st->codecpar->extradata = av_malloc(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); 
    if (!ost->st->codecpar->extradata) { 
     av_log(NULL, AV_LOG_ERROR, "Could not allocate extradata buffer to copy parser data.\n"); 
     exit_program(1); 
    }  
    ost->st->codecpar->extradata_size = avctx->extradata_size; 
    memcpy(ost->st->codecpar->extradata, avctx->extradata, avctx->extradata_size); 
} 

Hoffentlich wäre es hilfreich sein, um jemand die neueste Version von ffmpeg (3.x) zu verwenden.