Рендеринг видео формата PAL с DV камеры и его сжатие в h264

Материал из AlexNook
Перейти к: навигация, поиск

Время от времени приходится захватывать со старенькой miniDV камеры видео и, отредактировав его в моём любимом Sony Vagas, рендерить его и пережимать для дальнейшего хранения на дисках. Т.к. камера старая то, первые мои видео были не в сравнение хуже по всем параметрам и зачастую даже неправильно захваченные (потеря разрешения) и неправильно сжаты. В общем со временем я получал понемногу новые знания в этой области, появлялись новые кодеки, росла мощь компьютера.

В данном материале делаю себе памятку по рендерингу видеоматериала, подготовленного в Sony Vagas и по его сжатию.

Рендеринг видео в формате PAL в Sony Vegas

Будем считать, что у нас уже создан проект в Sony Vagas, всё нарезано, склеено, наложена музыка или другие аудио эффекты, выполнены все необходимые переходы и другие преобразования. Осталось добавить пару картинок (фотографий), настроить их и указав параметры рендеринга - выполнить его.

Настройка параметров вставленных изображений

Т.к. формат видео PAL подразумеват, что у нас PAR (Pixel Aspect Ratio) не равно 1:1, а фотографии с цифрового фотоаппарата выполнены как раз в формате PAR = 1:1, то использование стандартного разрешение фотографий 720 \times 576 (стандартное разрешение PAL) не пройдёт.

PAR у стандарта PAL 576i (то есть 576 строк изображения по вертикале с черезстрочной развёрткой) равен \frac{59}{54}, поэтому на каждый пиксель PAL развёртки приходится 1.09259 обычных, квадратных пикселя. Соответственно для того, чтобы наша фотография полностью покрывала собой видеокадр, её разрешение по горизонтали должно быть 720 \times \frac{59}{54} = 720 \times 1,09259 = 787 .

Таким образом, для вставки в видеоролик надо подготовить фотографии с разрешением 787 \times 576 . Если кликнуть на фотографии правой кнопкой мыши, то они должны иметь следующие свойства:

Настройка параметров проекта

Не совсем понял важность этих настроек, но по видимому их надо выставлять в самом начале использования Sony Vagas'а, а не в самый последний момент перед рендерингом.

Важно выбрать правильный Pixel Aspect Ratio, ширину и высоту изображения.

Чересстрочная развёртка (гребёнка на видео, расчёска) и её решение в SonyVegas

Note: не лучший по качеству вариант, но удобен своей быстротой, так как работает в SonyVegas из коробки

Видео с камеры поступает в чересстрочном формате (interlaced), что в принципе не так удобно и хорошо в глобальном смысле, но является необходимость для экономии ресурсов. Даже современное вещание HD идёт со спутника в формате 1080i, то есть с гребёнкой. Многие плееры на компьютере и телевизоры автоматом решают эту проблему. Но конечно всегда приятнее иметь полноценные кадры, а не полукадры.

Решить эту проблему можно прямо в SonyVegas. Для этого надо надо обратить внимание на прогрессивный скан изображения, чтобы не было черезстрочной развёртки и не забыть выбрать метод деинтерлейсинга (deinterlace method). Иначе изображение получается из двух полукадров и в моменты активного движения на экрне появляются горизонтальное расслоение картинки.

Для аудио я поставил частоту дискритизации 48 kHz, а битность 24 бита, т.к. при съёмке на камере в меню тоже выбираю всегда для звука 24 бита. Остальное более детально видно из скриншотов.

Чересстрочная развёртка (гребёнка на видео, расчёска) и её решение в YADIF

Не смотря на то, что из коробки SonyVegas решает проблему гребёнки лучше использовать сторонние библиотеки по deinterlacing видео потока, т.к. метод blendfields не очень хорош.

Самый простой и распространённый фильтр, решающий этот вопрос это yadif. Чтобы его использовать предварительно нужно срендерить проект в SonyVegas без устранения чересстрочности, чтобы не терять в качестве материала, а потом уже устранить её более качественным методом, который не так портит сильно картику как метод blend fields. Параметры рендеринга проекта показаны на скриншотах ниже.
Note: Важно отметить, что у обычного PAL/DV первым идёт Lower field (bottom). Для HD DV всё наоборот.
Для моего случая нашёлся даже встроенный в SoneVegas профиль.

