Arista Transcoder (Конвертация видео в два клика)

Cent OS, Scientific Linux

Модератор: Модераторы разделов

Ответить
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Arista Transcoder

Сообщение alkesta »

Конвертация видео в два клика для таких устройств как Nokia N900, PSP, Android & Apple devices etc.

Site: http://www.transcoder.org/
Source: http://www.transcoder.org/downloads/
Review: http://totate.blogspot.com/2010/09/arista-transcoder.html

Packages for Fedora 14:
arista-0.9.6-2.fc14.src.rpm
Для i686 и x86_64:
arista-0.9.6-2.fc14.noarch.rpm
nautilus-extension-arista-0.9.6-2.fc14.noarch.rpm

Для установки нужны подключенные репы RPMFusion (RPMFusion repos depended).

Установка:

Код: Выделить всё

$ su
# cd /path/to/download_dir/
# yum localinstall nautilus-extension-arista-0.9.6-2.fc14.noarch.rpm arista-0.9.6-2.fc14.noarch.rpm --nogpgcheck


Screenshots:
Изображение
Изображение
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Arista Transcoder

Сообщение alkesta »

Собрав arista озадачился не работающим пресетом для PSP. После изысканий, сделал фикс в 0.9.6-2 все работает.

Патч исправляет расчет высоты и ширины изображения с учетом необходимой кратности 16-ти и вносит правильные параметры в пресет:

Код: Выделить всё

diff -ur arista-0.9.6-orig/arista/transcoder.py arista-0.9.6/arista/transcoder.py
--- arista-0.9.6-orig/arista/transcoder.py    2010-07-08 23:58:05.000000000 +0300
+++ arista-0.9.6/arista/transcoder.py    2011-01-02 01:08:36.000000000 +0200
@@ -363,45 +363,65 @@
             # =================================================================
             # Calculate video width/height and add black bars if necessary
             # =================================================================
-            wmin, wmax = self.preset.vcodec.width
-            hmin, hmax = self.preset.vcodec.height
-
+            wmin, wmax = self.preset.vcodec.width # should be multiples of 16
+            hmin, hmax = self.preset.vcodec.height # should be multiples of 16
+
             owidth, oheight = self.info.videowidth, self.info.videoheight
             width, height = owidth, oheight

+            deviceaspectratio = wmax/hmax # PSP: 480/272=1.76(16:9) wmin, hmin 368x208
+            oaspectratio = owidth/oheight # Sintel_1280x544: 1280/544=2.35     320x136
+            cropvalue = 0
+            vbox = ""
+
             # Scale width / height to fit requested min/max
-            if owidth < wmin:
-                width = wmin
-                height = int((float(wmin) / owidth) * oheight)
-            elif owidth > wmax:
-                width = wmax
-                height = int((float(wmax) / owidth) * oheight)
-
-            if height < hmin:
-                height = hmin
-                width = int((float(hmin) / oheight) * owidth)
-            elif height > hmax:
+            if deviceaspectratio == oaspectratio: # for 1.76 movie
+            width = wmax
                 height = hmax
