Для работы нам понадобятся:
1. x264, для кодирования видеопотока.
2. ffmpeg, будем использовать только для кодирования звука, так на мой взгляд проще.
3. mkvtoolnix, для сборки этого чуда в контейнер mkv.

Так как серий у нас много, напишем несложный батник, который пригодится для последующих рипов.

Видео

Сначала приведу код, потом поясню параметры:

"...x264-10b.exe" "...имя файла источника.m2ts" --input-res 1920x1080 --fps 23.976 --profile high10 --preset medium --tune animation --crf=15.5 --me=umh --ref=9 --deblock=-1,-1 --merange=24 --bframes=12 --trellis=1 --video-filter resize:width=854,height=480,method=lancoz --output "...имя выходного файла.264"

 

Параметры

— input-res 1920×1080 --fps 23.976

Подсказываем x264 разрешение и частоту кадров источника. (можно подсмотреть в MediaInfo)

--profile high10

Варианты: baseline, main, high, high10, high422, high444.
Указываем профиль. В данном случае кодируем в 10 бит, поэтому high10, если в 8 — high.

--preset medium

Варианты: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo.
Баланс скорости кодирования и качества. Т.е. выше скорость — хуже качество.
В основном использую medium, slow и иногда veryslow.

--tune animation

Варианты: film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency.
Предустановки, зависящие от входного видео. Для фильмов одно, для аниме другое.

--crf=15.5

Диапазон: 1-50.
Режим постоянного качества и его уровень. Чем меньше — тем лучше качество. Позволяет каждому кадру использовать собственный QP, основанный на сложности кадра.
Подробнее на английском можно почитать тут.
Это лучший метод для однопроходного кодирования.
Возможные варианты на замену: --bitrate или --qp, рассматривать их не будем.

Далее переопределим некоторые параметры, т.к. не все они из пресета medium нам подходят:

--me=umh

Варианты: dia, hex, umh, esa, tesa.
Метод оценки движения полного пикселя. Рекомендую umh.

--ref=9

Диапазон: 1-16.
Количество референсных кадров. Чем больше, тем медленнее будет кодировать. Если следовать спецификациям для поддержки бытовой техники, 4 — максимум для 1080p, и 9 — максимум для 720p.
При 6 и выше особой разницы в качестве не увидите, а скорость кодирования сильно упадет.

--deblock=-1,-1.

Деблокинг, в формате сила:порог. Если коротко, то чем выше сила деблокинга, тем сильнее он применяется, чем выше порог, тем больше блоков ему попадается.
Так как мы кодируем BDRemux аниме, силу и порог желательно снизить, чтобы уменьшить размытие линий. Я использую -1:-1, но встречались рипы и с -2:-2.

--merange=24

Диапазон: 4-64.
Определяет максимальное количество попыток нахождения оптимального варианта при поиске вектора движения макроблока. Чем больше, тем лучше качество.
Не имеет особого смысла ставить больше 24.

--bframes=12

Диапазон: 1-16.
Устанавливает максимальное число параллельных B-фреймов. Большое значение может привести к значительному улучшению эффективности степени сжатия.

--trellis=1

Диапазон: 0-2.
Треллис квантование для повышения эффективности сжатия. 0 — отключено. 1 — Вариант «на макроблоках». 2 — «везде».
1 — хороший компромисс между потерей скорости и эффективностью сжатия. Лучше всего 2, но совместно с --psy-rd, иначе замылит мелкие детали.

Ресайз

 

--video-filter resize:width=854,height=480,method=lancoz

Указываем ширину и высоту, а так же метод. Я использую lancoz.
Варианты: fastbilinear, bilinear, bicubic, experimental, point, area, bicublin, gauss, sinc, lanczos, spline.

Аудио

Для кодирования будем использовать ffmpeg.

"...ffmpegbinffmpeg.exe" -i "...имя файла источника.m2ts" -vn -c:a libvorbis -qscale:a 6 "...имя выходного файла.ogg"

Тут всё просто:

-vn

Отключаем кодирование видео.

-c:a libvorbis -qscale:a 6

Указываем кодер и качество.
Диапазон: 0-10.
Чем больше, тем лучше качество.
6 это ~192 Кбит/с.

Сборка:

Кодируем первую серию.

Открываем GUI mkvtoolnix, выбираем получившиеся видео и аудио, задаем параметры (например, для видео полезно будет задать аспект и частоту кадров, а для аудио — язык дорожки) и жмем скопировать в буфер обмена, получаем что-то вроде:

