2014-04-10 3 views
1

Я кодирования данных PCM в формате AAC с использованием FFmpeg: Ниже мой код, чтобы настроить объект контекста:Указанный формат образца s16 является недействительным или не поддерживается

-(id)encode:(short*)data{ 
    AVCodecContext *audioCodec; 
    AVCodec *codec; 

    avcodec_register_all(); 

    //Set up audio encoder 
    codec = avcodec_find_encoder(AV_CODEC_ID_AAC); 
    if (codec == NULL){ 
     NSLog(@"no codec"); 
    } 
    audioCodec = avcodec_alloc_context3(codec); 
    audioCodec->strict_std_compliance = -2; 
    audioCodec->bit_rate = 64000; 
    audioCodec->sample_fmt = AV_SAMPLE_FMT_S16; 
    audioCodec->sample_rate = 8000; 
    audioCodec->channels = 2; 
    audioCodec->profile = FF_PROFILE_AAC_MAIN; 
    audioCodec->time_base = (AVRational){1, 8000}; 
    audioCodec->codec_type = 1; 
    if (avcodec_open2(audioCodec, codec, NULL)) { 
     NSLog(@"could not open codec"); 

    } 
    return @"NO"; 
} 

Я всегда получаю журнал ошибок как: ААС @ 0x151cda00] Указанный формат образца s16 является недействительным или не поддерживается

Если я не обеспечивают образец формата, я получаю один и тот же журнал: ААС @ 0x151cda00] Указанный формат образца -1 недействителен или не поддерживается

и поэтому avcodec_open2() дает журнал не смог открыть кодек;

Может ли кто-нибудь сказать мне, в чем проблема?

FFmpeg компиляции скрипт выглядит следующим образом:

#!/bin/sh 

# directories 
SOURCE="ffmpeg" 
FAT="fat" 
VERSION="2.0.2" 

SCRATCH="scratch" 
# must be an absolute path 
THIN=`pwd`/"thin" 

# absolute path to x264 library 
#X264=`pwd`/fat_x264 

CONFIGURE_FLAGS="--enable-cross-compile \ 
    --disable-network \ 
    --disable-encoders \ 
    --disable-decoders \ 
    --disable-muxers \ 
    --disable-demuxers \ 
    --disable-protocols \ 
    --disable-devices \ 
    --disable-ffmpeg \ 
    --disable-ffplay \ 
    --disable-ffprobe \ 
    --disable-ffserver \ 
    --disable-avdevice \ 
    --disable-avfilter \ 
    --disable-iconv \ 
    --disable-bzlib \ 
    --disable-mmx \ 
    --disable-mmxext \ 
    --disable-amd3dnow \ 
    --disable-amd3dnowext \ 
    --disable-sse \ 
    --disable-sse2 \ 
    --disable-sse3 \ 
    --disable-sse4 \ 
    --disable-avx \ 
    --disable-fma4 \ 
    --disable-swresample \ 
    --disable-postproc \ 
    --disable-bsfs \ 
    --disable-filters \ 
    --disable-asm \ 
    --disable-yasm \ 
    --disable-debug \ 
    --disable-doc \ 
    --disable-armv5te \ 
    --disable-armv6 \ 
    --disable-armv6t2 \ 
    --enable-protocol=file \ 
    --enable-avformat \ 
    --enable-avcodec \ 
    --enable-swscale \ 
    --enable-demuxer=mp3 \ 
    --enable-demuxer=aac \ 
    --enable-demuxer=image2 \ 
    --enable-demuxer=mov \ 
    --enable-decoder=rawvideo \ 
    --enable-demuxer=h263 \ 
    --enable-demuxer=h264 \ 
    --enable-decoder=mp3 \ 
    --enable-decoder=aac \ 
    --enable-decoder=mjpeg \ 
    --enable-decoder=h263 \ 
    --enable-decoder=h264 \ 
    --enable-decoder=mpeg4 \ 
    --enable-encoder=mp3 \ 
    --enable-encoder=aac \ 
    --enable-encoder=mjpeg \ 
    --enable-encoder=h263 \ 
    --enable-encoder=h264 \ 
    --enable-encoder=mpeg4 \ 
    --enable-parser=mp3 \ 
    --enable-parser=aac \ 
    --enable-parser=h264 \ 
    --enable-pic" 

