2013-07-03 14 views
8

W tej chwili próbujemy zaktualizować wersję ffmpeg, z której korzysta nasz program. Skok jest duży, ponieważ do tej pory używaliśmy ffmpeg 0.8, a najnowsza wersja to 1.2.Obsługa zmiany interfejsu biblioteki ffmpeg podczas aktualizacji ffmpeg

W tych testach używam (daj mi powiedzieć) niesamowitych pakietów, które znajduję here.

Pierwszą rzeczą, którą próbowałem pobrać i skompilować z ffmpeg 1.2, i oczywiście dostałem dużo ostrzeżeń i błędów, o funkcjach i zmiennych przestarzałych lub nie istniejących już.

Aby wygładzić przejście, próbowałem następnie zbudować na bazie ffmpeg 1.0, najbliższej wyższej wersji w stosunku do 0.8. Mam listę ostrzeżeń i błędów, które wymienię tutaj poniżej.

Moje pytanie jest następujące: Czy istnieje jakikolwiek przewodnik, który pomoże w tych przejściach, aby przekonwertować stare połączenia paradygmatów/funkcji ffmpeg w nowej wersji? Ponieważ mówimy o wielu kodach, których nie pisałem i nie chciałbym analizować linii po linii, byłbym bardzo szczęśliwy, gdyby możliwe było nawrócenie starych wywołań funkcji jeden do jednego. do nowych wywołań funkcji, tak samo dla zmiennych.

Oto lista ostrzeżeń i błędów (mam czyścić go więc jest tylko jedna pozycja za błędu/ostrzeżenia)

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:

Biorę okiem w tych ...
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

Zobacz również [Zmiany interfejsu API] (http://git.videolan.org/?p=ffmpeg.git;ablbl;f=doc/APIchanges). – LordNeckbeard

Odpowiedz

6

Gabi zwraca uwagę, że adres URL ma większość zamienników tych nieaktualnych stałych.

jednak brakuje mu kilka z nich, więc będę pisać wszystkie zmiany, że wyjście sygnalizacji są konieczne, aby przejść przez ten etap kompilacji:

avcodec_init -> avcodec_register_all 
av_open_input_file -> avformat_open_input 

to chyba warto zauważyć tutaj, że av_set_parameters została zaniechana i całkowicie zeskanowane, więc powinieneś teraz określić parametry w wywołaniu 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 

Powinno to obejmować wszystkie rzeczywiste błędy. Jeśli pojawi się tylko ostrzeżenie, poświęć trochę czasu, aby dowiedzieć się, co robią!

+0

Niestety, nie mogę nagrodzić obu odpowiedzi. Przyjmę twoje (jako bardziej kompletne) i nagrodzę drugiego (za największy względny wkład) Wielkie dzięki! – Antonio

+0

Hahah, to trochę niekonwencjonalne, ale ma sens. Dzięki! – codetaku

7

Spójrz here.

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

Mam nadzieję, że powyższe informacje wystarczą do rozpoczęcia pracy.


W przypadku, gdy związek nie przetrwa, tutaj jest pełny zapis tekstu:

Znalazłem kilka zasobów dotyczących sposobu portu starego kodu (here, here i here), ale ponieważ to nie było to, czego potrzebowałem, postanowiłem napisać własną wersję. Więc, zaczynamy.

url_open()

Funkcja ta została zmieniona na avio_open. Istnieje również url_close , którego nazwa została zmieniona na avio_close. Te informacje znalazłem tutaj.

av_new_stream()

Funkcja ta jest nadal obsługiwany od FFMPEG 1.0.1 ale jest oznaczony jako przestarzałe.Zostanie on zastąpiony przez avformat_new_stream(). Załóżmy że stary kod:

AVStream *st = av_new_stream(oc, i); 

zmodyfikowany kod powinien być:

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

Należy uważać, by sprawdzić najpierw, że nie jest NULL st!

dump_format()

Funkcja ta została zmieniona na av_dump_format().

av_write_header()

Zastąpiono avformat_write_header(), które przyjmuje dwa argumenty zamiast jednego. Przekaż NULL jako drugi argument, aby uzyskać identyczne zachowanie ze starą funkcją.

av_codec_open()

Ten otrzymuje się av_codec_open2(). Funkcja zamienna przyjmuje trzy argumenty zamiast dwóch, ale ustawia NULL jako trzeci argument , aby uzyskać takie samo zachowanie, jak poprzednia funkcja.

avcodec_encode_audio()

Zastąpiono avcodec_encode_audio2().

av_set_parameters()

nie mogłem precyzyjnie wymiany dla tego jednego. Po pierwsze, stwierdziłem, że ta funkcja nie ma zastępowania. Ale był wtedy, gdy był jeszcze dostępny w wersji FFMPEG, mimo że był przestarzały. Następnie usunęli go, , a zatem musi on zostać wymieniony. W niektórych miejscach stwierdziłem, że tylko je wyłączyło, na innych, że jego parametry muszą zostać przekazane do avformat_write_header. W końcu zrezygnowałem, ponieważ na razie nie potrzebowałem już działającej wersji tej części kodu. Ponieważ w moim przypadku wywoływane jest avformat_alloc_context(), a następnie av_set_parameters(), ostatnie to, na co patrzyłem, to wywołanie avformat_alloc_output_context2() zamiast avformat_alloc_context(). Ale zmiana nie jest trywialna, więc I pominąłem to.

SampleFormat

Ten enum został przemianowany AVSampleFormat.

URL_WRONLY

Stała ta została zastąpiona AVIO_FLAG_WRITE.

SAMPLE_FMT_U8, SAMPLE_FMT_S16, SAMPLE_FMT_S32, etc.

Ci są poprzedzone teraz z AV_, więc używaj AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16 itd

+0

Dobrze nakrapiany !!! – Antonio