Я запускаю ffmpeg в контейнере докеров, и у меня возникла проблема.
У меня есть остроумная программа отладки (листинг ниже), которая просто открывает (и читает) test.mp4. Я открываю файл с помощью fopen (), читаю и распечатываю первые 32 байта. Значения совпадают и верны независимо от того, работает ли он в докере или локально. (т.е. файл доступен и доступен для чтения в контейнере докера) Однако, когда он попадает в avformat_open_input ():
Запуск локально: работает нормально. (а реальная программа его полностью декодирует)
Запуск в контейнере докера: вызов avformat_open_input () завершается ошибкой с AVERROR_INVALIDDATA. Это с test.mp4 в каталоге докеров.
Я немного заблудился. Ценю любые идеи.
Листинг тестовой программы: =========================================
#include <stdio.h>
extern "C" {
#include <libavformat/avformat.h>
}
int main (int argc, char **argv)
{
int erc=0;
AVFormatContext* srcFmtCtx = NULL;
const char* srcFile = "test.mp4";
// Simple read/echo
FILE *f = fopen(srcFile, "rb");
printf("fopen() %s 0x%lx\n", srcFile, (unsigned long)f);
for (int i=0; i<4; i++) {
long val;
erc = fread(&val, 1, sizeof(long), f);
printf("[%d]0x%lx ", i, val);
}
printf("\n");
fclose(f);
// Open source with ffmpeg libavformat utils
printf("avformat_open_input(): %s\n", srcFile);
if ((erc = avformat_open_input(&srcFmtCtx, srcFile, NULL, NULL)) < 0) {
printf("avformat_open_input(): Returned AvError: %d\n", erc);
exit(1);
}
printf("avformat_open_input(): Returned normally\n");
avformat_close_input(&srcFmtCtx);
}


Кажется, моя проблема связана с несоответствием версий.
Мой док-контейнер создает образ ubuntu: 18.10 (последний доступный)
Этот образ предоставляет ffmpeg v3.3.5 (или около того), libavformat v57.83.100
avformat_version(): 3756900 Ident: Lavf57.83.100
Моя локальная установка ffmpeg - v4.0, libavformat v58.12.100
avformat_version(): 3804260 Build: 3804260 Ident: Lavf58.12.100
Одно из важных различий между этими версиями состоит в том, что avformat :: av_register_all () устарел и больше не используется. Я основывал свой код на новых источниках, и мне не было этого звонка. Однако более старые версии libavformat требуют этого. Таким образом, сбой в контейнере докеров, а не в моей локальной среде.