How to get stream information from an open file in ffmpeg?

I am trying to read a video file using ffmpeg. I had a working code that corresponded to several old versions, and started trying and updating to the latest version of the assembly, exchanging all these obsolete functions for their actual counterparts.

However, I ran into a problem. It seems that no streams are being retrieved, and the video loading stops on the tracks.

here is the code i use:

// Open video file if(avformat_open_input(&pFormatCtx, filename.toStdString().c_str(), NULL, NULL)!=0) return FILE_NOT_OPENED; // Couldn't open file // Retrieve stream information if(avformat_find_stream_info(pFormatCtx,NULL)<0) return NO_STREAM_INFO; // Couldn't find stream information // Dump information about file onto standard error av_dump_format(pFormatCtx, 0, filename.toStdString().c_str(), false); // Find the first video stream videoStream=-1; for(unsigned i=0; i<pFormatCtx->nb_streams; i++) if(pFormatCtx->streams[i]->codec->codec_type==ffmpeg::AVMEDIA_TYPE_VIDEO) { videoStream=i; break; } if(videoStream==-1) return OTHER; // Didn't find a video stream // Get a pointer to the codec context for the video stream pCodecCtx=pFormatCtx->streams[videoStream]->codec; // Find the decoder for the video stream pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) return CODEC_NOT_FOUND; // Codec not found // Open codec if(avcodec_open2(pCodecCtx, pCodec,NULL)<0) return CODEC_NOT_OPENED; // Could not open codec 

The problem occurs in the loop through the video streams in ffmpeg::AVFormatContext *pFormatCtx . The nb_streams field is 0, and I never enter the loop, and the codec does not load, etc. Strange, av_dump_format gives the following result:

 License: GPL version 3 or later AVCodec version 3606372 AVFormat configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib [asf @ 004e9540] Stream #0: not enough frames to estimate rate; consider increasing probesize Input #0, asf, from 'C:/Users/Public/Videos/Sample Videos/Wildlife.wmv': Metadata: SfOriginalFPS : 299700 WMFSDKVersion : 11.0.6001.7000 WMFSDKNeeded : 0.0.0.0000 comment : Footage: Small World Productions, Inc; Tourism New Zealand | Producer: Gary F. Spradling | Music: Steve Ball title : Wildlife in HD copyright : © 2008 Microsoft Corporation IsVBR : 0 DeviceConformanceTemplate: AP@L3 Duration: 00:00:30.09, start: 0.000000, bitrate: 6977 kb/s Stream #0:0(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, 2 channels, fltp, 192 kb/s Stream #0:1(eng): Video: vc1 (Advanced) (WVC1 / 0x31435657), yuv420p, 1280x720, 5942 kb/s, 29.97 tbr, 1k tbn, 1k tbc 

and there are 2 streams, clear as a day.

I am completely puzzled. Please, help.

+4
source share
1 answer

If av_dump_format works, but nb_streams is zero in your code, you have inappropriate libraries and headers, I think.

av_dump_format also relies on nb_streams , as seen in its source. So the binary code you used for av_dump_format can read nb_streams . You are probably using a precompiled static or dynamic avformat library that does not match your version of the avformat.h header. Thus, your code may look, for example, in nb_streams in the wrong place or type.

Make sure you use the header files that exactly match those used to create the library binaries.

+5
source

Source: https://habr.com/ru/post/1482520/


All Articles