Rev 783 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?
Çàïèñü âèäåî â Unreal Speccy emulator (psb)
-------------------------------------
Çàïèñü âèäåî ðåàëèçîâàíà ñ ïîìîùüþ óòèëèòû ffmpeg. Òàêèì îáðàçîì, âñ¸, ÷òî
óìååò ffmpeg - âñå äîñòóïíî äëÿ èñïîëüçîâàíèÿ ñ Unreal Speccy.
Ñîäåðæàíèå:
* Îñíîâíûå âîçìîæíîñòè
* Îñíîâû ðàáîòû ñ ffmpeg
* Íàñòðîéêà ýìóëÿòîðà
* Ïàðàìåòðû äëÿ çàïèñè: íàáîð png/bmp
* Ïàðàìåòðû äëÿ çàïèñè: h264/mp3
* Ïàðàìåòðû äëÿ çàïèñè: DVD
* Îíëàéí-òðàíñëÿöèÿ âèäåî â èíòåðíåò
* Íàëîæåíèå çâóêà ìèêðîôîíà
* Ãäå ñêà÷àòü ffmpeg?
* Ïîëåçíûå ññûëêè ïî ffmpeg
Îñíîâíûå âîçìîæíîñòè
--------------------
* Çàïèñü âèäåî â ôàéë. Ïîääåðæèâàþòñÿ ðàçëè÷íûå êîäåêè (xvid/h264/mpeg2/bmp/png/
wav/mp3/... - âñå îíè âñòðîåíû â ffmpeg, äîïîëíèòåëüíî óñòàíàâëèâàòü íå
íóæíî), êîíòåéíåðû (avi/flv/mpg/mkv);
* Ïðèìåíåíèå ðàçëè÷íûõ ôèëüòðîâ ïåðåä ñæàòèåì (íàïðèìåð, ýòî ïîçâîëÿåò íà õîäó
çàïèñûâàòü âèäåî â ôîðìàòå, ïðèãîäíîì äëÿ èñïîëüçîâàíèÿ ïðè çàïèñè DVD -
25 fps interlaced);
* Îñóùåñòâëåíèå îíëàéí âåùàíèÿ â èíòåðíåòå (ñ âîçìîæíîñòüþ íàëîæåíèÿ çâóêà
ìèêðîôîíà ïîâåðõ çâóêà ýìóëÿòîðà);
* Àâòîìàòè÷åñêàÿ ïîääåðæêà ìíîãîÿäåðíûõ ïðîöåññîðîâ äëÿ êîäèðîâàíèÿ âèäåî.
Îñíîâû ðàáîòû ñ ffmpeg
----------------------
Èçíà÷àëüíî ffmpeg ïðåäíàçíà÷åí äëÿ êîíâåðòàöèè/ñæàòèÿ âèäåî. Ðàáîòà ñ ffmpeg
âåäåòñÿ èç êîìàíäíîé ñòðîêè. Ïðè ýòîì, çàäàþòñÿ èñòî÷íèêè è ïðèåìíèêè äàííûõ,
à òàê æå îïöèè, îïðåäåëÿþùèå ôîðìàòû äàííûõ/õàðàêòåðèñòèêè ñæàòèÿ. Ïðèìåð:
ffmpeg -i input.avi output.flv
 ýòîì ñëó÷àå âèäåî èç input.avi ïåðåêîíâåðòèðóåòñÿ â output.flv (òèï êîíòåéíåðà
îïðåäåëÿåòñÿ àâòîìàòè÷åñêè ïî ðàñøèðåíèÿì ôàéëîâ, íî íå âñåãäà, èíîãäà íóæíî åãî
óêàçûâàòü ÿâíî, íàïðèìåð: -f flv).
 îáùåì âèäå ïàðàìåòðû êîìàíäíîé ñòðîêè èìåþò òàêîé ôîðìàò:
