2013-07-03 22 views
8

現在、プログラムで使用されているffmpegのバージョンをアップグレードしようとしています。これまで使用してきたものはffmpeg 0.8であり、最新バージョンは1.2であったため、ジャンプが大きくなりました。ffmpegをアップグレードする際のffmpegライブラリインターフェイスの処理

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

まず最初に、私はffmpeg 1.2をダウンロードしてビルドしようとしましたが、もちろん、関数と変数については多くの警告とエラーがありました。

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

私の質問は次のとおりです:新しいバージョンの古いffmpegパラダイム/ファンクションコールを変換するためのガイドです。私が書いていない多くのコードについては、1行ずつ分析したくないので、古い関数呼び出しの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

+0

[APIchanges](http://git.videolan.org/?p=ffmpeg.git;a=blob;f=doc/APIchanges)も参照してください。 – LordNeckbeard

答えて

6

など、AV_で今接頭辞、そうAV_SAMPLE_FMT_U8、 AV_SAMPLE_FMT_S16を使用している、その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 

これは実際のエラーをすべて網羅するものです。ちょうど警告がある場合は、段階的なものを把握するために時間をかけてください!

+0

残念ながら、私は両方の答えに報いることはできません。私はあなたのものを受け入れ(より完全なものとして)、他の人に報酬を与える(最大の相対的貢献に対して) ありがとう! – Antonio

+0

ハハ、これはちょっと変わったことですが、理にかなっています。ありがとう! – codetaku

7

hereてください。

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

願っていれば、あなたが始めるのに十分です。私はどのようにポート古いコード(hereherehere)、 程度が、その後いくつかのリソースを見つけ

:リンクが存続しない場合


は、ここに全文転写産物でありますそれは私が必要なものではなかった私は自分のバージョンを書くことにしました。 だから、ここに行きます。

url_open()

この関数は、avio_openに変更されました。 url_close もavio_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に名前が変更されました()。 avformat_write_headerで置き換え

av_write_header()

()は、2つの引数 代わりのいずれかを受け入れること。古い関数に同じ の動作を取得するには、2番目の引数としてNULLを渡します。

av_codec_open()

この1)は(av_codec_open2で置換されています。置換関数 は、2つではなく3つの引数を受け取りますが、古い関数と同じ動作を得るには、NULLを第3の 引数として指定します。 avcodec_encode_audio2で置き換え

avcodec_encode_audio()

()。

av_set_parameters()

私はこの1つの代替を微ことができませんでした。まず、 この機能には置き換えがないことがわかりました。しかし、廃止されたにもかかわらずまだ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.

ガビが指摘するように、これらは

+0

よく目撃された! – Antonio