Запись несжатого видео в формате AVI

#c #video

#c #Видео

Вопрос:

Есть ли какая-нибудь простая и небольшая библиотека или пример кода для записи несжатых видеофайлов avi на c ?
Каждый ресурс, который я нахожу, использует video для Windows, и мне нужно, чтобы это было переносимым.

Я попытался просмотреть документацию по контейнеру AVI, но она выглядит действительно громоздкой.

Ответ №1:

Я не делал этого сам, но я предлагаю использовать libavformat , часть ffmpeg (LGPLv2.1 / GPLv2 ).

Ответ №2:

Если вам нужно что-то очень простое, запишите BMP на диск в виде пронумерованной последовательности, затем вызовите ffmpeg via system() или что-то подобное, подобное этому:

 ffmpeg -i picture_%04d.bmp -r 15 -vcodec rawvideo -y output.avi
  

Примечание: -r аргумент указывает частоту кадров, которую вы хотите, чтобы конечный фильм был.

Вы могли бы добиться того же результата, вызвав библиотеки libavformat / libavcodec, на которых основан ffmpeg, но это может не соответствовать вашим требованиям «small» и «simple».

Комментарии:

1. С точки зрения производительности это приводит к огромным потерям из-за необходимости чтения / записи файлов. В типичных приложениях файловый ввод-вывод перевешивает стоимость любой алгоритмической обработки.

Ответ №3:

Всегда есть OpenCV, который является мультиплатформенным и в который относительно легко вставлять данные.

ИЛИ — вы всегда можете передать видеоданные в другой исполняемый файл.

Например, в unix вы можете сделать:

В вашей программе:

 char myimage[640*480*4];
// read data into myimage
fputs(myimage,1,640*480*4,stdout);
  

И в сценарии, который запускает вашу программу:

 ./myprogram | 
mencoder /dev/stdin -demuxer rawvideo -rawvideo w=640:h=480:fps=30:format=rgba 
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=9000000 
-oac copy -o output.avi
  

(Обратите внимание, что это действительно сжимает видео — несжатое — это просто вопрос изменения командной строки mencoder)

Я полагаю, вы также можете использовать ffmpeg таким образом или x264. Вы также можете запустить кодировщик из своей программы и выполнить запись в канал (что делает весь процесс таким же простым, как если бы вы использовали библиотеку) — и это должно работать на Windows, Linux или Mac (с небольшими изменениями в командной строке mencoder).

Очевидно, что проблем с лицензированием также нет (кроме распространения исполняемого файла mencoder), поскольку вы не ссылаетесь на какой-либо код или ничего не компилируете.

Хотя это не совсем то, что вы хотите, у него есть то преимущество, что для кодирования автоматически будет использоваться второй процессор.