-                width = int((float(hmax) / oheight) * owidth)
-
-            # Add any required padding
-            # TODO: Remove the extra colorspace conversion when no longer
-            #       needed, but currently xvidenc and possibly others will fail
-            #       without it!
-            vbox = ""
-            if width < wmin and height < hmin:
-                wpx = (wmin - width) / 2
-                hpx = (hmin - height) / 2
-                vbox = "videobox left=%i right=%i top=%i bottom=%i ! ffmpegcolorspace ! " % \
-                       (-wpx, -wpx, -hpx, -hpx)
-            elif width < wmin:
-                px = (wmin - width) / 2
-                vbox = "videobox left=%i right=%i ! ffmpegcolorspace ! " % \
-                       (-px, -px)
-            elif height < hmin:
-                px = (hmin - height) / 2
-                vbox = "videobox top=%i bottom=%i ! ffmpegcolorspace ! " % \
-                       (-px, -px)
+            elif deviceaspectratio < oaspectratio: # for 2.35 movie
+            if owidth < wmin:
+                     width = wmin # width = 368
+                     height = int((float(wmin) / owidth) * oheight) # height = 156
+             while height % 16: #if height not multiples of 16
+               height += 1 # height = 160 multiples of 16
+             width = int((float(height) / oheight) * owidth) # new width = 376
+             while (width + cropvalue) % 16:
+               cropvalue += 1
+             px = -(cropvalue / 2) # add padding
+            elif owidth > wmax:
+                     width = wmax # width = 480
+                     height = int((float(wmax) / owidth) * oheight) # height = 204
+             while height % 16: #if height not multiples of 16
+             height += 1 # height = 208 multiples of 16
+             width = int((float(height) / oheight) * owidth) # # new width = 489
+             if width % 2:
+                      width += 1 # width = 490
+             cropvalue = width - wmax # width crop needed - 10 px
+             px = cropvalue / 2
+            if cropvalue > 0:
+             vbox = "videobox left=%i right=%i ! ffmpegcolorspace ! " % (px, px)
+            elif deviceaspectratio < oaspectratio: # for 1.33 movie
+            if height < hmin:
+                     height = hmin
+                     width = int((float(hmin) / oheight) * owidth)
+             while width % 16:
+               width += 1
+             height = int((float(width) / owidth) * oheight)
+             while (height + cropvalue) % 16:
+               cropvalue += 1
+             px = -(cropvalue / 2)
+            elif oheight > hmax:
+                     height = hmax
+                     width = int((float(hmax) / oheight) * owidth)
+             while width % 16:
+              width += 1
+             height = int((float(height) / oheight) * owidth)
+             if height % 2:
+                      height += 1
+             cropvalue = height - hmax
+             px = cropvalue / 2
+            if cropvalue > 0:
+             vbox = "videobox top=%i bottom=%i ! ffmpegcolorspace ! " % (px, px)

             try:
                 if self.info.videocaps[0].has_key("pixel-aspect-ratio"):
