Aby napisać prosty przykład korzystający z ffmpeg trzeba poznać podstawy API bibliotek libavcodec oraz libavformat. Dla początkującego użytkownika może okazać się problematyczna analiza techniczna dokumentacji i niuansów związanych z kodekami video. Dlatego skorzystamy z innej biblioteki, która zawiera wsparcie dla ffmpeg, a mianowicie CImg (ta mała biblioteka nie przestaje mnie zaskakiwać swoimi możliwościami).
Na początek musimy się upewnić, że mamy zainstalowany pakiet ffmpeg. Możemy wydać polecenie instalacji i jeśli go nie będzie zostanie pobrany i zainstalowany:
sudo apt-get install ffmpeg
Oczywiście będzie również potrzebny testowy film, który będziemy modyfikować. Ja korzystałem z Pixar "Yeti Dance" (Pixar-Yeti_Dance.mpeg).
Następnie przygotowujemy kod programu:
#include <iostream>
#include <ostream>
#include "../CImg.h"
using namespace std;
using namespace cimg_library;
void process_frame(CImg<unsigned char> &frame)
{
//negatyw obrazu
cimg_forXYV(frame,x,y,v) { frame(x,y,v) = 255 - frame(x,y,v); }
}
int main()
{
CImgList<unsigned char> film;
film.load_ffmpeg("Pixar-Yeti_Dance.mpeg"); //odczyt z pliku
CImgDisplay disp_film1, disp_film2;
cimglist_for(film,index) {
film[index].display(disp_film1); //wyświetl oryginalną klatkę
process_frame( film[index] ); //nakładanie filtru
film[index].display(disp_film2); //wyświetl zmodyfikowaną klatkę
}
while (!disp_film1.is_closed) disp_film1.wait();
film.save_ffmpeg("Pixar-Yeti_Dance-invert.mpeg"); //zapis
return 0;
}
Kompilacja za pomocą pomocą polecenia:
g++ -o ffmpeg_test ffmpeg_test.cpp -lX11 -lpthread
Po uruchomieniu programu zobaczymy na ekranie zarówno obraz oryginalny, jak i zmodyfikowany:
Omówiony przykład jest bardzo prosty i nie pokazuje pełnych możliwości ffmpeg. Jednak na etapie projektowania algorytmu wykorzystanie biblioteki CImg może znacznie ułatwić przygotowanie działającego prototypu.

0 komentarze:
Prześlij komentarz