"...mkvtoolnixmkvmerge.exe" -o "...имя выходного файла.mkv"  "--default-track" "0:yes" "--forced-track" "0:no" "--aspect-ratio" "0:16/9" "--default-duration" "0:23.976fps" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...имя перекодированного видео.264" ")" "--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...имя перекодированного аудио.ogg" ")" "--track-order" "0:0,1:0"

Полный код для 25 серий:

@echo off
for /L %%i in (1,1,9) do (
"...ffmpegbinffmpeg.exe" -y -i "...имя 0%%i.m2ts" -vn -map 0:2 -c:a libvorbis -qscale:a 6 "...имя 0%%i.ogg"
"...x264x264-10b.exe" "...имя 0%%i.m2ts" --input-res 1920x1080 --fps 23.976 --profile high10 --preset medium --tune animation --crf=15.5 --me=umh --ref=9 --deblock=-1,-1 --merange=24 --bframes=12 --trellis=1 --video-filter resize:width=854,height=480,method=lancoz --output "...имя 0%%i.264"
"...mkvtoolnixmkvmerge.exe" -o "...имя 0%%i.mkv"  "--default-track" "0:yes" "--forced-track" "0:no" "--aspect-ratio" "0:16/9" "--default-duration" "0:23.976fps" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...имя 0%%i.264" ")" "--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...имя 0%%i.ogg" ")" "--track-order" "0:0,1:0"
)
for /L %%i in (10,1,25) do (
"...ffmpegbinffmpeg.exe" -y -i "...имя %%i.m2ts" -vn -map 0:2 -c:a libvorbis -qscale:a 6 "...имя %%i.ogg"
"...x264x264-10b.exe" "...имя %%i.m2ts" --input-res 1920x1080 --fps 23.976 --profile high10 --preset medium --tune animation --crf=15.5 --me=umh --ref=9 --deblock=-1,-1 --merange=24 --bframes=12 --trellis=1 --video-filter resize:width=854,height=480,method=lancoz --output "...имя %%i.264"
"...mkvtoolnixmkvmerge.exe" -o "...имя %%i.mkv"  "--default-track" "0:yes" "--forced-track" "0:no" "--aspect-ratio" "0:16/9" "--default-duration" "0:23.976fps" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...имя %%i.264" ")" "--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...имя %%i.ogg" ")" "--track-order" "0:0,1:0"
)
pause

Поскольку у меня две кривые руки, один и тот же код написан дважды.

Всем спасибо за внимание.

UPD:

--input-res 1920x1080 --fps 23.976

Можно не указывать. Это необходимо только если вы скармливаете x264 чистый raw поток.

--profile high10

Так же можно не указывать, т.к.

Битность определяется на этапе компиляции и скодировать в 8 и 10 одним бинарником не выйдет. Так что и смысла выставлять профиль в принципе нет (если только не надо 4:2:2 или 4:4:4).

Спасибо tp7.

Также, на мой взгляд, имеет смысл поднять --subme до 9.

Multicast (англ. групповая передача) — специальная форма широковещания, при которой копии пакетов направляются определённому подмножеству адресатов. Технология IP Multicast использует адреса с 224.0.0.0 до 239.255.255.255. Поддерживается статическая и динамическая адресация. Примером статических адресов являются 224.0.0.1 — адрес группы, включающей в себя все узлы локальной сети, 224.0.0.2 — все маршрутизаторы локальной сети. Диапазон адресов с 224.0.0.0 по 224.0.0.255 зарезервирован для протоколов маршрутизации и других низкоуровневых протоколов поддержки групповой адресации. Остальные адреса динамически используются приложениями. Для определения членов различных групп в локальной сети маршрутизатор использует протокол IGMP. Один из маршрутизаторов подсети периодически опрашивает узлы подсети, чтобы узнать, какие группы используются приложениями узлов. На каждую группу генерируется только один ответ в подсети. Для того чтобы стать членом новой группы, узел получателя инициирует запрос на маршрутизатор локальной сети. Сетевой интерфейс узла-получателя настраивается на прием пакетов с этим групповым адресом. Каждый узел самостоятельно отслеживает свои активные групповые адреса, и когда отпадает необходимость состоять в данной группе, прекращает посылать подтверждения на IGMP — запросы. Результаты IGMP — запросов используются протоколами групповой маршрутизации для передачи информации о членстве в группе на соседние маршрутизаторы и далее по сети.

