Я никогда не использовал ffmpeg на своем ноутбуке.На работе все нормально, но здесь я столкнулся с ужасной проблемой: библиотека работает, но беспомощно :) Ubuntu 18.04, ffmpeg 4.1 (скачанные исходники, ./configure, make, sudo make install), вроде бы все нормально.
Приложение возвращает: файл /home/ahlininv/Desktop/video_example.mp4 кодируется с помощью '' кодека, w = 0, h = 0
Я запустил его в отладчике.Если я установлю формат на ноль, указатель изменится после вызова avformat_open_input (& format, file, 0, & dict) , поэтому он работает и, возможно, работает правильно.
Возможно, это играет любую роль, которую компилятор говорит, что av_register_all, avcodec_register_all устарели, но я подумал, что это не является существенной проблемой.
Я пытался изменить версию ffmpeg (пробовалустановить его с помощью apt-get, версия 3.somenumber доступна), ничего не изменилось.
Я попытался запустить другой видеофайл (.avi), тоже ничего не изменилось.
Ребята, помогите =) Как правильно получить информацию об этом файле?
main.cpp:
#include "filereader.h"
int main(int argc, char** argv) {
std::string filename = "/home/ahlininv/Desktop/video_example.mp4";
std::string codec;
int w, h;
bool open_ok = get_file_info(filename.c_str(), codec, w, h);
if (!open_ok) {
std::cout << "Failed to open file" << "\n";
return 1;
}
std::cout << "File " << filename << " is encoded with '" << codec << "' codec, w = " << w << ", h = " << h << "\n";
return 0;
}
filereader.h:
#ifndef FILEREADER_H
#define FILEREADER_H
#include <string>
#include <iostream>
extern "C" {
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include "libavcodec/avcodec.h"
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
}
bool get_file_info(const char* file, std::string& codec, int& w, int& h);
#endif // FILEREADER_H
filereader.cpp
#include "filereader.h"
bool get_file_info(const char* file, std::string& codec, int& w, int& h)
{
codec = "";
w = h = 0;
av_register_all();
avcodec_register_all();
AVDictionary* dict = 0;
AVFormatContext* format = avformat_alloc_context();
char errbuf[256];
int r = avformat_open_input(&format, file, 0, &dict);
if (r!=0){
av_strerror(r, errbuf, sizeof(errbuf));
std::cout << "avformat_open_input error: " << errbuf << "\n";
}
if (r == AVERROR(EIO) || r == AVERROR(ENOEXEC) || !format)
return false;
for (size_t c = 0; c < format->nb_streams; ++c)
{
if (format->streams[c]->codecpar && format->streams[c]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
{
if (format->streams[c]->codecpar->codec_id != AV_CODEC_ID_NONE &&
format->streams[c]->codecpar->codec_id != AV_CODEC_ID_RAWVIDEO)
{
w = format->streams[c]->codecpar->width;
h = format->streams[c]->codecpar->height;
codec = avcodec_get_name(format->streams[c]->codecpar->codec_id);
}
}
}
avformat_close_input(&format);
return true;
}
Компиляция:
g++ -o filereader main.cpp filereader.cpp -lavutil -lavformat -lavcodec -lavdevice -lz -lm -pthread -lswresample -lm -lz -I /usr/local/include/ -Wl,-rpath /usr/lib/x86_64-linux-gnu/