diff -ur arista-0.9.6-orig/presets/psp.json arista-0.9.6/presets/psp.json
--- arista-0.9.6-orig/presets/psp.json    2010-06-10 03:11:41.000000000 +0300
+++ arista-0.9.6/presets/psp.json    2011-01-05 03:41:16.101000079 +0200
@@ -1,5 +1,5 @@
 {
-    "version": "1.1",
+    "version": "1.2",
     "description": "H.264/AAC for Playstation portable",
     "author": {
         "name": "Daniel G. Taylor",
@@ -11,43 +11,43 @@
         {
             "vcodec": {
                 "passes": [
-                    "pass=qual quantizer=27 subme=4 threads=0"
+                    "bitrate=420 vbv-buf-capacity=500 pass=pass1 cabac=true dct8x8=false ref=3 bframes=3 b-pyramid=false weightb=false trellis=true me=umh subme=6 threads=0"
                 ],
-                "container": "qtmux",
+                "container": "mp4mux",
                 "name": "x264enc",
                 "height": [
-                    272,
+                    144,
                     272
                 ],
                 "width": [
-                    480,
+                    320,
                     480
                 ],
                 "rate": [
-                    1,
+                    25,
                     25
                 ]
             },
-            "container": "qtmux",
-            "name": "Low",
+            "container": "mp4mux",
+            "name": "Normal",
             "extension": "mp4",
             "acodec": {
                 "passes": [
-                    "bitrate=96000 profile=LC"
+                    "bitrate=128000 profile=LC"
                 ],
-                "container": "qtmux",
+                "container": "mp4mux",
                 "name": "faac",
                 "depth": [
-                    8,
-                    24
+                    16,
+                    16
                 ],
                 "channels": [
-                    1,
+                    2,
                     2
                 ],
                 "width": [
-                    8,
-                    24
+                    16,
+                    16
                 ],
                 "rate": [
                     48000,
@@ -58,43 +58,43 @@
         {
             "vcodec": {
                 "passes": [
-                    "pass=qual quantizer=21 me=umh subme=6 ref=2 threads=0"
+                    "bitrate=320 vbv-buf-capacity=500 pass=pass1 cabac=true dct8x8=false ref=3 bframes=3 b-pyramid=false weightb=false trellis=true me=umh subme=6 threads=0"
                 ],
-                "container": "qtmux",
+                "container": "mp4mux",
                 "name": "x264enc",
                 "height": [
-                    272,
-                    272
+                    112,
+                    208
                 ],
                 "width": [
-                    480,
-                    480
+                    368,
+                    368
                 ],
                 "rate": [
-                    1,
-                    30
+                    15,
+                    15
                 ]
             },
-            "container": "qtmux",
-            "name": "Normal",
+            "container": "mp4mux",
+            "name": "Low",
             "extension": "mp4",
             "acodec": {
                 "passes": [
-                    "bitrate=128000 profile=LC"
+                    "bitrate=96000 profile=LC"
                 ],
-                "container": "qtmux",
+                "container": "mp4mux",
                 "name": "faac",
                 "depth": [
-                    8,
-                    24
+                    16,
+                    16
                 ],
                 "channels": [
-                    1,
+                    2,
                     2
                 ],
                 "width": [
-                    8,
-                    24
+                    16,
+                    16
                 ],
                 "rate": [
                     48000,
Спасибо сказали:
katmai
Сообщения: 44
ОС: Debian etch

Re: Arista Transcoder

Сообщение katmai »

спасибо, не надо самому собирать )))
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Arista Transcoder

Сообщение Vascom »

Работает хорошо, но профили для Android-устройств не позволяют закодировать видео для воспроизведения на HTC Hero.
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Arista Transcoder

Сообщение alkesta »

Vascom писал(а):
06.01.2011 19:44
профили для Android-устройств не позволяют закодировать видео для воспроизведения на HTC Hero.


А что не так?
Я плохо представляю себе особенности Hero.
Если нет предопределенного, то его можно довольно просто создать: http://www.transcoder.org/presets/create/
Или проблемы с настройками кодеков и т.п.?
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Arista Transcoder

Сообщение Vascom »

Похоже, что проблемы действительно с настройками кодеков (даже разрешение фильма лучше сразу подгонять под разрешение экрана телефона).
Самые лучшие настройки подобраны в этой программе, но там они для mplayer и мне не удалось всё однозначно сопоставить. Однако, с такими настройками всё действительно здорово работает.
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Arista Transcoder

Сообщение alkesta »

Vascom писал(а):
09.01.2011 11:12
Самые лучшие настройки подобраны в этой программе, но там они для mplayer и мне не удалось всё однозначно сопоставить.


Та к давай доведем до ума и закоммитим в апстрим (я уже сделал коммит для PSP).
Можешь запостить эти самые лучшие настройки :
- название контенйнера (думаю, что это MP4)
- Дамп настроек x264
- разрешение экрана
- Аудио (AAC?): битрейт и профиль

Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Arista Transcoder

Сообщение Vascom »

alkesta писал(а):
09.01.2011 11:41
Vascom писал(а):
09.01.2011 11:12
Самые лучшие настройки подобраны в этой программе, но там они для mplayer и мне не удалось всё однозначно сопоставить.


Та к давай доведем до ума и закоммитим в апстрим (я уже сделал коммит для PSP).
Можешь запостить эти самые лучшие настройки :
- название контенйнера (думаю, что это MP4)
- Дамп настроек x264
- разрешение экрана
- Аудио (AAC?): битрейт и профиль

- Контейнер MP4
- кодирование видео и аудио (опции для mencoder):
первый проход
-ovc x264 -oac faac -channels 2 -faacopts mpeg=4:object=2:br=64 -x264encopts level=30:pass=1:bitrate=500:vbv-maxrate=1500:vbv-bufsize=2000:subme=0:analyse=0:partitions=none:ref=1:turbo=2:me=dia:bframes=0:th
reads=auto:nocabac:bframes=0:weightp=0:8x8dct=0 -vf scale=-10:-1,scale=0:-10,scale=480:-10::::::1,scale=-10:320::::::1,harddup -o /dev/null

второй проход
-ovc x264 -oac faac -channels 2 -faacopts mpeg=4:object=2:br=64 -x264encopts level=30:pass=2:bitrate=500:vbv-maxrate=1500:vbv-bufsize=2000:subme=6:analyse=0:partitions=none:ref=1:nocabac:bframes=0:threads=a
uto:weightp=0:8x8dct=0 -vf scale=-10:-1,scale=0:-10,scale=0:-10,scale=480:-10::::::1,scale=-10:320::::::1,harddup

Я так понимаю, что -vf обеспечивает подгон под разрешение 480x320 пикселей (родное разрешение Хиро). Большее разрешение лучше не делать, может не потянуть.

P.S. Arista работает не через mencoder? А то mencoder собран без поддержки faac, мне пришлось его пересобрать.
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Arista Transcoder

Сообщение alkesta »

nocabac bframes=0 weightp=0 это точно? AVC Main Profile Level 3 ( level=30) - эти параметры как раз предусматривает и эти параметры сильно сказываются на степени сжатия, т.е. на размере файла. Именно они и есть преимущество x264.

Посмотреть параметры кодера можно командой:

Код: Выделить всё

$ gst-inspect x264enc

.P.S.
Arista использует Gsreamer c bad и ffmpeg плагинами.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Arista Transcoder

Сообщение Vascom »

Да, именно такие параметры. Если включить B-кадры, то видео не показывается на теле. Думаю, это связано со слабым процессором ARM v6. А сжатие тут лучше регулировать битрейтом, ведь для разрешения 480х320 большого битрейта не требуется.
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Arista Transcoder

Сообщение alkesta »

Теоретически должно быть оно, hero.json:

Код: Выделить всё

{
    "make": "Hero",
    "model": "Hero",
    "description": "H.264/AAC in MP4 for Hero",
    "version": "1.0",
    "author": {
        "name": "Hero",
        "email": "hero@hero.com"
    },
    "icon": "file://android.svg",
    "default": "Normal",
    "presets": [
        {
            "name": "Normal",
            "extension": "mp4",
            "container": "mp4mux",
            "vcodec": {
                "name": "x264enc",
                "container": "mp4mux",
                "width": [
                    112, 480
                ],
                "height": [
                    80, 320
                ],
                "rate": [
                    15, 30
                ],
                "passes": [
                    "profile=baseline speed-preset=slower bitrate=500 ref=1 threads=0"
                ]
            },
            "acodec": {
                "name": "faac",
                "container": "mp4mux",
                "width": [
                    8, 16
                ],
                "depth": [
                    8, 16
                ],
                "rate": [
                    8000, 96000
                ],
                "channels": [
                    1, 2
                ],
                "passes": [
                    "bitrate=131072 profile=LC"
                ]
            }
        }
    ]
}
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Arista Transcoder

Сообщение Vascom »

А как это установить теперь?
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Arista Transcoder

Сообщение alkesta »

скопируй в usr/share/arista/presets/hero.json (пресет будет отдельным пунктом, т.е. не в группе Android, чтоб его можно было легко удалить)

перезапусти arista

Vascom,
Есть результаты?
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Arista Transcoder

Сообщение Vascom »

Не сработало. Видео проигрывается с большими артефактами и замирает каждые несколько секунд.
Спасибо сказали:
Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

Re: Arista Transcoder

Сообщение alkesta »

Поэксперементировав с HandBrake, получил лучший результат для HTC Desire с такими параметрами:

Код: Выделить всё

cabac=0:bframes=0:ref=5:8x8dct=0:subq=9:mixed-refs=0:weightb=0:trellis=2:weightp=0:me=umh:analyse=all

причем, чтоб картинка не рассыпалась на квадратики ключевой параметр это - ref, который должен быть меньше 6-ти.

Попробуй с ref=2 и me=umh analyse=all (как в x264enc сделать analyse=all посмотри через gst-incpect x264enc)
После изменений пресета незабудь перезапустить arista
Спасибо сказали:
Ответить