Как действовать с готовым отрендеренным чересстрочным видео посмотрим чуть дальше.

Рендеринг прогрессивного (DeInterlaced) видео потока и его настройки

Меню Render As

После того, как все выполнено, то можно приступать к самому процессу рендеринга. Нажимаем file->render as и приступаем к настройкам.

Первым делом выбираю куда сохранить файл с видео, затем формат сохранения. Тут важно выбрать Avi Без сжатия. Убираем галку Strech video to fill output frame size (do not letterbox), если она стояла уже. Затем нажимаем кнопочку Custom для того, чтобы настроить шаблон рендеринга (несжатое видео - uncompressed) более детально.

Здесь как и везде ранее я ставлю настройки на максимальное качество. Больше об этом не повторяюсь. Затем выбираем формат изображения - PAL DV и соответственно размер кадра, частоту кадров - 25/с, прогрессивную развёртку, и формат видео - Не сжатое (video format - uncompresed). Последние две галки, стоящие у меня очень сомнительны. Потому как альфаканала у меня вроде как и не было даже на вставленных в видеоряд фотографиях (формат jpg). Т.к. я отдельно рендерю и готовлю видео и звук, то галочку Include Audio можно убрать. Иначе посоветовал бы использовать приведённые на картинке параметры.

Рендеринг чересстрочного (Interlaced) видео потока и его настройки

В принципе тут всё практически тоже самое, что и с прогрессивной развёрткой - настраиваем все параметры на максимум, ставим несжатое видео, но делаем поправку на interlaced поток.

Меню Render As

Важно обратить внимание на поле Field Order - Lower field first Остальное не отличается от случая удалениея расчёски прямо в SonyVegas на лету. Посмотреть соответствующие картинки можно ниже.

Устранение чересстрочности видео файла с помощью YADIF - DeInterlace видео потока

Для устранения гребёнки я использую один из самых простых, но в то же время эффективных методов. Это использование библиотеки Yadif + VirtualDub + AviSynth.

Для начала требуется установить AviSynth. После чего установить VirtualDub 32x и потом, для VirtualDub 32x поставить yadif плагин.

