2010-11-03 15 views
6

Ho recentemente provato ad aggiornare le librerie ffmpeg che utilizzo nella mia applicazione Mac OS X scaricando e compilando ffmpeg dal sorgente.problema di compilazione ffmpeg: avcodec_find_decoder restituisce sempre null

Il mio codice funziona correttamente con le librerie precompilate della stessa versione su Windows. Su Mac OS X, la libreria sembra funzionare (può aprire il file e trovare gli stream e i codec utilizzati), ma quando arriva a avcodec_find_decoder, questa funzione restituisce sempre null.

Il codice ha lavorato con una versione precedente della libreria (compilato un anno fa su Mac OS X 10.5)

ho configurato fmpeg utilizzando

./configure --extra-cflags="-arch i386" --extra-ldflags='-arch i386' --arch=x86_32 --target-os=darwin --enable-cross-compile --disable-indev=jack --enable-shared --disable-static 

ho controllato config.mak, e sembra per avere i decodificatori per i tipi di file che ho provato abilitati (ogg, vorbis, avi, mkv, ...) Ho anche verificato che i file di intestazione corretti siano stati usati e che la libreria appena compilata sia usata.

ho trovato solo alcuni post precedenti relativi a questo problema, ma senza alcuna soluzione:

http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2007-January/021399.html

http://libav-users.943685.n4.nabble.com/avcodec-find-decoder-problem-td944800.html

Edit: il controllo più ulteriormente, appare av_codec_next (NULL) restituisce null come pure , il che significa che non c'è un singolo codec disponibile, o che first_avcodec in utils.c non è impostato (in realtà non ho trovato affatto dove è impostata questa variabile, avrei assunto av_register_all, ma non riesco a trovarlo lì)

risposta

7

Ho trovato una soluzione per il mio problema, anche se sarei ancora interessato se qualcuno mi può aiutare con una spiegazione del mio problema.

Fondamentalmente, stavo chiamando av_register_all() nella parte superiore della mia funzione. Ora, dopo aver aggiunto avcodec_register_all(), il mio codice funziona di nuovo. Non capisco perché, però, perché avcodec_register_all() dovrebbe essere chiamato da av_register_all() guardando il codice sorgente.

Vedere http://www.ffmpeg.org/doxygen/trunk/allformats_8c-source.html#l00039 per il codice sorgente

0

in av_register_all():

static int initialized; 
if (initialized) 
    return; 
initialized = 1; 
avcodec_register_all(); 

Forse a causa di alcuni fattori inosservato, la static int variabile "inizializzata" è stata inizializzata mentre l'avcodec non è stato registrato ... Quindi dovremmo chiamare avcodec_register_all() per eseguirlo esplicitamente. Ma sono incline a pensare che sia un bug in ffmpeg.

+0

Sembra davvero un bug. Non penso che lo standard c garantisca che l'inizializzazione sarà 0? So static int initialized = 0; sarebbe il modo corretto per farlo. – Adion

+0

@Adion Sì, lo standard C inizializza le variabili int statiche su zeri se non vengono inizializzati in modo esplicito. Tuttavia, [qui] (http://stackoverflow.com/questions/1294772/does-gcc-automatically-initialize-static-variables-to-zero) dice di più ... – Daniel

+0

Ok, in realtà non sto più chiamando avcodec_register_all(), quindi qualunque cosa fosse sbagliata sembra essere stata fissata nei 5 anni da quando ho posto la domanda. – Adion

Problemi correlati