8

現在、プログラムが使用する ffmpeg のバージョンをアップグレードしようとしています。これまで使用していたのは ffmpeg 0.8 で、最新バージョンは 1.2 であるため、ジャンプは大きいです。

これらのテストでは、ここで見つけた素晴らしいパッケージを使用しています。

最初に、ffmpeg 1.2 をダウンロードしてビルドしようとしましたが、もちろん、関数と変数が廃止されたか、存在しなくなったことについて、多くの警告とエラーが発生しました。

移行をスムーズにするために、0.8 に最も近い上位バージョンである ffmpeg 1.0 に対してビルドを試みました。以下にリストする警告とエラーのリストを取得しました。

私の質問は次のとおりです。新しいバージョンで古い ffmpeg パラダイム/関数呼び出しを変換するために、これらの移行に役立つガイドはありますか? 私が書いていない多くのコードについて話しているので、行ごとに分析したくないので、古い関数呼び出しを 1 対 1 で新しい関数呼び出し、変数と同じ。

ここに警告とエラーのリストがあります(私はそれをきれいにしたので、エラー/警告ごとに1つのエントリしかありません)

warning: 'AVStream* av_new_stream(AVFormatContext*, int)' is deprecated (declared at /ffmpeg/include/libavformat/avformat.h:1646) [-Wdeprecated-declarations]

warning: 'int avcodec_open(AVCodecContext*, AVCodec*)' is deprecated (declared at /ffmpeg/include/libavcodec/avcodec.h:3569) [-Wdeprecated-declarations]
error: 'avcodec_init' was not declared in this scope
warning: 'int avcodec_encode_video(AVCodecContext*, uint8_t*, int, const AVFrame*)' is deprecated (declared at /ffmpeg/include/libavcodec/avcodec.h:4272) [-Wdeprecated-declarations]

warning: 'AVCodecContext* avcodec_alloc_context()' is deprecated (declared at /ffmpeg/include/libavcodec/avcodec.h:3423) [-Wdeprecated-declarations]

warning: 'int avcodec_decode_audio3(AVCodecContext*, int16_t*, int*, AVPacket*)' is deprecated (declared at /ffmpeg/include/libavcodec/avcodec.h:3852) [-Wdeprecated-declarations]

warning: 'void av_close_input_file(AVFormatContext*)' is deprecated (declared at /ffmpeg/include/libavformat/avformat.h:1622) [-Wdeprecated-declarations]
error: 'av_open_input_file' was not declared in this scope
warning: 'int av_find_stream_info(AVFormatContext*)' is deprecated (declared at /ffmpeg/include/libavformat/avformat.h:1446) [-Wdeprecated-declarations]
error: 'av_set_parameters' was not declared in this scope

error: 'AVFormatContext' has no member named 'file_size'

error: 'URL_WRONLY' was not declared in this scope

error: 'url_fopen' was not declared in this scope
error: 'url_fclose' was not declared in this scope

error: 'SAMPLE_FMT_U8' was not declared in this scope
error: 'SAMPLE_FMT_S16' was not declared in this scope
error: 'SAMPLE_FMT_S32' was not declared in this scope
error: 'SAMPLE_FMT_FLT' was not declared in this scope

error: 'FF_I_TYPE' was not declared in this scope


編集:

私はこれらを見ています...
http://ffmpeg.org/doxygen/0.8/deprecated.html
http://ffmpeg.org/doxygen/0.9/deprecated.html
http://ffmpeg.org/doxygen/ 1.0/deprecated.html
http://ffmpeg.org/doxygen/1.1/deprecated.html
http://ffmpeg.org/doxygen/1.2/deprecated.html
http://ffmpeg.org/doxygen/trunk/deprecated.html

4

2 に答える 2

11

ここを見てください。

URL_WRONLY -> AVIO_FLAG_WRITE
url_fopen -> avio_open
url_fclose -> avio_close

上記があなたを始めるのに十分であることを願っています.