if [ "$X264" ] 
then 
    CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-gpl --enable-libx264" 
fi 

# avresample 
#CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-avresample" 

ARCHS="arm64 armv7s armv7 x86_64 i386" 

COMPILE="y" 
LIPO="y" 

DEPLOYMENT_TARGET="6.0" 

if [ "$*" ] 
then 
    if [ "$*" = "lipo" ] 
    then 
     # skip compile 
     COMPILE= 
    else 
     ARCHS="$*" 
     if [ $# -eq 1 ] 
     then 
      # skip lipo 
      LIPO= 
     fi 
    fi 
fi 

if [ "$COMPILE" ] 
then 
    CWD=`pwd` 
    for ARCH in $ARCHS 
    do 
     echo "building $ARCH..." 
     mkdir -p "$SCRATCH/$ARCH" 
     cd "$SCRATCH/$ARCH" 

     CFLAGS="-arch $ARCH" 
     if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ] 
     then 
      PLATFORM="iPhoneSimulator" 
      CFLAGS="$CFLAGS -mios-simulator-version-min=$DEPLOYMENT_TARGET" 
     else 
      PLATFORM="iPhoneOS" 
      CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET" 
      if [ "$ARCH" = "arm64" ] 
      then 
       EXPORT="GASPP_FIX_XCODE5=1" 
      fi 
     fi 

     XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'` 
     CC="xcrun -sdk $XCRUN_SDK clang" 
     CXXFLAGS="$CFLAGS" 
     LDFLAGS="$CFLAGS" 
     if [ "$X264" ] 
     then 
      CFLAGS="$CFLAGS -I$X264/include" 
      LDFLAGS="$LDFLAGS -L$X264/lib" 
     fi 

     $CWD/$SOURCE/configure \ 
      --target-os=darwin \ 
      --arch=$ARCH \ 
      --cc="$CC" \ 
      $CONFIGURE_FLAGS \ 
      --extra-cflags="$CFLAGS" \ 
      --extra-cxxflags="$CXXFLAGS" \ 
      --extra-ldflags="$LDFLAGS" \ 
      --prefix="$THIN/$ARCH" 

     make -j3 install $EXPORT 
     cd $CWD 
    done 
fi 

if [ "$LIPO" ] 
then 
    echo "building fat binaries..." 
    mkdir -p $FAT/lib 
    set - $ARCHS 
    CWD=`pwd` 
    cd $THIN/$1/lib 
    for LIB in *.a 
    do 
     cd $CWD 
     lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB 
    done 

    cd $CWD 
    cp -rf $THIN/$1/include $FAT 
fi 

ответ

0

Может быть, ошибка в заблуждение.

  1. Попробуйте удалить строку: audioCodec->profile = FF_PROFILE_AAC_MAIN или изменить его на audioCodec->profile = FF_PROFILE_UNKNOWN

  2. Попробуйте скомпилировать в fdk-aac кодировщика: https://github.com/mstorsjo/fdk-aac качество выпускаемой продукции намного лучше, и он поддерживает широкий диапазон частот дискретизации и битрейта. Насколько мне известно, собственный кодировщик ffmpeg не очень хорош в сравнении. Но, может быть, вы не можете использовать fdk-aac из-за лицензии (вам нужно будет платить патентные отчисления в Фраунгофера):

http://www.vialicensing.com/licensing/aac-faq.aspx

http://www.vialicensing.com/licensing/aac-fees.aspx

+0

Есть ли другой вариант, который лицензируется бесплатно? – user2955351

+0

Насколько мне известно. На самом деле Fraunhofer, вероятно, ожидает, что вы будете платить гонорары за собственный кодировщик ffmpeg, а также за их патенты на aac. – njahnke

1

У меня была аналогичная проблема, как я сделал не знаю, какой формат поддерживает мой Windows Phone. (Оказывается, это было AV_SAMPLE_FMT_FLTP)

Я в конечном итоге, глядя на исходный код avcodec_open2 (https://www.ffmpeg.org/doxygen/2.1/libavcodec_2utils_8c_source.html)

И обнаружил, что это было ссылки на кодек, какие образцы были поддержаны.

С учетом этого вы можете сделать что-то вроде этого: audioCodec-> sample_fmt = audioCodec-> codec-> sample_fmts [0];