VLC media player (первоначально от VideoLAN Client) — это свободный медиаплеер.
Программа работает на большинстве современных операционных систем, в частности на:
* GNU/Linux
* BSD (FreeBSD, NetBSD, OpenBSD, Apple Darwin, Mac OS X)
* Solaris
* и других разновидностях UNIX…
* Семейство BeOS (BeOS, Zeta-OS, Haiku-OS)
* QNX
* MorphOS
* Microsoft Windows
* Microsoft Windows CE
Плеер VLC можно использовать в качестве сервера для трансляции потока аудио/видео по сети (поддерживает протоколы IPv4 и IPv6). Для воспроизведения файлов мультимедиа не требуется установка дополнительных кодеков, они уже «встроены» в программу. VLC может воспроизводить DVD и потоковое незашифрованное (бесплатное) видео (IPTV) и Интернет-радио. Также программа может записывать потоковое аудио/видео на компьютер. VLC хорошо воспроизводит испорченные файлы.

Для вещания был выбран слабенький Pentium III 800MHz c 512 Mb RAM и с дисковой подсистемой в RAID1. На все это железо воздрузилась Gentoo Linux:

Portage 2.1.6.4 (default/linux/x86/2008.0, gcc-4.1.2, glibc-2.6.1-r0, 2.6.25-gentoo-r8 i686)
=================================================================
System uname: Linux-2.6.25-gentoo-r8-i686-Pentium_III_-Coppermine-with-glibc2.0
Timestamp of tree: Mon, 09 Feb 2009 22:15:02 +0000
app-shells/bash: 3.2_p39
dev-lang/python: 2.4.4-r13, 2.5.2-r7
dev-python/pycrypto: 2.0.1-r6
sys-apps/baselayout: 1.12.11.1
sys-apps/sandbox: 1.2.18.1-r2
sys-devel/autoconf: 2.13, 2.63
sys-devel/automake: 1.7.9-r1, 1.9.6-r2, 1.10.2
sys-devel/binutils: 2.18-r3
sys-devel/gcc-config: 1.4.0-r4
sys-devel/libtool: 1.5.26
virtual/os-headers: 2.6.27-r2


VLC был собран со следующими флагами:

media-video/vlc-0.9.7 USE="a52 aac ffmpeg hal libgcrypt mp3 mpeg ncurses stream x264 -X -aalib -alsa (-altivec) -arts -atmo -avahi -bidi -cdda -cddax% -cddb -cdio -dbus -dc1394 -debug -dirac -directfb -dts -dvb -dvd -esd -fbcon -flac -fluidsynth -fontconfig -ggi -gnome -gnutls -httpd -id3tag -jack -kate -libass -libcaca -libnotify -libsysfs -libv4l2 -lirc -live -lua -matroska -mmx -modplug -musepack -nsplugin -ogg -opengl -optimisememory -oss -pda% -png -pulseaudio -pvr -qt4 -remoteosd -rtsp -run-as-root% -samba -schroedinger -sdl -sdl-image -seamonkey -shout -skins -speex -sse -svg -svga -taglib -theora -truetype -twolame -upnp -v4l -v4l2 -vcdinfo -vcdx -vlm -vorbis -win32codecs -xinerama -xml -xosd -xv -zvbi (-vcd%)"

Соответственно можно поиграть флагами кому как хочется, обязателен флаг stream. Описание флагов можно подсмотреть командой equery u vlc из пакета gentoolkit. Единственное на что хочется обратить внимание, это флаг optimisememory. Собирал с ним 3 предыдущих версии, процесс за пару дней сжирал на 100% ресурсы процессора и умирал.

Для запуска я писал демона, который удалял старый плейлист, создавал новый и запускал собственно vlc в screen:
vlc -v /home/ftp/pub/playlist.m3u --sout '#standard{access=udp{ttl=15},mux=ts{tsid=22,pid-video=23,pid-audio=24,pid-pmt=25,use-key-frames},dst=[multcast ip]}' --random --loop --volume 100

Screen, а не демон, был выбран для паралельного запуска нескольких каналов, для более простого и удобного мониторинга процесса. PID'ы мне нужны чтобы STB и MidlleWare все правильно скушали. Файлы конвертировались в:

Формат : MPEG Video
Версия формата : Version 2
Настройка матрицы формата : Standard
Режим расчёта битрейта : Переменный
Битрейт : 7 762 Кбит/сек
Ширина : 1 920 пикс.
Высота : 1 080 пикс.
Соотношение кадра : 16/9
Частота кадров : 30,000 кадр/сек
Колориметрия : 4:2:0
Тип развёртки : Прогрессивная


Формат : MPEG Audio
Версия формата : Version 1
Профайл формата : Layer 2
Режим расчёта битрейта : Постоянный
Битрейт : 64,0 Кбит/сек
Канал(ы) : 2 канала(ов)
Частота : 44,1 КГц
Разрешение : 16 бит


