СБОРКА ВИДЕО НА СТОРОНЕ СЕРВЕРА С ПОМОЩЬЮ FFMPEG & AVISYNTH

В ряде проектов, в которых я принимал участие – ставилась задача, автоматизировать процесс получения видео файла из произвольного пользовательского контента: изображение + видео файлы + звук.

Данный пост посвящён двум мощнейшим консольным кроссплатформенным инструментам ffmpeg и avisynth.

FFMPEG

описание

FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video. It includes libavcodec – the leading audio/video codec library.

Мощный инструмент для конвертирования видео из разных форматов.

примеры использования

Сборка последовательность изображений в видео

For creating a video from many images:

ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi

The syntax foo-%03d.jpeg specifies to use a decimal number composed of three digits padded with zeroes to express the sequence number. It is the same syntax supported by the C printf function, but only formats accepting a normal integer are suitable.

слабые стороны

  • плохо приспособлен для изменения контента, кропы, ресайзы, сдвиги – целая проблема

ссылки

AVISYNTH

описание

AviSynth is a powerful tool for video post-production. It provides ways of editing and processing videos. AviSynth works as a frameserver, providing instant editing without the need for temporary files.

Фактически это целый язык для описания нелинейного видео ряда.
Поддерживает огромное колличестово операций над входным контентом, в том числе:

  1. Media file filters
  2. Color conversion and adjustment filters
  3. Overlay and Mask filters
  4. Geometric deformation filters
  5. Pixel restoration filters
  6. Timeline editing filters

примеры использования

чтение изображений

# Default parameters: read a 1000-frame native AviSynth EBMP sequence (at 24 fps)
ImageSource()

# Read files “100.jpeg” through “199.jpeg” into an NTSC clip
ImageSource(“%d.jpeg”, 100, 199, 29.97)
# Note: floating-point fps available in v2.56

# Read files “00.bmp” through “50.bmp” bypassing AviSynth’s internal BMP reader
ImageSource(“%01d.bmp”, end = 50, use_DevIL = true)

# Read a single image, repeat 300 times
ImageSource(“static.png”, end = 300, use_DevIL=true)
# Much, much faster in v2.56

# Read a greyscale (8-bit) jpg:
ImageSource(“GoldPetals-8bit.jpg”, use_DevIL=true)

# Read a greyscale (8-bit) BMP (using AviSynth’s internal BMP reader):
ImageSource(“GoldPetals-8bit.bmp”)

# Read a YV24 BMP (created with ImageWriter):
ImageSource(“GoldPetals-24bit.ebmp”)

сборка слайдшоу

LoadPlugin(“C:\AviSynth 2.5\plugins\TransAll.dll”)

# First set of 26 images
a=ImageReader(“C:\JimiL\001.bmp”).trim(1,120)
b=ImageReader(“C:\JimiL\002.bmp”).trim(1,120)
c=ImageReader(“C:\JimiL\003.bmp”).trim(1,120)
d=ImageReader(“C:\JimiL\004.bmp”).trim(1,120)
e=ImageReader(“C:\JimiL\005.bmp”).trim(1,120)
f=ImageReader(“C:\JimiL\006.bmp”).trim(1,120)
g=ImageReader(“C:\JimiL\007.bmp”).trim(1,120)
h=ImageReader(“C:\JimiL\008.bmp”).trim(1,120)
i=ImageReader(“C:\JimiL\009.bmp”).trim(1,120)
j=ImageReader(“C:\JimiL\010.bmp”).trim(1,120)
k=ImageReader(“C:\JimiL\011.bmp”).trim(1,120)
l=ImageReader(“C:\JimiL\012.bmp”).trim(1,120)
m=ImageReader(“C:\JimiL\013.bmp”).trim(1,120)
n=ImageReader(“C:\JimiL\014.bmp”).trim(1,120)
o=ImageReader(“C:\JimiL\015.bmp”).trim(1,120)
p=ImageReader(“C:\JimiL\016.bmp”).trim(1,120)
q=ImageReader(“C:\JimiL\017.bmp”).trim(1,120)
r=ImageReader(“C:\JimiL\018.bmp”).trim(1,120)
s=ImageReader(“C:\JimiL\019.bmp”).trim(1,120)
t=ImageReader(“C:\JimiL\020.bmp”).trim(1,120)
u=ImageReader(“C:\JimiL\021.bmp”).trim(1,120)
v=ImageReader(“C:\JimiL\022.bmp”).trim(1,120)
w=ImageReader(“C:\JimiL\023.bmp”).trim(1,120)
x=ImageReader(“C:\JimiL\024.bmp”).trim(1,120)
y=ImageReader(“C:\JimiL\025.bmp”).trim(1,120)
z=ImageReader(“C:\JimiL\026.bmp”).trim(1,120)

#Transitions
aa=TransAccord(a,b,60,”hor”)
ba=TransBubbles(b,c,120)
ca=TransCentral(c,d,60)
da=TransCrumple(d,e,120,”fan”)
ea=TransDisco(e,f,60,60)
fa=TransFlipPage(f,g,120)
ga=TransFlipTurn(g,h,60)
ha=TransFunnel(h,i,120,”down”)
ia=TransMarbles(i,j,60)
ja=TransPaint(j,k,120,”bricks”)
ka=TransPeel(k,l,60,”right”,10,shade=-120)
la=TransPush(l,m,120)
ma=TransRipple(m,n,60,32)
na=TransScratch(n,o,120,”fount”)
oa=TransSlantRollIn(o,p,120)
pa=TransSlantRollOut(p,q,60)
qa=TransSlantWipe(q,r,120,”nw”)
ra=TransSlideIn(r,s,60,”center”)
sa=TransSlideOut(s,t,120,”center”)
ta=TransSprite(t,u,60,”down”)
ua=TransSwing(u,v,120,true,4,2)
va=TransSwirl(v,w,60,”anti”,16)
wa=TransTwinDoors(w,x,120)
xa=TransVenetianBlinds(x,y,60,type=”hor”)
ya=TransWeave(y,z,120,”jigsaw”)
za=TransWipe(z,a,60)

#join all the clips
vid=aa+ba+ca+da+ea+fa+ga+ha+ia+ja+ka+la+ma+na+oa+pa+qa+ra+sa+ta+ua+va+wa+xa+ya+za

# change the framerate and resize the clips – for youtube.com
newvid=vid.ChangeFPS(30000.0/1001.0).Spline36Resize(320,240)

# the final step
newvid

недостатки

  • пугает своей навороченностью  :)
  • последнюю версию тяжело соирать под линукс
    (постоянно возникают пролемы с версиями  библиотек)

ссылки

0 Responses to “СБОРКА ВИДЕО НА СТОРОНЕ СЕРВЕРА С ПОМОЩЬЮ FFMPEG & AVISYNTH”


  • No Comments

Leave a Reply