ffmpeg新旧インタフェース記録

5665 ワード

他の人のコードを学ぶのはデバッグの时にどうしても古いインタフェースがすでに支持しない问题に出会って、自分で整理したいと思って、ネット上で人が整理したのを见て、先にmarkして、机会があれば自分でも补充します.
転載:http://blog.csdn.net/sukhoi27smk/article/details/18842725
ffmpegソースパッケージにはapichangsドキュメントがあり、様々なインタフェースが変更された記録があります.インタフェースが使えないことに気づいたら、そのドキュメントを検索して、対応する新しいインタフェースを見つけることができます.そして、新しいインタフェースに対応するヘッダファイルに説明文字を見つけることができます.ネット上にはffmpeg(libav)に関する資料がN年前のものがたくさんあります.実はffmpegは数年来ずっと“时をもって共に进みます”で、そのためいくつかの新米で、あるいはベテランと称する人に関わらず、时には头が痛いことを免れません...皆さんの頭痛の問題を解決するために、ffmpegに関するよくある、バージョンの問題を列挙して、参考にしてください.同時に、皆さんも一緒に補充してください.
  • guessを知らないformat. 解決:#define guess_format av_guess_formatインタフェースは変わりません.
  • 知らないav_alloc_format_context解決:#define av_alloc_format_context avformat_alloc_output_contextインタフェース調整.
  • CODECを知らないTYPE_VIDEOとCODEC_TYPE_AUDIO解決:
  • define CODEC_TYPE_VIDEO AVMEDIA_TYPE_VIDEO
    define CODEC_TYPE_AUDIO AVMEDIA_TYPE_AUDIO
  • audioを知らないresample_Init解決:#define audio_resample_init av_audio_resample_Initインタフェース調整.
  • avcodec_decode_videoからavcodec_decode_ビデオ2インタフェース調整旧コード:
  • len = avcodec_decode_video(c, (short *)outbuf, &out_size, inbuf_ptr, size);

  • 新しいコード:
  • av_init_packet(&pkt);
  • pkt.data = (unsigned char*)inbuf_ptr;
  • pkt.size = size;
  • len = avcodec_decode_video2(c, &tmpFrame, &got_picture, &pkt);

  • av_open_input_file/opt/workspace/android/EasyPlayer/jni/EasyPlayer/EasyPlayer.cpp:483: warning: 'int av_open_input_file(AVFormatContext,const char,AVInputFormat,int,AVFormatParameters)'is deprecated(declared at/opt/workspace/android/EasyPlayer/jni/EasyPlayer/./include/libavformat/avformat.h:1480)新しいインタフェース:*
  • ifdef FFMPEG_0_6_
  • if(av_open_input_file(&ffmpeg_fields.pFormatCtx, _filePath, NULL, 0, NULL) != 0)
  • else
  • if (avformat_open_input(&ffmpeg_fields.pFormatCtx, _filePath, NULL, NULL) != 0)
  • endif

  • av_find_stream_info/opt/workspace/android/EasyPlayer/jni/EasyPlayer/EasyPlayer.cpp:494: warning: 'int av_find_stream_info(AVFormatContext*)'is deprecated(declared at/opt/workspace/android/EasyPlayer/jni/EasyPlayer/../include/libavformat/avformat.h:1526)新しいインタフェース:
  • ifdef FFMPEG_0_6_
  • if(av_find_stream_info(ffmpeg_fields.pFormatCtx) < 0)
  • else
  • if (avformat_find_stream_info(ffmpeg_fields.pFormatCtx, NULL) < 0)
  • endif

  • av_close_input_file
    /opt/workspace/android/EasyPlayer/jni/EasyPlayer/EasyPlayer.cpp:522: warning: 'void av_close_input_file(AVFormatContext*)' is deprecated (declared at/opt/workspace/android/EasyPlayer/jni/EasyPlayer/../include/libavformat/avformat.h:1706)
    新しいインタフェース:
  • ifdef FFMPEG_0_6_
  • av_close_input_file(ffmpeg_fields.pFormatCtx);
  • else
  • avformat_close_input(&ffmpeg_fields.pFormatCtx);
  • endif

  • 注意、これは2級ポインタです.
    avcodec_Open 2新しく出てきたavcodec_Open 2インタフェースは、いくつかの符号化特性の指定をサポートする.
    ifdef FFMPEG_0_6
    if (avcodec_open(ffmpeg_video.codec_ctx, ffmpeg_video.codec) < 0)
    

    else
    if (avcodec_open2(ffmpeg_video.codec_ctx, ffmpeg_video.codec, NULL) < 0)
    

    endif
    avcodec_init
    /opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:20: warning: 'void avcodec_init()' is deprecated (declared at/opt/workspace/android/EasyIPCam/jni/libeasycodec/../3rdparty/libavcodec/avcodec.h:3932)
    このfunctionはもう必要ありませんavcodecを呼び出すとregister()またはavcodec_register_all()の場合、ffmpegは自動的に呼び出されます.安心して大胆に取り外せばいいのです.
    url_fclose url_fopen url_fseekなど
    /opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:67: warning: 'int url_fclose(AVIOContext*)'is deprecated(declared at/opt/workspace/android/EasyIPCam/jni/libeasycodec/.../3 rdparty/libavformat/avio.h:324)このシステムのインタフェースは、前にavio_を追加するだけです.の接頭辞でいいです.例えば、avio_close().
    avcodec_alloc_context()
    /opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:111: warning: 'AVCodecContext* avcodec_alloc_context()' is deprecated (declared at/opt/workspace/android/EasyIPCam/jni/libeasycodec/../3rdparty/libavcodec/avcodec.h:4025)
    最新インタフェースの使用:avcodec_alloc_context3()
  • m_pACodec = avcodec_find_encoder((CodecID)nCodecID);
  • if(!m_pACodec) return false;
  • m_pAContext = avcodec_alloc_context3(m_pACodec);

  • av_get_bits_per_sample_format
    /opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:143: warning: 'int av_get_bits_per_sample_format(AVSampleFormat)'is deprecated(declared at/opt/workspace/android/EasyIPCam/jni/libeasycodec/../3 rdparty/libavcodec/avcodec.h:4529)新しいインタフェースをav_に変更get_bytes_per_sample(どうせオーディオbits per sampleは8の倍数で、8ではなく16で、bitよりbyteの方がいい)
    audio_resample_init
    /opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:157: error: 'audio_resample_init'was not declared in this scope新しいインタフェース:av_audio_resample_init、ffmpegは2 channelsを超えるresampleをサポートすると思っていたが、resampleを見てみると.cの実装では、monoとstereoの多くのパラメータしかサポートできないことがわかりました.default値を入力します.
  • AV_SAMPLE_FMT_S16,
  • AV_SAMPLE_FMT_S16,
  • TAPS, 10, 0, 0.8

  • 詳しくはresample.c、またはRTSPPlayerのeasyffmpegを参照する.cpp.
    PKT_FLAG_KEYは何も言うことがなくて、直接前にAVをプラスしますの接頭辞:AV_PKT_FLAG_KEY
    av_alloc_format_context
    /opt/workspace/android/EasyIPCam/jni/libeasycodec/EasyCodec.cpp:722: error: 'av_alloc_format_context'was not declared in this scopeこの前の2人の同僚は違いを言及したが、どのように異なる方法を言わないで、本当に憎いので、私は直接例を書きます.
  • avformat_alloc_output_context2(&m_pFormatCtx, pOutputFmt, "avi", pFileName);