LINUX.ORG.RU

Как правильно транскодить на AMD при помщи VAAPI?

 , , ,


1

1

Есть выделенная машина, на ней стоит FX9590. Ниже пример тестового скрипта, который выполняет транскодинг.

#!/bin/bash
ffmpeg -re \
	-i input.flv \
	-c:a copy \
	-b:a 128k \
	-c:v libx264 \
	-bf 0 \
	-b:v 6M \
	-minrate 6M \
	-maxrate 6M \
	-bufsize 200K \
	-preset faster \
	-crf 7
	-r 60 \
	-x264-params nal-hrd=cbr:force-cfr=1:keyint=120 \
	-movflags +faststart \
-f flv rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx
#Input #0, flv, from 'input.flv':
  Metadata:
    encoder         : Lavf57.84.100
  Duration: 00:02:12.50, start: 0.000000, bitrate: 74641 kb/s
    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709/unknown/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 80000 kb/s, 60 fps, 60 tbr, 1k tbn, 120 tbc
    Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp, 320 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (copy)
#Output #0, flv, to 'rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx':
  Metadata:
    encoder         : Lavf58.12.100
    Stream #0:0: Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuvj420p(pc), 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 9000 kb/s, 60 fps, 1k tbn, 60 tbc
    Metadata:
      encoder         : Lavc58.18.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 9000000/0/9000000 buffer size: 200000 vbv_delay: -1
    Stream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 48000 Hz, stereo, fltp, 128 kb/s

Но, на этой же машине еще есть графический ускоритель AMD R9 390X. Как я понимаю, он кодирует при помощи VCE. Однако, из за ограничений Ubuntu 18.10 по графическим драйверам от амудешников, приходится использовать средства дефолнтного драйвера MESA.

И тут у меня полный безперспективняк, по той причине что используя стандартные советы по кодированию(целый раздел по VAAPI на FFMPEG). Видео которое получается на выходе имеет нечитабельный формат. А все попытки как то решить эту проблему, заканчиваются плевками от ffmpeg в мою сторону.

По этому прошу помощи от бывалых, может кому не лень чиркнуть подобные настройки кодировщика только под мою ситуацию с GPU. Заранее буду очень благодарен.

Ответ на: комментарий от Harald

Разве vaapi не прослойка между ffmpeg и драйверами для видеокарты(по большей части опенсорсные)? а для кодирования ставится sdk от производителя карты, и потом уже в ffmpeg указываются соответствующие параметры. afaik вроде так.

etwrq ★★★★ ()

Понятия не имею как перекодировать видео, но я год назад игрался с захватом видео с экрана с его кодированием на видеокарте, использовался для этого gstream, вот такая команда запуска нашлась в моих заметок:

VAAPI_DISABLE_INTERLACE=1 LIBVA_DRIVER_NAME=radeonsi gst-launch-1.0 -e ximagesrc display-name=$DISPLAY use-damage=0 startx=0 starty=0 endx=1919 endy=1079 ! \
video/x-raw,format=BGRx,framerate=30/1 ! \
vaapipostproc format=nv12 ! video/x-raw,format=NV12,framerate=30/1 ! \
vaapih264enc dct8x8=true cabac=true keyframe-period=30 ! \
video/x-h264,profile=main ! h264parse ! mux.video_0 \
pulsesrc ! audio/x-raw,rate=44100,channels=1,depth=16 ! lamemp3enc mono=true target=1 encoding-engine-quality=0 ! mpegaudioparse ! mux.audio_0 \
mp4mux name=mux streamable=false faststart=true ! filesink location=output.mp4
Сейчас проверил на rx470 и mesa 18 - работает.

anonymous ()

MESA умеет в ускорение через vaapi на радеонах. Очень хорошо умеет. Ещё умеет в vdpau на радеонах, но поддерживает меньше форматов чем через vaapi.

vainfo что говорит?

robus ★★★★ ()
Последнее исправление: robus (всего исправлений: 1)
Ответ на: комментарий от robus

Вот именно, что якобы всё путем..

libva info: VA-API version 1.2.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/r600_drv_video.so
libva info: Found init function __vaDriverInit_1_2
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.2 (libva 2.2.0)
vainfo: Driver version: Mesa Gallium driver 19.0.0-devel for AMD HAWAII (DRM 2.50.0, 4.18.0-13-generic, LLVM 7.0.1)
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileNone                   : VAEntrypointVideoProc
KGB1st ()
Ответ на: комментарий от KGB1st
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/r600_drv_video.so

Хм, у меня так:

libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so

может нужно ядро запустить с параметрами: radeon.si_support=0 radeon.cik_support=0 amdgpu.si_support=1 amdgpu.cik_support=1 ?

anonymous ()
Ответ на: комментарий от anonymous

Наугад менять рандомные параметры, в надежде получить чудом работающую их комбинацию — весьма такой себе способ решения проблем с компом. Лучше всё таки разобраться что и как и «бить наверняка».

