Wie generiere ich den AAC ADTS Elementary Stream mit Android MediaCodec?
Was ich zu tun versuche: Android MediaCodec zu Kodieren, raw-PCM-audio-samples in einen raw-AAC-Datei.
Das problem habe ich auch: wenn ich mit FFMPEG zu packen, um die erzeugten raw-AAC-Datei in eine M4A-container, FFMPEG beschwert sich über fehlende codec-Parameter in der Datei.
Details:
Da kann ich nicht finden MediaCodec Beispiel-code für die audio-encoder, der erzeugt eine Ausgabe AAC-Datei, ich habe versucht, ändern Sie den video-encoder in einem audio-encoder. Der original code ist hier: source_code
Ich konfiguriert die audio-encoder wie diese:
mEncoderFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", (int)mAudioSampleRate, 2);
//redundant?
mEncoderFormat.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
mEncoderFormat.setInteger(MediaFormat.KEY_AAC_PROFILE,
MediaCodecInfo.CodecProfileLevel.AACObjectELD);
mEncoderFormat.setInteger(MediaFormat.KEY_SAMPLE_RATE, kSampleRates);
mEncoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, kBitRates);
mEncoderFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2);
testEncoderWithFormat("audio/mp4a-latm", mEncoderFormat);
try {
codec.configure(
mEncoderFormat,
null /* surface */,
null /* crypto */,
MediaCodec.CONFIGURE_FLAG_ENCODE);
} catch (IllegalStateException e) {
Log.e(TAG, "codec '" + componentName + "' failed configuration.");
return;
}
Log.d(TAG, " testEncoder configured with format = " + format);
Dann füttere ich den encoder mit 10ms im Wert von PCM-samples pro frame. Der encoder nimmt jeden frame erzeugt einen Rahmen von bitstream, und ich Schreibe den bitstream in ein FileOutputStream. Die Schleife wird fortgesetzt, bis das Ende der Eingabe-Datei.
Wird der code ausgeführt, zum Ziel. Ich Mach 'adb pull', um die erzeugte AAC-Datei aus dem Gerät zu meinem PC, und verwenden Sie FFMPEG, es zu Lesen. Unten ist der Befehl und die Fehlermeldung FFMPEG spuckt:
$ ffmpeg -f aac -i BlessedNoColor_nexus7_api18.aac
ffmpeg version N-45739-g04bf2e7 Copyright (c) 2000-2012 the FFmpeg developers
built on Oct 20 2012 00:20:36 with gcc 4.7.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-pthreads --enable-runt
ime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass -
-enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enab
le-libgsm --enable-libmp3lame --enable-libnut --enable-libopenjpeg --enable-libo
pus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheo
ra --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
bvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --ena
ble-zlib
libavutil 51. 76.100 / 51. 76.100
libavcodec 54. 67.100 / 54. 67.100
libavformat 54. 33.100 / 54. 33.100
libavdevice 54. 3.100 / 54. 3.100
libavfilter 3. 19.103 / 3. 19.103
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 16.100 / 0. 16.100
libpostproc 52. 1.100 / 52. 1.100
[aac @ 00000000002efae0] channel element 2.0 is not allocated
[aac @ 00000000003cf520] decoding for stream 0 failed
[aac @ 00000000003cf520] Could not find codec parameters for stream 0 (Audio: aac, 0 channels, s16): unspecified sample rate
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[aac @ 00000000003cf520] Estimating duration from bitrate, this may be inaccurate
BlessedNoColor_nexus7_api18.aac: could not find codec parameters
Meine Fragen:
- Ich so konfiguriert haben, dass der encoder vor dem Aufruf codec.start(). Warum wird der erzeugte AAC-Datei fehlen die codec-Parameter?
- In der original-video-codec-Beispiel-Parameter "csd-0" übergeben werden, von der encoder-decoder, aber sind nicht in der SCHRIFTLICHEN bitstream-Datei ausdrücklich. Brauche ich zu schreiben, Sie in die AAC-Datei, die explizit?
- Ich Teile die input PCM-samples in 10ms pro frame, die nicht unbedingt zu einer vollständigen Ausgabe Paket. Für jeden Eingang Rahmen, den ich gerade schreiben, was die encoder-Ausgänge in die Datei. Ist das ein Grund zur Besorgnis?
Jeder hilft werden sehr geschätzt. Es wäre toll, wenn es ein Beispielprojekt, das ist, was ich versuche zu tun. Wenn mein source-code, die helfen können Sie mir helfen, werde ich es posten. Ich muss etwas Aufräumen. Danke!
Bearbeiten: den Titel Geändert von "Elementary AAC-Datei generiert, die von MediaCodec fehlenden codec-Parameter" in "so erzeugen Sie die AAC-ADTS-elementary-stream mit Android MediaCodec"
InformationsquelleAutor der Frage hubeir | 2013-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich endlich erzeugte AAC-Dateien sind abspielbar auf den sowohl die Android-Gerät und dem Windows-host-computer. Ich bin Entsendung meine Lösung hier, in der Hoffnung, es könnte anderen helfen.
Erste, meine Vorherige Annahme, dass der Android MediaCodec-encoder generiert die AAC elementary stream war nicht korrekt. Die MediaCodec-encoder generiert die raw-AAC-stream. Das ist, warum die Datei konnte nicht wiedergegeben werden. Die raw-AAC-stream konvertiert werden muss, in ein abspielbares format, wie die ADTS stream. Ich änderte den Titel von diesem post spiegeln meine neuen Verständnis. Es war ein weiterer Beitrag , fragte eine ähnliche Frage und hatte eine ausgezeichnete Antwort. Aber ein Anfänger kann nicht unbedingt verstehen, die kurzen Beschreibungen. Ich habe es nicht ganz verstanden das 1. mal, ich habe gelesen, dass post.
So, in Reihenfolge zu generate eine AAC bitstream, die gespielt werden können, indem Sie einen media-player, fing ich aus den EncoderTest Beispiel von fadden in seinem 1. Kommentar, sondern modifiziert das original-code hinzu, um die ADTS-header pro Ausgabe-Frames (access unit), und schreiben die daraus resultierende Datenstrom in eine Datei (ersetzt Linien 248 durch 267 der original-code mit den folgenden code-snippet):
Außerhalb der Schleife, I definiert die Funktion addADTStoPacket wie diese:
Ich auch code Hinzugefügt, um zu Steuern, wie zu stoppen, die Erzeugung der AAC-ADTS stream, aber das ist anwendungsspezifisch, also werde ich nicht ins detail hier. Mit all diesen Veränderungen, die erzeugte AAC-Dateien können wiedergegeben werden auf dem Android-Gerät auf meinem Windows-PC, und ffmpeg ist glücklich mit Ihnen.
InformationsquelleAutor der Antwort hubeir