ffmpeg [input1 options] -i input1 [input2 options] -i input2 ... [output1 options] output1 [output2 options] output2 ...
Êëþ÷ -i çàäàåò èñòî÷íèê äàííûõ, ïðè ýòîì ÄÎ ýòîãî êëþ÷à äîëæíû áûòü çàäàíû âñå
îïöèè äëÿ ýòîãî èñòî÷íèêà. Âñå, ÷òî óêàçàíî ïîñëå -i, áóäåò ñ÷èòàòüñÿ îïöèÿìè
äëÿ ñëåäóþùåãî èñòî÷íèêà/ïðèåìíèêà.
Îïèñàíèå âñåõ îïöèé ffmpeg ìîæíî íàéòè â àðõèâå ñ ïðîãðàììîé èëè íà îôèöèàëüíîì
ñàéòå (ññûëêà âíèçó).
Íàñòðîéêà ýìóëÿòîðà
-------------------
Äëÿ ðàáîòû ôóíêöèè ñîõðàíåíèÿ âèäåî, â ini-ôàéëå ýìóëÿòîðà íåîáõîäèìî íàñòðîèòü
ñëåäóþùèå ïàðàìåòðû:
ffmpeg.exec ïóòü è èìÿ óòèëèòû ffmpeg, íàïðèìåð, ffmpeg.exe èëè
C:\ffmpeg\ffmpeg.exe, äî 256 áàéò;
ffmpeg.newconsole 1 - îòêðûâàòü äëÿ ffmpeg íîâóþ êîíñîëü;
0 - èñïîëüçîâàòü êîíñîëü ýìóëÿòîðà äëÿ âûâîäà ffmpeg
(ïîëåçíî äëÿ îòëàäêè ïàðàìåòðîâ);
ffmpeg.parm ïàðàìåòðû âûõîäíîãî ôàéëà, äî 1024 áàéò;
ffmpeg.vout èìÿ âûõîäíîãî ôàéëà (ìîæíî èñïîëüçîâàòü ñèìâîë "#" äëÿ
ïîäñòàíîâêè ïîðÿäêîâîãî íîìåðà âèäåî, íàïðèìåð, video#.avi),
äî 512 áàéò.
Äëÿ çàïèñè âèäåî Unreal Speccy çàïóñêàåò ffmpeg â ñëåäóþùåì ôîðìàòå:
"%exec%" -i %pipename% %parm% -y %vout%
%exec% - ïàðàìåòð ffmpeg.exec èç ini-ôàéëà;
%pipename% - èìÿ êàíàëà (pipe), ÷åðåç êîòîðûé ïåðåäàåòñÿ íåñæàòîå âèäåî -
íåäîñòóïíî äëÿ èçìåíåíèÿ;
%parm% - ïàðàìåòð ffmpeg.parm èç ini-ôàéëà;
%vout% - ïàðàìåòð ffmpeg.vout èç ini-ôàéëà.
Çàïèñü âèäåî íà÷èíàåòñÿ ïðè ïåðâîì íàæàòèè CTRL+F8 (åñëè ýòî íå èçìåíåíî â
ini-ôàéëå) è îñòàíàâëèâàåòñÿ ïðè âòîðîì. Íà ñëàáûõ êîìïüþòåðàõ (äàæå 2õ-ÿäåðíûõ)
âîçìîæíî òîðìîæåíèå ýìóëÿòîðà ïðè çàïèñè - ýòî íîðìàëüíî, íà êà÷åñòâî âèäåî ýòî
íå âëèÿåò.
Ïàðàìåòðû äëÿ çàïèñè: íàáîð png/bmp
-----------------------------------
Äëÿ çàïèñè êàðòèíîê äîñòàòî÷íî óêàçàòü ðàñøèðåíèå .png/.bmp ó âûõîäíîãî ôàéëà.
ffmpeg.parm=-r 25
ffmpeg.vout=video#_%06d.png
Çäåñü "-r 25" çàäàåò ÷àñòîòó êàäðîâ âûõîäíîãî âèäåî - 25 ê/ñåê, ò.å., åñëè
ýìóëÿòîð áóäåò äàâàòü 50 ê/ñåê, òî êàæäûé âòîðîé êàäð áóäåò îòáðîøåí. Åñëè íå
çàäàâàòü íèêàêèõ ïàðàìåòðîâ, áóäåò ñîõðàíÿòüñÿ 50 ê/ñåê.
"video#_%06d.png" ðàçâåðíåòñÿ â "video0_000000.png", "video0_000001.png",
"video0_000002.png" è ò.ä. äëÿ ïåðâîãî âèäåî, "video1_000000.png",
"video1_000001.png", "video1_000002.png" è ò.ä. äëÿ âòîðîãî âèäåî.
Ïàðàìåòðû äëÿ çàïèñè: h264/mp3
------------------------------
H264 - ñòàíäàðò ñæàòèÿ âèäåî, ïðåäíàçíà÷åííûé äëÿ äîñòèæåíèÿ âûñîêîé ñòåïåíè
ñæàòèÿ âèäåî ïîòîêà ïðè ñîõðàíåíèè âûñîêîãî êà÷åñòâà.  ffmpeg äëÿ ðàáîòû ñ ýòèì
ôîðìàòîì èñïîëüçóåòñÿ êîäåê libx264.
Äëÿ ñæàòèÿ çâóêà â mp3 èñïîëüçóåòñÿ êîäåê libmp3lame.
Âîò îñíîâíûå ïàðàìåòðû (äëÿ èñïîëüçîâàíèÿ â ffmpeg.parm):
-c:a copy êîïèðîâàíèå àóäèî ïîòîêà áåç èçìåíåíèÿ ôîðìàòà
(â íàøåì ñëó÷àå - áåç ñæàòèÿ, wav)
-c:a libmp3lame ñæàòèå çâóêà â mp3
-b:a 320k ñ áèòðåéòîì 320
-af volume=3.0 óâåëè÷åíèå ãðîìêîñòè çâóêà â 3 ðàçà (ïîëåçíî,
ò.ê. â ýìóëÿòîðå çâóê òèõèé)
-c:v copy êîïèðîâàíèå âèäåî ïîòîêà áåç èçìåíåíèÿ ôîðìàòà
(â íàøåì ñëó÷àå - áåç ñæàòèÿ, rgb24)
-c:v libx264 ñæàòèå âèäåî â h264,
-pix_fmt yuvj420p ôîðìàò ïèêñåëåé; áåç ýòîé îïöèè íå ðàáîòàåò :)
-preset:v veryfast òèï ñæàòèÿ (âëèÿåò íà ñêîðîñòü è ñòåïåíü ñæàòèÿ)
-profile:v baseline òèï ïðîôèëÿ (ñì. îïèñàíèå h264)
-crf 10 êà÷åñòâî ñæàòèÿ 0-51 (0 - áåç ïîòåðü, 51 - õóäøåå)
-ss 00:00:00.500 ïðîïóñòèòü ïåðâûå 500 ìñ âèäåî (íå çàïèñûâàòü êàäðû
ñ íàäïèñüþ "start saving video")
-an èñêëþ÷èòü àóäèî
-vn èñêëþ÷èòü âèäåî
Äëÿ ñîçäàíèÿ ñâîèõ íàñòðîåê êîäèðîâàíèÿ âèäåî, äîñòàòî÷íî ïðîñòî "ñêëåèòü"
âûøåóêàçàííûå îïöèè âìåñòå, ðàçäåëÿÿ èõ ïðîáåëàìè.
Íàïðèìåð, ìû õîòèì ïîëó÷èòü íåñæàòûé çâóê è ñæàòîå âèäåî áåç ïîòåðü:
ffmpeg.parm=-c:a copy -af volume=3.0 -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -crf 0 -ss 00:00:00.500
ffmpeg.vout=video#.avi
Èëè ñæàòûé çâóê è áîëåå ñæàòîå âèäåî:
ffmpeg.parm=-c:a libmp3lame -b:a 320k -af volume=3.0 -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -profile:v baseline -crf 10 -ss 00:00:00.500
ffmpeg.vout=video#.avi
Äëÿ çàïèñè âèäåî â h264 íàñòîÿòåëüíî ðåêîìåíäóåòñÿ ñòàâèòü ðåæèì îòîáðàæåíèÿ
double size (2x) â ýìóëÿòîðå (èíà÷å áóäóò ïîòåðè â öâåòå).
Ïðè çàïèñè âèäåî ñ ÷àñòîòîé 25 êàäðîâ/ñåê (íàïðèìåð, YouTube ïðèíóäèòåëüíî
ïåðåæèìàåò â òàêóþ ÷àñòîòó), êàæäûé âòîðîé êàäð áóäåò âûïàäàòü. Äëÿ ýôôåêòîâ
òèïà gigascreen ýòî êðèòè÷íî. Äëÿ èñïðàâëåíèÿ ñèòóàöèè ïðè çàïèñè òàêèõ âèäåî
íàñòîÿòåëüíî ðåêîìåíäóåòñÿ â íàñòðîéêàõ ýìóëÿòîðà âêëþ÷àòü ðåæèì Noflic
(âêëàäêà Video). Äà è äàæå íà âèäåî â 50 êàäðîâ/ñåê Noflic âûãëÿäèò óáåäèòåëüíåå
íà gigascreen-ýôôåêòàõ.
Ïàðàìåòðû äëÿ çàïèñè: DVD
-------------------------
Âèäåî äëÿ PAL-DVD äîëæíî ñîäåðæàòü 25 êàäðîâ/ñåê, êàæäûé êàäð äîëæåí ñîñòîÿòü èç
ïîëåé (ïîëóêàäðîâ). Çàäà÷à - óïàêîâûâàòü ïàðó ñîñåäíèõ ýêðàíîâ ýìóëÿòîðà â îäèí
interlaced-êàäð. Äëÿ ýòîãî â ffmpeg åñòü ôèëüòð tinterlace. Òàêæå â ffmpeg åñòü
îïöèÿ -target pal-dvd, êîòîðàÿ ñðàçó óñòàíàâëèâàåò íåîáõîäèìûå êîäåêè, ðàçìåð
êàðòèíêè (720x576 ïèêñåëåé) äëÿ ôîðìàòà DVD.
Äëÿ ñîáëþäåíèÿ îðèãèíàëüíûõ ïðîïîðöèé ðåêîìåíäóåòñÿ äåëàòü îáðåçàíèå/äîïîëíåíèå
èñõîäíîãî êàäðà äî ðàçðåøåíèÿ 720x576. Ýòî äåëàåòñÿ ôèëüòðàìè crop/pad
ñîîòâåòñòâåííî.
Âîò ïðèìåð îïöèé äëÿ çàïèñè DVD (èñõîäíàÿ êàðòèíêà â ýìóëÿòîðå äîëæíà áûòü
áîëüøå 720x576 ïèêñåëåé - double size (2x) + full border, èíà÷å áóäåò îøèáêà):
ffmpeg.parm=-af volume=3.000000 -bf 2 -vf "crop=720:576,tinterlace=mode=interlacex2" -aspect 4:3 -target pal-dvd -r 25 -b:v 2800k -ss 00:00:00.500
ffmpeg.vout=video#.mpg
Åùå ïðèìåð (èñõîäíàÿ êàðòèíêà ìåíüøå 720x576 ïèêñåëåé - äîïîëíÿåòñÿ äî ýòîãî
ðàçðåøåíèÿ ÷åðíîé ðàìêîé):
ffmpeg.parm=-af volume=3.000000 -bf 2 -vf "pad=720:576:(ow-iw)/2:(oh-ih)/2,tinterlace=mode=interlacex2" -aspect 4:3 -target pal-dvd -r 25 -b:v 2800k -ss 00:00:00.500
ffmpeg.vout=video#.mpg
Ïðè èñïîëüçîâàíèè ýòèõ ïàðàìåòðîâ êîäèðîâàíèÿ, â ýìóëÿòîðå íåîáõîäèìî ïîñòàâèòü
ðåæèì îòîáðàæåíèÿ double size (2x) äëÿ êîððåêòíîé ðàáîòû ôèëüòðà interlacex2.
Îïöèÿ -b:v 2800k çàäàåò áèòðåéò âèäåî (ïîäáèðàåòñÿ íà ãëàç).
Îíëàéí-òðàíñëÿöèÿ âèäåî â èíòåðíåò
----------------------------------
Åñòü íåñêîëüêî ïóáëè÷íûõ ñåðâåðîâ, ïîçâîëÿþùèõ îðãàíèçîâûâàòü îíëàéí òðàíñëÿöèè
â èíòåðíåò, íàïðèìåð: justin.tv, twitch.tv, own3d.tv. Ýòè ñåðâåðà ìîãóò
ïðèíèìàòü âèäåî ïîòîê ïî ïðîòîêîëó rtmp è ïîêàçûâàòü åãî ÷åðåç âåá-ñàéò.
Êðîìå òîãî, âñå ïåðåäàííîå âèäåî çàïèñûâàåòñÿ íà êàíàëå è åãî ìîæíî ïîñìîòðåòü
ïîçæå.
Äëÿ òîãî, ÷òîáû îðãàíèçîâàòü òðàíñëÿöèþ, íåîáõîäèìî çàðåãèñòðèðîâàòüñÿ íà
ñåðâèñå è ïîëó÷èòü âàø ñîáñòâåííûé èäåíòèôèêàòîð òðàíñëÿöèè - ñòðîêó òèïà
live_74829844_mfrdpoeg034tn03gn03ring3f0rngc. Çàòåì ýòîò èäåíòèôèêàòîð íóæíî
âñòàâèòü â àäðåñ òðàíñëÿöèè â ïàðàìåòðå ffmpeg.vout.
Ïîñëå òîãî, êàê íàñòðîéêè ãîòîâû, çàïóñêàåì ýìóëÿòîð, çàïóñêàåì çàïèñü âèäåî -
òðàíñëÿöèÿ íà÷àëàñü. Çðèòåëè ìîãóò âèäåòü ýêðàí ýìóëÿòîðà íà âàøåé ñòðàíè÷êå.
Ïðèìåð äëÿ justin.tv (èäåíòèôèêàòîð ïîäñòàâèòü ñâîé):
ffmpeg.parm=-af volume=3.000000 -r 10 -ss 00:00:00.500 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.justin.tv/app/live_74829844_mfrdpoeg034tn03gn03ring3f0rngc
Ïðèìåð äëÿ own3d.tv (èäåíòèôèêàòîð ïîäñòàâèòü ñâîé):
ffmpeg.parm=-af volume=3.000000 -r 25 -ss 00:00:00.500 -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -profile:v baseline -crf 10 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.eu.own3d.tv/live/b8493921_949585_kjhb5632l3l1
Ïðèìåð äëÿ twitch.tv (èäåíòèôèêàòîð ïîäñòàâèòü ñâîé):
ffmpeg.parm=-af volume=3.000000 -r 30 -ss 00:00:00.500 -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -profile:v baseline -crf 35 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.justin.tv/app/live_sub_5b8ed4fae83fe83e920227337beab7e73b7a3ba3
Íàëîæåíèå çâóêà ìèêðîôîíà (ìîæåò ðàáîòàòü íåêîððåêòíî)
------------------------------------------------------
ffmpeg óìååò çàõâàòûâàòü çâóê ñî çâóêîâîé êàðòû è êàðòèíêó ñ ýêðàíà/êàìåð.
Äëÿ âûâîäà âñåõ èìåþùèõñÿ â ñèñòåìå óñòðîéñòâ íåîáõîäèìî âûïîëíèòü êîìàíäó:
ffmpeg -list_devices true -f dshow -i dummy
Êîìàíäà âûâåäåò ïðèìåðíî ñëåäóþùåå:
ffmpeg version N-48785-g2ea3f37 Copyright (c) 2000-2013 the FFmpeg developers
built on Jan 12 2013 20:40:36 with gcc 4.7.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-
avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --
enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable
-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-
amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-
libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --
enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx
--enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib --enable-
filter=frei0r
libavutil 52. 14.100 / 52. 14.100
libavcodec 54. 86.100 / 54. 86.100
libavformat 54. 59.107 / 54. 59.107
libavdevice 54. 3.102 / 54. 3.102
libavfilter 3. 32.100 / 3. 32.100
libswscale 2. 1.103 / 2. 1.103
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
[dshow @ 02444020] DirectShow video devices
[dshow @ 02444020] Could not enumerate video devices.
[dshow @ 02444020] DirectShow audio devices
[dshow @ 02444020] "Realtek AC97 Audio"
dummy: Immediate exit requested
Çäåñü ìû âèäèì, ÷òî äîñòóïíî çâóêîâîå óñòðîéñòâî "Realtek AC97 Audio". Äëÿ
ìèêøèðîâàíèÿ çâóêà ìèêðîôîíà è çâóêà èç ýìóëÿòîðà, íóæíî äîáàâèòü èñòî÷íèê çâóêà
-f dshow -i audio="Realtek AC97 Audio"
è èñïîëüçîâàòü îïöèþ
-filter_complex amix=inputs=2:duration=shortest
äëÿ ìèêøèðîâàíèÿ äâóõ çâóêîâûõ ïîòîêîâ â îäèí (â ìèêøåðå çàïèñè Windows äîëæåí
áûòü âûáðàí ìèêðîôîí).
ffmpeg.parm=-f dshow -i audio="Realtek AC97 Audio" -r 10 -ss 00:00:00.500 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.justin.tv/app/live_74829844_mfrdpoeg034tn03gn03ring3f0rngc
Ãäå ñêà÷àòü ffmpeg?
-------------------
* Îôèöèàëüíûé ñàéò: http://ffmpeg.org/
* Ñáîðêà ïîä windows: http://ffmpeg.zeranoe.com/builds/
Ïîëåçíûå ññûëêè ïî ffmpeg
-------------------------
* http://ffmpeg.org/documentation.html - äîêóìåíòàöèÿ
* http://ffmpeg.org/trac/ffmpeg/wiki - êó÷à ïðèìåðîâ èñïîëüçîâàíèÿ,
ðóêîâîäñòâà ïî ñæàòèÿì, òðàíñëÿöèè è ò.ï.