После чего пишем следующий простенкий скриптик для avisynth, который будет производить deinterlace.

  • Первой строчкой мы подгружаем плагин Yadif (нужную DLL'ку)
  • Затем указываем путь к файлу с несжатым чересстрочным видео потоком
  • Далее меняем схему хранения информации о цвете (изначально после SonyVegas у нас идёт RGB24 (8 бит на канал), что не совсем устраивает
  • Наконец запускаем сам процесс устранения чересстрочности yadif(0,0):
    • Первым параметром мы указываем метод обработки: mode = 0 : temporal and spatial interlacing check (default).
    • Вторым пораметром идёт указание на то, что у нас первым идёт lower field (PAL DV стандарт именно таков): order = 0 : Bottom field first.
File: DeInterlace_with_YADif_x86_virtualDub.avs
  1. LoadCplugin("c:\Program Files (x86)\virtualDub32\plugins32\yadif.dll")
  2. AVISource("BlueBay_2007_uncompressed.avi")
  3. ConvertToYUY2()
  4. yadif(0,0)
VirtualDub open AVS script


Теперь запускаем VirtualDub и загружаем наш видеопроект выбрав в меню File -> Open video file ctrl+O и указав в проводнике путь к нашему только что созданному AVS скрипту.

В программе VirtualDub настройки могут остаться все в умолчальных значениях, так как они выставленны очень универсально. В нашем случае в пункте меню Audio идёт Direct Stream Copy, а в пункте Video стоит Full processing mode, при этом можно на всякий случай глянуть там же Filters, Frame Rate, color depth, compression, но там должно быть всё в порядке.

Теперь нужно выбрать File -> Save as AVI и начать процесс обработки видео.

Рендеринг аудио

Для этой операции можно использовать и предыдущий раздел, убрав только галочку у настроек видео - Include Videio и поставив в аудио настройках - include audio. А потом получившееся несжатое аудио выцепить из avi контейнера и обработать как уже будет угодно. Но я не маньяк по поводу аудио и меня вполне устроили варианты сжатия аудио сразу в Sony Vagas.

Использовать шаблоны без потери качества типа flac я не стал. Попробовал сперва AC-3 studio 192 kbps, но в результате окончательной обработки и соединения видео и аудио в одном контейнере тольк VLC стал нормально проигрывать окончательный результат. Для нормальной работы Media Player Classic потребовалась установка AC3 filter. В общем как итог вернулся к старому доброму mp3.

Выбрал 256 kbps при 48 kHz, затем отказался от Joint Stereo и остался на старом добром Stereo варианте. В итоге получил вполне приемлимое качество результата. Аудио у нас теперь полностью готово, срендерино и сразу же сжато уже. Приступаем к сжатию видео потока.

Сжатие видео потока в Windows

Настройки MeGUI для сжатия видео

Для этого я ипользовал програмку x264 (бесплатную реализацию h264 кодека), а для работы с консольной програмкой - бесплатную графическую оболочку MeGUI.

В новой версии значительно упростился вариант выбора настроек, что сильно облегчает работу не эксперту в этом деле (как я). Для максимального качества и жертвуя скоростью выбраем основную настройку в режим Placebo =). Битрейт для формата PAL 720 \times 576 мне кажется в 4000 очень даже неплохим и перекрывающим все потребности (тут надо ещё учесть, что это не какой-нибудь там DivX или подобное, а h264). Колличество проходов выбираме 3. Тут главное перед финальным стартом протестировать на коротких роликах (срендерить в Вегасе ролики по 10-20 секунд), т.к. перед третьим проходом полученный после первых двух результат перезаписывается (надо не забыть поставить галочку - не спрашивать об этом больше!).

Хотя разработчики x264 пишут, что настройка в 3 прохода это ерунда, разработчики MeGUI утверждают у себя обратное. При двух и трёх проходах размер исходного видео меняется. По качеству я серьёзных отличий не заметил. Если вы не торопитесь и мощность компьютера позволяет, то третий проход лишним думаю не будет, ну уж точно хуже не сделает.

AviSynth

После настройки качества сжатия, я выбираю всегда контейнре mp4, (хотя если верить чётким доводам в обсуждениях на том же формуе rutracker.org (бывший torrents.ru), то mkv лучше. Но тут дело не в этом. После сжатия видео при его просмотре мы имеем вполне разумные умолчальные настройки Display Aspect Ratio как 5:4, т.к. формат кадра у нас 720 \times 576, однако не будет забывать что пиксели у нас не квадратные и формат кадра должен быть 4:3. Можно в принципе перед просмотром в том же Media Player Classic поменять настройки вывода изображения (View -> Video Frame -> Override Aspect Ratio), но можно это прописать перед сжатием видео файла ещё в AviSynth скрипте (не совсем уверен, что это правильный метод и возможно он где-то не сработает и надо будет всё же руками при просмотре выставлять Display Aspect Ratio как 4:3).

File: AviSynth_for_MeGUI.avs
  1. AVISource("egypt9.avi")
  2. ConvertToYV12()
  3. global MeGUI_darx = 4
  4. global MeGUI_dary = 3
  5. return last

Объединяем видео и аудио в контейнере mp4

Окно программы Yamb

Для этого я использую очень удобную и простую програмку - Yamb (Yet Another MP4Box UI). Пользоваться программой добно и просто. Весь процесс занимает несколько минут, а на выходе мы получаем готовое видео в контейнере mp4. Всё что требуется это выбрать мультимедиа файлы для слияния в контейнере (это наше mp3 аудио файл и mp4 видео файл). Всё остальное программа делает сама.

Сжатие видеопотока в Linux

Имея свой сервер, который работает круглосуточно, я подумал, что было бы здорово использовать его ресурсы для сжатия видео кодеком h264, не загружая не несколько дней 100% нагрузкой свой основной рабочий компьютер.

Для этого я использую ffmpeg, запущенный в screen'е. Про то, что это и как установить и запустить я писать не будут. Это вопрос другой статьи. Тут приведу два скрипта, которые реализуют два разных подхода к сжатию видео.

Оба скрипта запускаются по принципу

./script video.avi

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

Затем следует настройка видео потока. Можно настроить соотношение сторон при просмотре - DAR (display aspect ratio), что в нашем случае PAL DV равно \frac{4}{3}, SAR, равное простому соотношению колличества пикселей по ширине и высоте, видео битрейт (только для первого подхода в случае ручной установки битрейта) (для себя в случае видео PAL 720 \times 576 я выбрал 10 000 килобит/с, указать разрешение, кодек, колличество кадров в секунду, формат пикселей yuvj420p, Constant Rate Factor (только в случае второго подхода с переменным битрейтом).

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

Установка битрейта в ручную

Этот подход обрабатывает видео в 2 прохода и заранее позволяет установить постоянный битрейт для видео потока, что в свою очередь помогает заранее определить размер выходного файла. Этот метод я и использую как основной для себя. При этом ниже как раз указан рабочий скрипт и те параметры кодирования, которые применяются для PAL DV у меня.

File: encode_x264_const_video_bitrate.sh
  1. #!/bin/bash
  2.  
  3. ##############
  4. # Two pass encoding using
  5. # Constant Bit Rate and Placebo profile
  6. # read more about it here
  7. # https://trac.ffmpeg.org/wiki/x264EncodingGuide
  8. # http://mewiki.project357.com/wiki/X264_Settings#Ratecontrol
  9. ##############
  10.  
  11.  
  12. #------- Check input vars -----------
  13. ARGS=1
  14. if [ $# -ne "$ARGS" ]
  15. then
  16.   echo "Usage: `basename $0` Video_file_name"
  17.   echo "Example: `basename $0` my_video.avi"
  18.   exit 0
  19. else
  20.   echo "args OK"
  21.   VideoFileName=$1
  22.   filename=$(basename $VideoFileName)
  23.   filename=${filename%.*}
  24. fi
  25.  
  26.  
  27. #----Variables:-------
  28. #audio
  29. audioDiscr="48000"
  30. audioBitRate="320k"
  31. audioChannels="2"
  32. audioCodec="libmp3lame"
  33.  
  34. #video
  35. aspectratio="-aspect 4:3 -vf setsar=5:4" #aspect=DAR; SAR=Width:Height (in pixels); PAR=DAR:SAR
  36. videoBitRate="10000k"
  37. videoSize="720x576"
  38. videoCodec="libx264"
  39. videofps="25"
  40. rgb24toyuvj420p="-pix_fmt yuvj420p" #use it only if we have source in RGB24 after SonyVegas for example and want to force ffmpeg to use yuvJ420p instead of yuv420p (see https://frapsforum.com/threads/fraps-lossless-rgb-ffmpeg-washed-out-mp4.1342/ )
  41.  
  42. #other
  43. deinterlace="" #"-deinterlace" #try not to use it ever. instead use aviSynth and Yadif
  44. threads="0"
  45. sstime="00:00:55" #screenshot time (HH:MM:SS)
  46. testpiece="" #-ss 00:00:05 -t 00:00:01" #начать с 5ой секунды и длиной в 1 секунду
  47.  
  48. #------First Pass --------
  49. nice -n 19 ffmpeg -y -i $VideoFileName -pass 1 \
  50. $rgb24toyuvj420p -s $videoSize -r $videofps -vcodec $videoCodec -b:v $videoBitRate \
  51. -vpre placebo_firstpass -threads $threads \
  52. $testpiece $deinterlace \
  53. -f mp4 -an $aspectratio $filename.mp4
  54.  
  55. #------Second Pass --------
  56. nice -n 19 ffmpeg -y -i $VideoFileName -pass 2 \
  57. -c:a $audioCodec -ar $audioDiscr -b:a $audioBitRate -ac $audioChannels \
  58. $rgb24toyuvj420p -s $videoSize -r $videofps -vcodec $videoCodec -b:v $videoBitRate \
  59. -vpre placebo -threads $threads \
  60. $testpiece $deinterlace \
  61. -f mp4 $aspectratio $filename.mp4
  62.  
  63. #----Make SS for comparison----
  64. ffmpeg -i $VideoFileName $rgb24toyuvj420p -an -ss $sstime -r 1 -vframes 1 -y source_$filename.jpg
  65. ffmpeg -i $filename.mp4 -an -ss $sstime -r 1 -vframes 1 -y encoded_$filename.jpg

Динамический видео битрейт

Данный подход позволяет установить уровень требуемого качества сжатия (от без потерь до достаточно сильно зажатого видео). Работает скрипт в 1 проход. Установив уровень качества видео потока, мы даём системе на откуп подборку видео битрейта. Размер файла мы контролировать не сможем уже.

Note: crf = 15 примерно соответствует битрейту 10 000, ну или капельку хуже, и имеет битрейт на выходе в районе 8-9 тысяч.
File: encode_x264_crf.sh
  1. #!/bin/bash
  2.  
  3. ##############
  4. # One pass encoding using
  5. # Constant Rate Factor (CRF) and Placebo profile
  6. # read more about it here
  7. # https://trac.ffmpeg.org/wiki/x264EncodingGuide
  8. # http://mewiki.project357.com/wiki/X264_Settings#Ratecontrol
  9. ##############
  10.  
  11.  
  12. #------- Check input vars -----------
  13. ARGS=1
  14. if [ $# -ne "$ARGS" ]
  15. then
  16.   echo "Usage: `basename $0` Video_file_name"
  17.   echo "Example: `basename $0` my_video.avi"
  18.   exit 0
  19. else
  20.   echo "args OK"
  21.   VideoFileName=$1
  22.   filename=$(basename $VideoFileName)
  23.   filename=${filename%.*}
  24. fi
  25.  
  26.  
  27. #----Variables:-------
  28. #audio
  29. audioDiscr="48000"
  30. audioBitRate="320k"
  31. audioChannels="2"
  32. audioCodec="libmp3lame"
  33.  
  34. #video
  35. aspectratio="-aspect 4:3 -vf setsar=5:4" #aspect=DAR; SAR=Width:Height (in pixels); PAR=DAR:SAR
  36. videoSize="720x576"
  37. videoCodec="libx264"
  38. videofps="25"
  39. constantRateFactor="15.0"
  40. rgb24toyuvj420p="-pix_fmt yuvj420p" #use it only if we have source in RGB24 after SonyVegas for example and want to force ffmpeg to use yuvJ420p instead of yuv420p (see https://frapsforum.com/threads/fraps-lossless-rgb-ffmpeg-washed-out-mp4.1342/ )
  41.  
  42. #other
  43. deinterlace="" #"-deinterlace" #try not to use it ever. instead use aviSynth and Yadif
  44. threads="0"
  45. sstime="00:00:01" #screenshot time (HH:MM:SS)
  46. testpiece="-ss 00:00:05 -t 00:00:01" #начать с 5ой секунды и длиной в 1 секунду
  47.  
  48.  
  49. #------Encoding --------
  50. nice -n 19 ffmpeg -y -i $VideoFileName \
  51. -c:a $audioCodec -ar $audioDiscr -b:a $audioBitRate -ac $audioChannels \
  52. $rgb24toyuvj420p -s $videoSize -r $videofps -vcodec $videoCodec -crf $constantRateFactor \
  53. -vpre placebo -threads $threads \
  54. $testpiece $deinterlace \
  55. -f mp4 $aspectratio $filename.mp4
  56.  
  57. #----Make SS for comparison----
  58. ffmpeg -i $VideoFileName $rgb24toyuvj420p -an -ss $sstime -r 1 -vframes 1 -y source_$filename.jpg
  59. ffmpeg -i $filename.mp4 -an -ss $sstime -r 1 -vframes 1 -y encoded_$filename.jpg

Ссылки

А теперь несколько полезных ссылочек: