Показаны сообщения с ярлыком mkv. Показать все сообщения
Показаны сообщения с ярлыком mkv. Показать все сообщения

2010-07-01

Чистим MKV-файлы от ненужных треков

Имеем: кучу файлов MKV (типа file-01.mkv, file-02.mkv ... file-24.mkv), в каждом из которых множество треков (видео, аудио, субтитры).
Нужно: оставить в них только одну видео- и одну звуковую дорожку.

Для работы с MKV нам понадобится одна утилита: mkvtoolnix
sudo apt-get install mkvtoolnix

Чтобы посмотреть, какие треки есть в файле, сделаем так:
mkvinfo file-01.mkv

Получаем довольно полную картину состава файла. Но нам нужна только часть, поэтому отфильтруем ненужное:
mkvinfo file-01.mkv | grep -Gi 'A track\|track number\|track type\|codec id\|Language'

| + A track
|  + Track number: 1
|  + Track type: video
|  + Codec ID: V_MPEG4/ISO/AVC
|  + Language: und
| + A track
|  + Track number: 2
|  + Track type: audio
|  + Codec ID: A_AAC
|  + Language: rus
| + A track
|  + Track number: 3
|  + Track type: audio
|  + Codec ID: A_AAC
|  + Language: jpn
| + A track
|  + Track number: 4
|  + Track type: subtitles
|  + Codec ID: S_TEXT/ASS
|  + Language: rus

Запоминаем номера нужных треков и их содержимое. Например, мне нужны только первый и третий трек. Берем их из исходного файла и создаем новый, содержащий только эти два трека:
mkvmerge file-01.mkv --vtracks 1 --atracks 3 -o file-01_.mkv
Если в файле только один видеотрек (как обычно и бывает), то достаточно и этого:
mkvmerge file-01.mkv -a 3 -o file-01_.mkv
Если субтитры тоже нужно включить, то
mkvmerge file-01.mkv -a 3 --stracks 4 -o file-01_.mkv

Ну а теперь, для пробы создадим копии первых пяти файлов, но только с нужными нам 1 и 3 треками:
for i in *{01..05}.mkv; do mkvmerge "$i" -a 3 -o "${i%.mkv}_.mkv"; done

Все получилось? Тогда можно и остальные обработать.

P.S. На всякий случай, если вы хотите вытащить оттуда субтитры в отдельный файл, то никто вам не мешает. К примеру, так:
mkvextract tracks file-01.mkv -c UTF-8 4:file-01.ass

2009-02-04

Кодирование видео: mencoder и поиск совершенства

Продолжая исследовать вопрос кодирования видео никак не могу найти универсальный вариант, чтобы написать скрипт конвертирования для Nokia N810 раз и навсегда. AVI - одним методом, MP4 другим, MKV - вообще третьим. То изображение жужжит как ненастроенный телевизор, то звук не совпадает с видео, то картинка бешено мчится вперед... Хотел все сделать одной командой для mencoder с набором параметров, но в итоге отказался от этого по ряду причин. И вот что решил: кодировать надо с несколько этапов. Для начала раздель видео и звук, и работать с ними отдельно. Потом получившиеся дорожки, а при необходимости и субтитры собирать в один MKV-файл.
Вот что получилось: [файл "~/bin/video2nokia"]

#!/bin/bash

# Получение аудиодорожки. Используется mplayer с опциями
mplayer "$1" -vo null -vc null -ao pcm:fast:file=audio.wav

# Кодирование аудиодорожки в mp3.
lame -V0 -h -b 160 --vbr-new audio.wav audio.mp3

# Кодирование видеодорожки без звука, в два прохода
mencoder -o /dev/null \
-nosound \
-ovc xvid
-xvidencopts vhq=1:bitrate=700:autoaspect:pass=1 -vf pullup,softskip,hqdn3d,scale=-2:240 "$1"
mencoder -o video.avi \
-nosound \
-ovc xvid -xvidencopts vhq=1:bitrate=700:autoaspect:pass=2 -vf pullup,softskip,hqdn3d,scale=-2:240 "$1"

# Слияние в файл MKV-файл
mkvmerge -o $1.mkv --language 0:und --default-track 0:yes -d 0 -A -S video.avi --default-track 0:yes -a 0 -D -S audio.mp3 --track-order 0:0,1:0

# Удаление отработанных файлов
rm audio.wav audio.mp3 video.avi


Итог: работет как надо. Все конвертирую одним скриптом, паример:
video2nokia file.avi

2008-12-12

Утилитка для получения расширения файла

Ну что такое! Может быть, я чего-то не понял?
Понадобилось для скрипта по конвертированию видеофайлов вычислять расширение файла, чтобы заменить его на другое. Например, чтобы сделать такой скрипт:

#!/bin/bash
mkvmerge -o ${1%avi}mkv $1 $2


Это простой пример упаковки видео и аудиоконтента в MKV, где вместо первого аргумента скрипту подсовывается имя видеофайла, вместо второго - имя аудиофайла. Но я же не всегда работаю с avi! Значит, расширение нужно как-то автоматически вычислять.
Честное слово, я искал простой системный способ сделать это. Кроме basename ничего не нашел, но это не то, что нужно. Если он есть - подскажите!
Ну так вот, пришлось взять в руки пилу, молток и SciTE, и сварганить скрипт самому:

[ файл ~/bin/ext.py ]

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

class FileExt:
def __init__(self):
try:
self.ind=sys.argv[1].rindex(".")
self.word=sys.argv[1]
except:
self.ind=sys.argv[0].rindex(".")
self.word=sys.argv[0]
def getext(self):
return self.word[self.ind+1:]

e=FileExt()
print e.getext()


Может быть и не лучший способ, но работает! Теперь мой скрипт может стать таким:

#!/bin/bash
mkvmerge -o ${1%`ext.py $1`}mkv $1 $2


P.S. Более изящный (и короткий) вариант кода:

import sys,os
try:
path,ext=os.path.splitext(sys.argv[1])
print str(ext).lower()
except:
print "Неверный аргумент"

2008-12-09

Кодирование MKV (matroska) для Nokia N810 используя mencoder

Открытия, как обычно, следуют за засадами. Несколько раз сталкивался с проблемами, когда кодировал файлы .mkv. Например, если пытаюсь извлечь видеотрек из .mkv в файл avi - возникает ошибка при воспроизведении, видео идет какимим-то цветными кубиками.
Или рассинхронизируются аудио- и видеопотоки. Или звук становится таким, как будто его эквалайзером загнали на максимум, и страшно жужжит.
Сегодня нашел в сети такой вариант, и вроде бы он нормально отработал. Буду тестировать.

mencoder filein.mkv -o fileout.mkv -of lavf -oac lavc -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:v4mv:vqscal:mpeg_quant -vf scale=-2:240

P.S. Проверил. Хороший метод.