Производительность:
up 70 days, 17:08, load average: 0.16, 0.17, 0.11

Загрузка сети:
30 second input rate 8718000 bits/sec, 801 packets/sec
30 second output rate 2000 bits/sec, 2 packets/sec

 

 

http://habrahabr.ru/post/51667/

С IPTV пришлось познакомиться поближе, когда в компании интернет-провайдера где я работал, решили организовать вещание IPTV. Выяснилось, что вещание осуществляется в linux и программой vlc, которая по слухам единственная в своем роде. Была установлена тарелка и DVB-карта SkyStar2, которая предположительно должна была без проблем заработать в linux'e. Так и было со всеми новыми машинами, где была установлена ubuntu server. На Debian заработало только после обновления ядра. Настройка прошла относительно легко, благо на то время уже было несколько статей на эту тему и документация к vlc была тоже очень полезна. После запуска начались некоторые проблемы с пропаданием звука и видео на каналах и другие проблемы, описанные ниже. После их появления были написаны скрипты, устраняющие эти проблемы. Сейчас на них работает 3 сервера с 5 dvb-картами в общей сложности и вещается 23 канала с 3х спутников. Под катом — перечисление проблем, которые могут появиться после запуска вещания IPTV через VLC в Linux и то как с ними бороться. Бороться будем с помощью bash.

Первоначальная настройка и запуск вещания IPTV хорошо описана в статье «Прием спутниковых тв каналов в linux».
Основные проблемы при вещании IPTV: утечка памяти и пропадание видео или звука в одном из каналов.

Утечка памяти

Проблема утечки памяти решается либо 1) перезагрузкой демона vlc раз в день или больше по необходимости через crontab либо 2) периодической проверкой свободной памяти и перезагрузкой демона при уменьшении сводной памяти до определенного значения.

1)
crontab:

 # Перезагружаем vlc в 3 часа ночи
0 3 * * * /usr/local/script/vlc_regular_reload.sh

vlc_regular_reload.sh:

#!/bin/bash
 echo "`date`;VLC regular reload" >> /var/log/vlc/vlc_restart.log
 /usr/local/script/vlc_starter.sh
chmod +x /usr/local/script/vlc_regular_reload.sh

2)
crontab:

#Проверяем каждые 5 минут
*/5 * * * * /usr/local/script/memory_check.sh

memory_check.sh:

#!/bin/bash
 #Получаем переменную свободной памяти
 free_mem=$(free -m | grep ^M | awk -F' ' '{print $4 }')
 #Указываем предельное значение свободной памяти
 mem_limit=16
 #Если свободной памяти меньше или же она совпадает со значением предела то происходит перезагрузка демона
 if [ $free_mem -le $mem_limit ]
 then
 echo "`date`;Memory Overload" >> /var/log/vlc/vlc_restart.log
 /usr/local/script//vlc_starter.sh
 fi
 chmod +x /usr/local/script/memory_check.sh

Пропадание видео или звука

Для решения проблемы необходимо периодически проверять наличие видео и звука в каналах.
Реализация скриптов на примере вещания двух каналов. Вещание идет в два потока — оригинального и сжатого. Иногда помогает перезагрузка проблемного канала, но иногда необходима полная перезагрузка демона.

Для работоспособности скрипта необходимо запустить следующие команды:

cp /usr/bin/vlc /usr/bin/vlc2
 touch /home/desecho/vlc/run.sh
 chmod +x /home/desecho/vlc/run.sh

Скрипт запуска и перезагрузки каналов:

vlc_starter.sh:

#!/bin/bash
 echo "`date`;Reloaded" >> /var/log/vlc/vlc_restart.log
#Выключаем все запущенные vlc процессы
 killall -9 vlc
 #Запуск вещания
 vlc --no-stats -vvv --color --daemon --ttl 12 --ts-es-id-pid --dvb-adapter0 --programs=13,14 dvb: --dvb-frequency=10995000 --dvb-srate=20000000 --dvb-voltage=13 --sout'#duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8001},select="program=13",dst=std{access=http,mux=asf,url=0.0.0.0:8002},select="program=14"}'
 #Ждем несколько секунд для инициализации вещания
 sleep 5
 #Вещаем сжатый поток в 820Kbit/s видео и 70Kbit/s аудио
 vlc http://127.0.0.1:8001 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8011}'
 vlc http://127.0.0.1:8002 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8012}'
 chmod +x /usr/local/script/vlc_starter.sh

Скрипт проверки каналов:
vlc_restarter.sh:

