2014-04-10 32 views
1

我使用的ffmpeg PCM數據編碼爲AAC格式: 以下是我的代碼來設置上下文對象:指定的採樣格式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"; 
} 

我總是得到一個錯誤日誌爲: AAC @ 0x151cda00]指定的採樣格式S16無效或不支持

如果我不提供任何樣本格式,我得到了相同的日誌: AAC @ 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 native編碼器的版稅,因爲他們在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];

相關問題