リンクが残っていない場合のために、全文のトランスクリプトを次に示します。

古いコードを移植する方法に関するリソースをいくつか見つけました (ここここここ) が、必要なものではなかったので、独自のバージョンを作成することにしました。では、どうぞ。

url_open()

この関数は avio_open に変更されました。また、avio_close に名前が変更された url_close もあります。ここで見つけたこの情報。

av_new_stream()

この関数は FFMPEG 1.0.1 の時点でもサポートされていますが、非推奨としてマークされています。avformat_new_stream() に置き換えられます。古いコードが次のとおりだったとします。

AVStream *st = av_new_stream(oc, i);

変更されたコードは次のようになります。

AVStream *st = avformat_new_stream(oc, NULL);
st->id = i

st が NULL でないことを最初に確認するように注意してください!

dump_format()

この関数は、av_dump_format() に名前が変更されました。

av_write_header()

1 つではなく 2 つの引数を受け入れる avformat_write_header() に置き換えられました。古い関数と同じ動作を得るには、2 番目の引数として NULL を渡します。

av_codec_open()

これは av_codec_open2() に置き換えられます。置換関数は、2 つではなく 3 つの引数を受け入れますが、古い関数と同じ動作を得るために 3 番目の引数として NULL を入れます。

avcodec_encode_audio()

avcodec_encode_audio2() に置き換えられました。

av_set_parameters()

私はこれに代わるものを見つけることができませんでした。まず、この関数には代替手段がないことがわかりました。しかし、廃止されたにもかかわらず、FFMPEGでまだ利用可能だったときでした. その後、彼らはそれを取り外したので、交換する必要があります。特定の場所では、無効にしただけであることがわかりましたが、他の場所では、そのパラメーターを avformat_write_header に渡す必要があることがわかりました。結局、コードのその部分の作業バージョンは今のところ必要ないため、あきらめました。私の場合、avformat_alloc_context() が呼び出されてから av_set_parameters() が呼び出されるため、最後に見たのは、avformat_alloc_context() の代わりに avformat_alloc_output_context2() を呼び出すことでした。しかし、変更は簡単ではないのでスキップしました。

SampleFormat

この列挙型は、AVSampleFormat に名前が変更されました。

URL_WRONLY

この定数は AVIO_FLAG_WRITE に置き換えられました。

SAMPLE_FMT_U8, SAMPLE_FMT_S16, SAMPLE_FMT_S32, etc.

これらには AV_ がプレフィックスとして付けられるようになったため、AV_SAMPLE_FMT_U8、AV_SAMPLE_FMT_S16 などを使用します。

于 2013-07-09T19:24:00.210 に答える
9

Gabi が指摘しているように、その URL には非推奨の定数のほとんどが置き換えられています。

ただし、それらのいくつかが欠けているため、このコンパイル手順を完了するために出力が示すすべての変更を投稿します。

avcodec_init -> avcodec_register_all
av_open_input_file -> avformat_open_input

ここで、av_set_parameters が非推奨になり、完全に廃棄されたことに注意してください。そのため、今すぐ avformat_open_input の呼び出しでパラメーターを指定する必要があります。

AVFormatContext.file_size -> avio_size()
URL_WRONLY -> AVIO_FLAG_WRITE
url_fopen -> avio_open
url_fclose -> avio_close
SAMPLE_FMT_U8 -> AV_SAMPLE_FMT_U8
SAMPLE_FMT_S16 -> AV_SAMPLE_FMT_S16
SAMPLE_FMT_S32 -> AV_SAMPLE_FMT_S32
SAMPLE_FMT_FLT -> AV_SAMPLE_FMT_FLT
FF_I_TYPE -> AV_PICTURE_TYPE_I

これにより、実際のエラーがすべてカバーされるはずです。警告だけの場合は、時間をかけて、彼らが何を段階的に導入しているのかを把握してください!

于 2013-07-11T20:52:09.100 に答える