#!/bin/bash
 #Запись канала
 #$1 - id порта сжатого канала
 function rec {
 #Запись видео
 b="vlc2 http://127.0.0.1:80$1 -vvv --color --daemon --noaudio --sout '#duplicate{dst=std{access=file,mux=asf,dst="/home/desecho/vlc/0$1.avi"}}'"
 #Создание временного исполняемого файла - такой способ необходим из-за наличия в строке запуска vlc различных ковычек
 echo $b > /home/desecho/vlc/run.sh
 /home/desecho/vlc/run.sh
 #Запись аудио
 b="vlc2 http://127.0.0.1:80$1 -vvv --color --daemon --novideo --sout '#duplicate{dst=std{access=file,mux=asf,dst="/home/desecho/vlc/0$1.mp3"}}'"
 echo $b > /home/desecho/vlc/run.sh
 /home/desecho/vlc/run.sh
 sleep 5
 killall -9 vlc2
 }
#Полная перезагрузка vlc
 #$1 - имя канала
 function reload {
 echo "`date`;$1 - Reload" >> /home/desecho/vlc/logs/vlc_restart.log
 /home/desecho/vlc/vlc_starter.sh
 }
#Проверка канала
 #$1 - id порта сжатого канала
 #$2 - имя канала
 function check {
 #Смотрим размер видео
 y="$(du /home/desecho/vlc/0$1.avi | grep -oE --regexp='[0-9]+' | sed -n '1p')"
 #Проверяем пустой ли файл
 if [ $y -gt 10 ] ; then
 x011=1
 else
 x011=0
 fi
 #Смотрим размер аудио
 y="$(du /home/desecho/vlc/0$1.mp3 | grep -oE --regexp='[0-9]+' | sed -n '1p')"
 if [ $y -gt 10 ] ; then
 x012=1
 else
 x012=0
 fi
 echo "    $2 - $x011 $x012" >> /home/desecho/vlc/logs/vlc_restart.log
 let x01=x011+x012
 #Если отсутствует звук или видео, то переменная z=0
 if [ $x01 != 2 ]
 then
 z=0
 else
 z=1
 fi
 }
#Полная проверка
 #$1 - id порта сжатого канала
 #$2 - имя канала
 function check_full {
 #Запись канала
 rec $1
 #Проверка на отсутствие видео или звука
 check $1 $2
 #Если видео и звук в норме то помечаем переменную z канала
 if [ $z = 1 ] ; then
 z[$1]=1
 fi
 }
#Перезагрузка канала
 #$1 - id порта сжатого канала
 #$2 - имя канала
 #$3 - id порта исходного канала
 function restart {
 echo "`date`;$2 - Restart" >> /home/desecho/vlc/logs/vlc_restart.log
 #Выключение неработающего канала
 a="$(ps -C vlc -o '%p%a' | grep "http://127.0.0.1:80$3 -vvv --daemon --color --sout" | grep -oE --regexp='[0-9]+' | sed -n '1p')"
 kill $a
 #Перезапуск вещания канала
 b="vlc http://127.0.0.1:80$3 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:80$1}'"
 echo $b > /home/desecho/vlc/run.sh
 /home/desecho/vlc/run.sh
 }
#Перезагрузка канала
 #$1 - id порта сжатого канала
 #$2 - имя канала
 #$3 - id порта исходного канала
 function fix {
 #Если нет видео или звука на канале то перезагружается канал
 if [ ${z[$1]} != 1 ] ; then
 restart $1 $2 $3
 sleep 5
 #повторная проверка
 check_full $1 $2
 fi
 #Если по прежнему нет звука то перезагружаем VLC полностью
 if [ ${z[$1]} != 1 ] ; then
 reload $2
 exit
 fi
 }
 #Присваиваем значение 0 по умолчанию переменным z каналов
 z[11]=0
 z[12]=0
#Проверка канала на отсутствие видео/звука
 check_full 11 perviy
 #Перезагрузка канала при проблемах с видео/звуком
 fix 11 perviy 01
check_full 12 rossiya
 fix 12 rossiya 02
echo "`date`;DVB - Status: Stable" >> /home/desecho/vlc/logs/vlc_restart.log
 chmod +x /usr/local/script/vlc_restarter.sh

Осталось добавить запись в crontab:

*/5 * * * * /usr/local/script/vlc_restarter.sh

В итоге получаем систему, которая автоматически восстановит вещание каналов при пропадании видео или аудио. Все действия скриптов восстановления вещания будут писаться в лог файл.
Удачного вещания!

Для нейтрализации утечки памяти можно собрать vlc без флага «optimisememory» либо попробовать обновить vlc, см. статью
«Вещание видеофайлов с помощью VLC multicast. С теорией».

http://habrahabr.ru/post/66351/