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:

  1. Ich so konfiguriert haben, dass der encoder vor dem Aufruf codec.start(). Warum wird der erzeugte AAC-Datei fehlen die codec-Parameter?
  2. 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?
  3. 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

Schreibe einen Kommentar