2013-07-03 21 views
8

Wir versuchen derzeit, die von unserem Programm verwendete ffmpeg-Version zu aktualisieren. Der Sprung ist groß, denn was wir bisher benutzt haben, ist ffmpeg 0.8, und die neueste Version ist 1.2.Handhabung der ffmpeg-Bibliotheksschnittstelle Änderung beim Aktualisieren von ffmpeg

In diesen Tests verwende ich die (sagen wir) erstaunliche Pakete, die ich finde here.

Als erstes habe ich versucht, gegen ffmpeg 1.2 zu downloaden und zu bauen, und natürlich habe ich viele Warnungen und Fehler, über Funktion und Variablen veraltet oder nicht mehr vorhanden.

Um den Übergang zu glätten, versuchte ich dann gegen ffmpeg 1.0, die nächst höhere Version in Bezug auf 0,8 aufzubauen. Ich habe eine Liste mit Warnungen und Fehlern erhalten, die ich hier unten auflistet.

Meine Frage ist die folgende: Gibt es eine Anleitung, um in diesen Übergang zu helfen, alte ffmpeg Paradigmen/Funktionen Anrufe in der neuen Version zu konvertieren? Da wir über eine Menge Code sprechen, den ich nicht geschrieben habe und den ich nicht Zeile für Zeile analysieren möchte, wäre ich sehr froh, wenn es möglich wäre, eine Eins-zu-Eins-Konvertierung von alten Funktionsaufrufen durchzuführen zu neuen Funktionsaufrufen, gleich für Variablen.

Hier ist die Liste der Warnungen und Fehler ist (ich habe es gereinigt, so gibt es nur einen Eintrag pro Fehler/Warnung)

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 


Edit:

ich einen Blick nehme auf diese ...
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.2/deprecated.html
http://ffmpeg.org/doxygen/trunk/deprecated.html

+0

Siehe auch [APIchanges] (http://git.videolan.org/?p=ffmpeg.git;a=blob;f=doc/APIchanges). – LordNeckbeard

Antwort

6

Als Gabi weist darauf hin, dass URL meisten der Ersatz der veralteten Konstanten hat.

Allerdings fehlt es ein paar von ihnen, also werde ich alle Änderungen veröffentlichen, die die Ausgabe notwendig sind, um zeigt durch diese Zusammenstellung Schritt zu erhalten:

avcodec_init -> avcodec_register_all 
av_open_input_file -> avformat_open_input 

Es ist wahrscheinlich erwähnenswert, dass av_set_parameters veraltet wurde und komplett verschrottet, sollten Sie jetzt Parameter im Aufruf von avformat_open_input angeben.

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 

Das sollte alle Ihre tatsächlichen Fehler abdecken. Wenn es nur eine Warnung gibt, dann nehmen Sie sich etwas Zeit, um herauszufinden, was sie gerade einführen!

+0

Ich kann leider beide Antworten nicht belohnen. Ich werde deine akzeptieren (als vollständiger) und belohne die andere (für den größten relativen Beitrag) Vielen Dank! – Antonio

+0

Hahah, das ist ein bisschen unkonventionell, macht aber Sinn. Vielen Dank! – codetaku

7

Werfen Sie einen Blick here.

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

Hoffe, das oben genannte ist genug, um Sie zu beginnen.


Falls der Link hier nicht überleben, ist der vollständige Text-Transkript:

ich einige Ressourcen, wie zum Hafen alten Code (here, here und here) gefunden, aber da Es war nicht das, was ich brauchte. Ich beschloss, meine eigene Version zu schreiben. Also, hier gehen wir.

url_open()

Diese Funktion avio_open geändert wurde. Es gibt auch url_close , die in avio_close umbenannt wird. Diese Information habe ich hier gefunden.

av_new_stream()

Diese Funktion ist immer noch als von FFMPEG 1.0.1 unterstützt, aber es ist markiert als veraltet.Es wird durch avformat_new_stream() ersetzt. Angenommen , dass der alte Code war:

AVStream *st = av_new_stream(oc, i); 

der modifizierte Code sein sollte:

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

Vorsicht zuerst zu prüfen, ob st nicht NULL ist!

dump_format()

Diese Funktion av_dump_format umbenannt wurde().

av_write_header()

mit avformat_write_header ersetzt werden(), das zwei Argumente nimmt statt einer. Übergeben Sie NULL als zweites Argument, um das identische Verhalten mit der alten Funktion zu erhalten.

av_codec_open()

Dieser ist mit av_codec_open2() ersetzt. Die Ersetzungsfunktion akzeptiert drei Argumente anstelle von zwei, aber NULL als drittes Argument , um das gleiche Verhalten wie die alte Funktion zu erhalten.

avcodec_encode_audio()

mit avcodec_encode_audio2 ersetzt werden().

av_set_parameters()

Ich konnte nicht den Ersatz für diese eine Fein. Zuerst habe ich festgestellt, dass diese Funktion keinen Ersatz hat. Aber es war, als es immer noch in FFMPEG verfügbar war, obwohl veraltet. Dann haben sie es entfernt, und so muss es Ersatz haben. An bestimmten Stellen habe ich festgestellt, dass sie nur deaktiviert, bei anderen, dass ihre Parameter an avformat_write_header übergeben werden müssen. Am Ende gab ich auf, weil ich Arbeitsversion dieses Teils des Codes für jetzt nicht brauchte. Da in meinem Fall avformat_alloc_context() aufgerufen wird und dann av_set_parameters(), zuletzt was ich sah, war avformat_alloc_output_context2() statt von avformat_alloc_context(). Aber die Änderung ist nicht trivial, also habe ich es übersprungen.

SampleFormat

dieser Enum wurde AVSampleFormat umbenannt.

URL_WRONLY

Diese Konstante wurde mit AVIO_FLAG_WRITE ersetzt.

SAMPLE_FMT_U8, SAMPLE_FMT_S16, SAMPLE_FMT_S32, etc.

Diese sind mit AV_ voran jetzt, so verwenden AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16 usw.

+0

Gut entdeckt !!! – Antonio

Verwandte Themen