W tym artykule postaram się omówić najważniejsze kwestie związane z odtwarzaniem, przetwarzaniem oraz edycją różnego typu danych multimedialnych (grafika, dźwięk i wideo).
W programowaniu współczesnych gier bardzo istotnym elementem jest obsługa grafiki (zazwyczaj 3D aczkolwiek nadal można spotkać i zapewne zawsze będzie liczna grupa gier 2D). Rzadko graficzna część gry tworzona jest od podstaw z bezpośrednim wykorzystaniem mechanizmów takich jak OpenGL. Najczęściej gry korzystają z silników gier zawierających silniki graficzne lub bezpośrednio z tych drugich.
Silnik gry różni się od silnika graficznego tym że dostarcza także mechanizmów służących do implementacji fizyki świata gry (w tym wykrywania kolizji), sztucznej inteligencji, obsługi wejścia (sterowania), dźwięku i sieci. Silnik graficzny dostarcza natomiast tylko wygodnych mechanizmów operowania obiektami graficznymi, maskując niżej poziomowe interfejsy takie jak SDL, czy jeszcze bardziej niskopoziomowy i ograniczony tylko do grafiki OpenGL. Wspomniany OpenGL jest API do obsługi grafiki 3D, najczęściej stosowany jest w zastosowaniach profesjonalnych, ale niekiedy także w grach - ze względu na otwartość specyfikacji oraz dostępność na wiele platform - zwłaszcza w grach z rodziny FLOSS). SDL jest z kolei biblioteką programistyczną zwalniającą programistę z konieczności operowania suchym OpenGL i jemu podobnymi mechanizmami, jednak jest dość niskopoziomowy i nie jest określany mianem silnika graficznego czy też silnika gry (dostarcza jednak mechanizmów obsługi wejścia itp).
Jednym z głównych zadań silnika graficznego jest robienie cullingu celem ograniczenia ilości geometrii ładowanej do potoku graficznego, pociąga to za sobą mechanizmy zarządzania przestrzennego sceną. Ponadto silniki muszą zarządzać samymi obiektami, ich ładowaniem oraz ustawianiem wymaganych przez nie parametrów potoku (w tym ładowaniem wymaganych shaderów). Z kolei podstawowym zadaniem silników fizycznych jest realizacja wykrywania kolizji. Na ogół do obu tych mechanizmów korzysta się z brył ograniczających. W grafice 3D często wykorzystuje się tekstury do innych niż standardowe zastosowań (np. przechowywania map oświetlenia).
Do najbardziej zaawansowanych projektów silników na wolnych licencjach należą: Irrlicht (licencja typu BSD), OGRE (LGPL), Crystal Space (LGPL). Dość bogatą bazę silników (w tym tych z rodziny FLOSS) można przeglądać na devmaster.
Zobacz też: przykładowe programy multimedialne w C/C++ (w tym związane z grafiką 3D), podstawa silnika 3d, mój pomysł na silnik gry, portal o programowaniu gier, edytor shaderów dla KDE (łatka ułatwiająca kompilację w Debianie).
Przeglądarki multimedialne i odtwarzacze audio/video są programami służącymi do wyświetlania / odtworzania plików w wielu formatach, odtwarzacze potrafią zapisywać tak zwane "playlisty" czyli listy plików które mają odtwarzać, przeglądarki oferują tworzenie podglądów katalogów, przeglądać w trybie pokazu slajdów oraz dokonywać prostych modyfikacji plików graficznych i zmian formatu zapisu.
Programy do edycji graficzne dzielimy zasadniczo na trzy typy - programy do tworzenia grafiki rastrowej, grafiki wektorowej i animacji. Grafikę rastrową używa się do obrazków o nieregularnych kształtach, zdjęć, ..., umożliwia ona stosowanie licznych filtrów i efektów, w śród programów do jej edycji trzeba wymienić słynnego Gimpa. Z kolei podstawową zaletą grafiki wektorowej jest niezmienność jakości przy powiększaniu oraz zdolność do opisywania struktury (linia jest obiektem, a nie tylko zbiorem punktów), dlatego grafika ta jest używana głownie do tworzenia symboli i log oraz schematów. Z kolei animacje tworzone są jako sekwencyjnie wyświetlane pliki graficzne (z ewentualnymi efektami przejścia).
convert, identify, animate, ...Programy te umożliwiają obróbkę i montaż cyfrowego wideo wraz z jego ścieżką audio, dodawanie efektów przejść, elementów animacji, a także kompresję i konwersję między formatami. posiadają również moduł umożliwiający przechwytywanie wideo (jego ucyfrawianie).
Oprogramowanie to umożliwia montaż, doadawanie efektów, konwersję i kompresję oraz przechwytywanie audio.
arecord -fcd `date +"%F_%T.wav"` zapisze wybrane w mikserze źródło przechwytywania do pliku w jakości CDCinelerra jest programem do montażu wideo, umożliwia składanie filmu, dodawanie efektów itp. W przypadku problemów z uruchamianiem (biblioteki) polecam sprawdzenie wersji bibliotek faad i faac (najlepiej stosować z tego samego źródła co sama cinelerra).
1) zaznaczamy interesujący nas fragment (w oknie głównym)
2) w menu prawego przycisku myszy wybieramy Attach effect
3) jego ustawienia znajdziemy w tym menu pod pozycją Show
Wstawiamy je przeciągając wybrany efekt z okna efektów do okna głównego i umieszczając na połączeniu dwóch fragmentów. W menu prawego przycisku myszy mamy czas trwania i ustawienia.
Należy przewinąć film do początku (eksport zaczyna się od aktualnego czasu) następnie File -> Render ... . Polecam ustawić "File Format" na RawDV oraz "Insertion strategy" na "Insert nothing" (nie testowałem ustawień z eksportem audio).
wydzielenie ścieżki audio z pliku wideo:
tcextract -a 0 -i "IN.avi" -x mp3 > OUT.mp3
docinanie plików audio (program wywala sie przy generowaniu ostatniego pliku ale to niewielka przeszkoda):
tcmp3cut -i 1.mp3 -o 1a.mp3 -t 330000,1725999 -d 0
nagrywanie audio:
rec -t ogg -d /dev/dsp OUT.ogg (oczywiscie najpier ustawic odpowiednio pierwsze wejscie w mixerze ...)
łączenie plików audio (mp3):
mp3wrap all.mp3 1.mp3 2.mp3 3.mp3 4.mp3
poprawianie pliku mp3: (metoda brutalna ale skuteczna ...)
lame --decode all_MP3WRAP.mp3 ; lame -b64 -h all_MP3WRAP.mp3.wav
docinanie plików wideo:
avisplit -i IN.avi -o OUT.avi -t 00:05:30-43175
odzyskanie informacji o długosci filmu:
aviindex -i broken.avi -n -o broken.idx; avimerge -x broken.idx -i broken.avi -o fixed.avi
w przypadku problemow z audio warto z orginalu wydzielic sciezke audio a nastepnie polaczyc poprawione video i wydzielone uprzednio audio
kodowanie xvid:
pierwszy przebieg:
transcode -i IN.avi -o TMP.avi -y xvid4 -R
pierwdrugi przebieg:
transcode -i TMP.avi -o OUT.avi -y xvid4 -R 2 -w 3500,25,100 -avi_limit 4000
łączenie plików wideo i pliku audio ze sobą:
avimerge -i 1.avi 2.avi 3.avi 4.avi -p all_MP3WRAP.mp3.wav.mp3 -o calosc.avi -A 0
poprawianie pliku wideo dla dźwięku:
transcode -i calosc_video.avi -P 1 -x avi,null -y raw,null -o calosc.avi -c 0-140831 (uwaga: transcode ma problem z autodetekcją typu pliku gdy podany parametr -p)
przekodowanie tylko ścieżki audio: (bez ruszania wizji)
transcode -i IN.avi -P 1 -b 56 -s 4 -o OUT.avi -y raw
Zobacz w Sieci: Linux i edycja dźwięku, Nagrywanie i edycja dźwięku w Linuksie, scalanie napisów z filmem
Uruchomienie karty telewizyjnej wymaga zapoznania się z listą obsługiwanych kart i tunerów, odnalezienia na niej posiadanej pozycji bądź pozycji zbliżonej a następnie załadowaniu odpowiedniego modułu z odpowiednimi parametrami. W moim wypadku (karta PV-BT878P+ rev.2F z tunerem TPI8PSB02P) słuszne okazało się modprobe bttv card=138 tuner=28 pll=1 radio=1. Następnie możemy przystąpić do konfiguracji programu do odbioru telewizji / radia (np. xawtv, fbtv); przykładowy plik z konfiguracją dla AsterCity (nazwy niektórych kanałów mogą być nieaktualne) - .xawtv (jeżeli istnieje /etc/xawtv radzę zarchiwizować i skasować). Przy karcie graficznej nvidii spotkałem się z problemem polegającym na niewyświetlaniu obrazu przez xawtv - rozwiązaniem okazało się xawtv -noxv (aby ustalić ten parametr jako domyślny należy do pliku ~/.Xdefaults dodać "xawtv.xv: no").
Do nagrywania cyfrowego wideo polecam program "transcode" (niestety nie ma go w oficjalnym Debianie) z następującymi parametrami transcode -i /dev/video0 -p /dev/dsp0 -g 768x576 -b 64 -e 16000,16,1 -o "$1" -x v4l -y xvid4 -R 1 -avi_limit 2048 (rejestruje to obraz w najlepszej możliwej w PALu jakości). Wcześniej przy pomocy ulubionego programu nastawiamy żądaną stację, przy poprawnej pracy dysku i nie oglądaniu zwartości katalogu w którym są zapisywane pliki nie powinno gubić klatek.
Niekiedy na nagraniach w maksymalnej rozdzielczości PAL pojawia się problem przekłamanych linii (wynika to z emisji w PALu jednej klatki obrazu w postaci dwóch półklatek wyświetlanych jako jednej) warto wtedy w VLC z menu Stettings wybrać Prefernces - General settings - Obraz i ustawić Video filter module na "Deinterlacing video filter" (następnie zrestartować vlc).
Zamieszczam również skrypt ułatwiający nagrywanie wideo - magnetowid.sh. Zobacz tez w Sieci: Television with Linux
Wspomniany już VLC umożliwia także przechwytywanie i wysyłanie w sieć IP sygnału audio-wideo z naszej karty TV (oraz z pewnym wspomaganiem (program radio służący do nastrojenia odbiornika) także sygnału audio z tunera radiowego). Zamieszczam tutaj skrypt ułatwiający taką operację (składnia vlc służąca do tego nie jest łatwa i przyjemna, a wtaki sposób łatwiej wprowadzać parametry takie jak np. kanał.
Niekiedy można spotkać się z problemem polegającym na braku sprzętowego sprzężenia wejścia liniowego z wyjściem głośnikowym - problem ten może rozwiązać program kopiujący wejście na wyjście karty dźwiękowej (wersja alsa), (wersja oss) oraz skrypt dla KDE uruchamiający cały zestaw aplikacji do słuchania radia / oglądania telewizji.
Na koniec warto wspomnieć także o programie alevt, który umożliwia softwerowe dekodowanie teletextu (telegazety) z karty obsługiwanej przez bttv: alevt -vbi /dev/vbi0 -charset latin-2.
Z serwera dźwięku KDE potrafią korzystać też liczne programy nie stworzone specjalnie dla tego środowiska (jak VLC, XMMS, ...), aby było to możliwe konieczne jest zainstalowanie do nich wtyczki dla systemu dźwiękowego "arts" oraz wybranie tego systemu jako wyjścia dźwięku. Ma to tę zaletę że programy te nie blokują sobie wtedy wzajemnie oraz serwerowi dźwięku KDE dostępu do urządzenia dźwiękowego (co ma miejsce przy korzystaniu z /dev/dsp). Jeżeli korzystamy z sterowników alsa możemy pokusić się o wykorzystanie miksera wbudowanego w ten system dźwięku (dmix) do miksowania dźwięków z serwera arts oraz innych programów (jest to działanie domyślne tego sterownika). ALSA umożliwia także bardziej dziwne sztuczki z karta dźwiękową jak np. zamiana kanałów (np. prawego z lewym lub głośników tylnych z przednimi) - tutaj zamieszczam przykład stosownego pliku konfiguracyjnego. Jeżeli mamy więcej niż 1 kartę dźwiękową warto zainteresować się parametrem modułów alsy index=, odpowiedzialnym za ustalanie kolejności kart w systemie.
Nie rzadko okazuje się iż możliwości konfiguracyjne alsy (asound.conf) czy też artsd są niewystarczające wtedy warto zainteresować się PulseAudio lub nawet jack. PulseAudio jest dość prostym serwerem dźwięku, jego dużą zaletą jest zaawansowany mixer (pavucontrol) umożliwiający regulacją parametrów niezależnie dla każdego podłączonego do serwera procesu. Przy jego uruchamianiu należy zwrócić uwagę na przynależność użytkownika do którego należą klienci do odpowiednich grup na których operuje serwer. Niestety nawet pomimo chyba pomyślnego odpalenia serwera z priorytetem RT (co samo w sobie też nie jest łatwe) wyraźnie zauważalne było rwanie się dźwięku.
Zdecydowanie lepszym rozwiązaniem jest stosowanie serwera JACK. Serwer ten pozwala na swobodne aranżowanie ścieżki którą przechodzi sygnał audio, dzięki czemu możliwe jest podłączenie mixera czy nawet procesora efektów pod wybrany program lub pod całość systemu. Serwer odpalony z priorytetem czasu rzeczywistego daje bardzo dobre efekty. Najprostszą metodą odpalenia jackd z szeregowaniem czasu rzeczywistego (jak dla mnie szybszą w wdrożeniu, pewniejszą, itd od zabaw z /etc/security/limits.conf), tak aby jednocześnie działał na koncie i grupie jakiegoś użytkownika (aby można było się do niego podłączać) jest użycie następującego wrapper'a (musi mieć ustawiony SETUID na root lub być odpalany z root'a):
#include <sched.h>
#include <sys/resource.h>
#include <sys/types.h>
#include <errno.h>
#define UID 1000
#define GID 1000
int main () {
pid_t pid;
struct sched_param sp;
pid = getpid();
sp.sched_priority = sched_get_priority_max(SCHED_FIFO) -30;
if ( sched_setscheduler(pid, SCHED_RR, &sp) ) {
perror("Blad uzyskania szeregowania RT");
return -1;
}
setresgid(GID, GID, GID);
setresuid(UID, UID, UID);
execlp("jackd", "jackd", "-dalsa", "-dhw", 0);
}
Przy korzystaniu z serwera jack warto zainteresować się aplikacjami takimi jak: qjackctl (graficzny manager połączeń kanałów audio), jamin (regulator), jackeq (regulator), jack-rack (zbiór efektów itp). Możliwe jest także wymuszenie kierowania audio z programów nie potrafiących korzystać z jakcd do niego za pomocą /etc/asound.conf:
pcm.jack {
type jack
playback_ports {
0 alsa_pcm:playback_1
1 alsa_pcm:playback_2
}
capture_ports {
0 alsa_pcm:capture_1
1 alsa_pcm:capture_2
}
}
Możliwe jest nawet podłączenie pulseaudio do jackd, wymaga to odpalenia pulseaudio z odpowiednim konfigiem w którym najistotniejsze jest przekierowanie wyjścia do jackd za pomocą załadowania odpowiednich modułów (zamiast modułów dostępu do rzeczywistego sprzętu):
load-module module-jack-sink load-module module-jack-source
Zobacz w Sieci: Audio mixer, Applications using JACK, HOWTO: PulseAudio Fixes & System-Wide Equalizer Support
Copyright (c) 1999-2009, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license
Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania
modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o
prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki
użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.
This program is free software. Redistribution and use in source and binary
forms, with or without modification, ARE PERMITTED provided save this copyright
notice. This document/program is distributed WITHOUT any warranty, use at YOUR
own risk.
Dokument ten (URL: http://www.opcode.eu.org/multimedia)
należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek,
wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: 2009-05-04 23:27:25 (UTC) (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).