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.
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.