PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ffmpeg Problem


tom_p_
30.07.2010, 09:26
Hallo,

ich habe ein Problem mit ffmpeg.Ich bin gerade dabei ein bestehendes Projekt um einen kleinen
Videoplayer zu erweitern. Programmierpsrache ist C/C++, wobei ffmpeg in C implementiert ist. Hierzu habe ich eine
Webseite gefunden, in der beschrieben wird, wie hierbei vorzugehen ist.
Es geht prinzipiell nur darum einen Videostrom abzugreifen und die einzelnen bilder einer bildverarbeitenden Applikation zur Verfügung zu
stellen. (http://dranger.com/ffmpeg/tutorial01.html)
Der Audiokanal kann also vollkommen vernachlässigt werden, da es sich um eine ComputerVision-Anwendung handelt.

Der im code ist eigentlich nur der rot markierte Teil relevant für meine Fragestellung - also lasst euch nicht vom Code abschrecken.


Ich benutze ffmpeg 0.60, welche ich zuvor heruntergeladen und dann
gebuildet habe.

Zum builden habe ich folgende Konfiguration parametrisiert:

./configure --enable-gpl --enable-version3 --enable-swscale

Dannach habe ich die erzeugten lib and headerfiles zu meinem Projekt
hinzugefügt. Hierbei handelt sich es um ein Qt-Projekt.

Anbei den Code, den ich hier verwende (im Prinzip ist das der Code von
der Webseite, in der beschrieben wird wie vorzugehen ist)



av_register_all();

//--- Open video file ---

if(av_open_input_file(&pFormatCtx, fileName.toLatin1(), NULL, 0, NULL) != 0)
{
//--- Couldn't open file ---
return -1;
}

//--- Retrieve stream information ---
if(av_find_stream_info(pFormatCtx) < 0)
{
//--- Couldn't find stream information ---
return -1;
}

//--- Dump information about file onto standard error ---
dump_format(this->pFormatCtx, 0, fileName.toLatin1(), 0);

int i;

//--- Find the first video stream ---
videoStream = -1;

for(i=0; i < pFormatCtx->nb_streams; i++)
{
if(pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO)
{

videoStream = i;
fprintf(stderr, "index %i !\n", i);
break;
}
}

if(videoStream == -1)
{

//--- Didn't find a video stream ---
return -1;
}

//--- Get a pointer to the codec context for the video stream ---

this->pCodecCtx = this->pFormatCtx->streams[videoStream]->codec;

//--- Find the decoder for the video stream ---

fprintf(stderr, "codecid %i\n", pCodecCtx->codec_id);

this->pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

if(this->pCodec == NULL)
{
fprintf(stderr, "Unsupported codec!\n");

return -1; //--- Codec not found ---
}



Wenn ich mein Programm starte erhalte ich folgende Ausgabe:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/pollok/Desktop/out-7.mp4':
Duration: 00:00:35.00, start: 0.000000, bitrate: 451 kb/s
Stream #0.0(und): Video: mpeg4, yuv420p, 320x240 [PAR 1:1 DAR 4:3],
15,00 tb(r)
Stream #0.1(und): Audio: libfaad, 48000 Hz, stereo
Unsupported codec!

Der codec soll angeblich nicht unterstützt sein. Wenn ich hingegen
ffplay verwende um das Video darzustellen funktioniert es ohne probleme.
Ich frage mich was ich hierbei falsch mache. Vielleicht ist es ja nur
eine Konfigurationssache beim builden von ffmpeg.

FFplay erzeugt folgende Ausgabe: (Das ist die Version, die schon auf dem
Linuxrechner vorinstalliert war)

FFplay version SVN-r13582, Copyright (c) 2003-2008 Fabrice Bellard, et al.
configuration: --prefix=/usr --libdir=${prefix}/lib
--shlibdir=${prefix}/lib --bindir=${prefix}/bin
--incdir=${prefix}/include/ffmpeg --enable-shared --enable-libmp3lame
--enable-gpl --enable-libfaad --mandir=${prefix}/share/man
--enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid
--enable-postproc --enable-libamr-nb --enable-libamr-wb --enable-x11grab
--enable-libgsm --enable-libx264 --enable-liba52 --enable-libtheora
--extra-cflags=-Wall -g -fPIC -DPIC --cc=ccache cc --enable-swscale
--enable-libdc1394 --enable-nonfree --disable-mmx --disable-stripping
--enable-avfilter --enable-libdirac --disable-decoder=libdirac
--enable-libschroedinger --disable-encoder=libschroedinger
--disable-altivec --disable-armv5te --disable-armv6 --disable-vis
libavutil version: 49.7.0
libavcodec version: 51.58.0
libavformat version: 52.16.0
libavdevice version: 52.0.0
libavfilter version: 0.0.0
built on May 3 2009 12:02:42, gcc: 4.3.2

Meine lib version, welche ich compiliert habe hat folgende Versionsnummern:
libavcodec.52.72.2
libavdevice.52.2.0
libavfilter.1.19.0
libavformat.52.64.2
libavutil.50.15.1
libpostproc.51.2.0
libswscale.0.11.0

Ich wäre über jede Hilfe sehr dankbar.


foobarflu
30.07.2010, 12:50
sieht prinzipiell ok aus... in deiner Ausgabe fehlt aber einiges.


fprintf(stderr, "codecid %i\n", pCodecCtx->codec_id);

Was ist denn die Ausgabe davon?

tom_p_
30.07.2010, 13:04
sieht prinzipiell ok aus... in deiner Ausgabe fehlt aber einiges.


fprintf(stderr, "codecid %i\n", pCodecCtx->codec_id);
Was ist denn die Ausgabe davon?

Hi erstmal danke für deine Unterstützung!

Die ausgabe davon ist 0 und 0 sollte für "CODEC_ID_NONE" stehen.

Ich habe das selbe auch mal auf meinem Laptop mit Ubuntu 10.4 laufen lassen - und da läuft es perfekt.

Was ich gerade auch noch für ein Problem habe ist folgendes. Wenn ich in das Verzeichnis wechsle, in der ich mein ffmpeg installiert habe (ich habe das mal testweise in einen ordner auf dem desktop installiert) und dort folgendes ausführe:

./ffmpeg

Dann erhalte ich folgende Ausgabe:


error while loading shared libraries: libavcodec.so.52: cannot open shared object file: No such file or directory


Wie kann ich das beheben? Ich muss dazu sagen dass ich erst auf Linux umgestiegen bin und deswegen mich noch nicht so gut auskenne.


Viele Grüße Tom

tom_p_
30.07.2010, 13:56
Hallo,

ich habe mein Problem umgangen aber nicht gelöst... also mich würde dennoch interessieren, wie ich das Problem vernünftig löse.

Umgangen habe ich es, indem ich die benötigten libs aus /usr/lib und die benötigten headers aus /usr/include kopiert habe. Es ffmpeg war bereits auf dem Linux vorhanden aber in einer älteren Version. Ich habe leider keine Rechte, schreibend auf diese Ordner zuzugreifen, darum hatte ich es zuvor in einen anderen Ordner gebuildet...

Also wie gesagt - falls sich jemand die Zeit nehmen möchte und mir sagen kann was ich zuvor falsch gemacht habe wäre ich sehr glücklich.

Beste Grüße,

Tom