robus ★★★★ ()
Ответ на: комментарий от robus

Так вот наугад уже меняю целый день)) Транскодить в файл получалось, но с какими-то дефектами по кадрам и битрейту. При попытке отправить на ютуб - шыш.. то разрешение недопустимое, то вообще отбрасывает..

KGB1st ()
Ответ на: комментарий от anonymous

Если попытаешься использовать gstream для перекодирования то учитывая эту разницу:

libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/r600_drv_video.so
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so
Команда возможно должна начинаться так:

VAAPI_DISABLE_INTERLACE=1 LIBVA_DRIVER_NAME=r600 gst-launch-1.0 -e ...

вместо

VAAPI_DISABLE_INTERLACE=1 LIBVA_DRIVER_NAME=radeonsi gst-launch-1.0 -e ...

anonymous ()
Ответ на: комментарий от KGB1st

Нууу. Тогда метод «втупую зафорсить vaapi для ffmpeg» уже был тобой испробован? Что говорит

#!/bin/bash
ffmpeg -re \
	-hwaccel vaapi -hwaccel_device /dev/dri/renderD128 \
	-i input.flv \
	-c:a copy \
	-b:a 128k \
	-c:v libx264 \
	-bf 0 \
	-b:v 6M \
	-minrate 6M \
	-maxrate 6M \
	-bufsize 200K \
	-preset faster \
	-r 60 \
	-x264-params nal-hrd=cbr:force-cfr=1:keyint=120 \
	-movflags +faststart \
-f flv rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx

в таком случае?

robus ★★★★ ()
Ответ на: комментарий от anonymous

Зачем явно указывать LIBVA_DRIVER_NAME у ТС и так правильно определяется. Проблема тут в другом. Возможно VAAPI_DISABLE_INTERLACE=1 поможет (если этот самый интерлейс железом не поддерживается, возможен сегфолт при попытке енкодинга через vaapi), но это вопрос, тот ли это случай.

robus ★★★★ ()
Ответ на: комментарий от KGB1st

у меня после установки дров с
https://launchpad.net/~oibaf/ archive/ubuntu/graphics-drivers
слетело устройство /dev/dri/renderD128

Плохо. Какие именно пакеты установлены оттуда? Откуда libdrm и llvm?

к тому же смысл с -hwaccel vaapi -hwaccel_device если ты все равно кодек libx264 юзать будешь?

Про это забыл (не так уж часто что либо перекодирую), действительно кодек должен быть h264_vaapi.

robus ★★★★ ()

Если ты стримить пытаешься (смотря по ссылке), то под линуксом есть OBS, который может стримить на эти твои ютубы. И поддержка VAAPI есть там.

Bfgeshka ★★★★★ ()

https://trac.ffmpeg.org/wiki/Hardware/VAAPI - тут исчерпывающая информация.

Остальное зависит от драйверов, которые ты установил.

Однако, из за ограничений Ubuntu 18.10 по графическим драйверам от амудешников, приходится использовать средства дефолнтного драйвера MESA.

Или поставить AMDGPU-PRO.

Quasar ★★★★★ ()

Я в свое время пробовал различные комбинации параметров ffmpeg. Вот например один из рабочих вариантов, запихнул практически все что нагуглил:

./ffmpeg -init_hw_device vaapi=amd:/dev/dri/renderD129 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device amd -filter_hw_device amd -i input.mp4 -vf 'format=nv12|vaapi,hwupload' -y -c:v h264_vaapi -qp:v 21 -sei +identifier+timing+recovery_point -profile:v main -level 4 -bf 0 output.avi
Только сперва пробуй эту команду с полным путем для входного файла.
При чем есть зависимость от того в какой контейнер записываются данные. Так avi самый беспроблемный, mp4 иногда получается не читаемый(тут надо опции подбирать), а mkv вообще может отказаться записывать.

V1KT0P ()
Ответ на: комментарий от robus

Я почитал, и там сказано что якобы такой метод может помочь ускорить обработку(хотя в то же время есть вероятность получить и обратный эффект). Я попробовал, особо не зарешало. FX не вывозит всё равно..

KGB1st ()
Ответ на: комментарий от Bfgeshka

Я понимаю что есть ОБС. Но я пытаюсь не просто стримить, а транскодить. Касательно стрима на ОБС у меня есть отдельный вопрос: как ОБС обрабатывает и с какими параметрами, потому что он работает явно быстрее чем просто ffmpeg

KGB1st ()
Ответ на: комментарий от KGB1st

Касательно стрима на ОБС у меня есть отдельный вопрос: как ОБС обрабатывает и с какими параметрами, потому что он работает явно быстрее чем просто ffmpeg

Он не может работать быстрее ffmpeg, ведь он работает на ffmpeg. Как именно работает - не скажу, потому что это лес густой. Но там код открытый, да и логи писать он должен, так что можешь оттуда подсмотреть правильные опции для аппаратного ускорения на твоей железке.

Bfgeshka ★★★★★ ()