19 августа 2010 г.

mkv2avi для просмотра через xbox

Столкнулся на днях с проблемой. Очень захотелось посмотреть фильм в формате mkv на большом экране телевизора. Я использую ushare для просмотра видео через xbox 360. Но на xbox, как оказалось, проигрывается достаточно малая часть существующих форматов. И естественно mkv в этот список не входит.

Видео форматы поддерживаемые Xbox 360

Далее приведены форматы, которые должны проигрыватсья на xbox. У меня получилось только с avi-контейнером (видео кодек xvid, аудио — mp3). Пробывал еще mp4, но мои файлы так и не завелись.

AVI

  • File extensions: .avi, .divx
  • Containers: AVI
  • Video profiles: MPEG-4 Part 2 (Simple Profile and Advanced Simple Profile)
  • Video bit rate: 5 Mbps with resolutions of 1280 × 720 at 30 fps.
  • Audio profiles: Dolby® Digital (2 channel and 5.1 channel), MP3
  • Audio max bit rate: No restrictions.

H.264

  • File extensions: .mp4, .m4v, mp4v, .mov, .avi
  • Containers: MPEG-4, QuickTime
  • Video profiles: Baseline, main, and high (up to level 4.1)
  • Video bit rate: 10 Mbps with resolutions of 1920 × 1080 at 30 fps.
  • Audio profiles: AAC, 2-channel, Low Complexity
  • Audio max bit rate: No restrictions.

MPEG-4

  • File extensions: .mp4, .m4v, .mp4v, .mov, .avi
  • Containers: MPEG-4, QuickTime
  • Video profiles: MPEG-4 Part 2 (Simple Profile and Advanced Simple Profile)
  • Video bit rate: 5 Mbps with resolutions of 1280 × 720 at 30 fps.
  • Audio profiles: AAC, 2-channel, Low Complexity
  • Audio max bit rate: No restrictions.

WMV

  • File extensions: .wmv
  • Containers: ASF
  • Video profiles: WMV7 (WMV1), WMV8 (WMV2), WMV9 (WMV3), VC-1 (WVC1 or WMVA) in simple, main, and advanced up to level 3
  • Video bit rate: 15 Mbps with resolutions of 1920 × 1080 at 30 fps.
  • Audio profiles: WMA7/8, WMA9 Pro (stereo and 5.1), WMA Lossless
  • Audio max bit rate: No restrictions.

Необходимые программы

  • ffmpeg: без комментариев;
  • mkvtoolnix: для работы с mkv;
  • audacity: если необходимо перекодировать многоканальный звук в 2-х канальный (подскажите способ попроще!);
  • mediainfo: для просмотра информации о медиа файлах (дополнительно).

Перекодировка в avi (xvid + mp3)

Достаточно долго я мучился козалось бы с простой задачей. Возможно как-то и возможно с помощью ffmpeg за один раз перекодировать из mkv в avi. У меня это не получилось. Основной проблемой оказалось перевести 6-ти канальный звук aac в стерео mp3. ffmpeg и lame наотрез отказались это делать. Поэтому все опперации разбил как можно мельче и не пытался найти хитрого решения в одну строчку. Главное, что мой файл все-таки стал проигрываться!

Весь процесс сводится к следующим манипуляциям:

  1. Извлечение необходимых видео и аудио дорожек;
  2. Перекодирование звука (mp3);
  3. Перекодирование видео (xvid);
  4. Сборка в один файл (avi).

Для начала узнаем что у нас внутри mkv-файла:

$ mediainfo video.mkv

Вместо mediainfo в данном случае можно использовать mkvinfo из состава mkvtoolnix. Плюс mediainfo в том, что он позволяет просматривать содержимое любого видио контейнера.

Видим нечто подобное:

General
Complete name                    : video.mkv
Format                           : Matroska
File size                        : 1.08 GiB
Duration                         : 1h 28mn
Overall bit rate                 : 1 755 Kbps
Movie name                       : Film
Encoded date                     : UTC 2008-08-11 01:22:23
Writing application              : mkvmerge v2.0.2 ('You're My Flame') built on Jul  3 2007 05:59:18
Writing library                  : libebml v0.7.7 + libmatroska v0.8.1
Cover                            : Yes / Yes / Yes / Yes / Yes

Video
ID                               : 1
Format                           : AVC
Format/Info                      : Advanced Video Codec
Format profile                   : High@L3.1
Format settings, CABAC           : Yes
Format settings, ReFrames        : 10 frames
Muxing mode                      : Container profile=Unknown@3.1
Codec ID                         : V_MPEG4/ISO/AVC
Duration                         : 1h 28mn
Width                            : 720 pixels
Height                           : 432 pixels
Display aspect ratio             : 2.35:1
Original display aspect ratio    : 1.667
Frame rate                       : 25.000 fps
Color space                      : YUV
Chroma subsampling               : 4:2:0
Bit depth                        : 8 bits
Scan type                        : Progressive
Title                            : Film
Writing library                  : x264 core 61
Encoding settings                : cabac=1 / ref=10 / deblock=1:-3:0 / analyse=0x3:0x133 / me=umh / subme=7 / psy_rd=0.800000 / brdo=1 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / chroma_qp_offset=0 / threads=1 / nr=0 / decimate=1 / mbaff=0 / bframes=6 / b_pyramid=1 / b_adapt=2 / b_bias=0 / direct=1 / wpredb=1 / bime=1 / keyint=300 / keyint_min=25 / scenecut=35 / rc=crf / crf=17.6 / rceq='blurCplx^(1-qComp)' / qcomp=1.00 / qpmin=10 / qpmax=51 / qpstep=4 / ip_ratio=1.40 / pb_ratio=1.30 / aq=2:1.10 / zones=125253,132448,q=35
Language                         : English

Audio #1
ID                               : 2
Format                           : AAC
Format/Info                      : Advanced Audio Codec
Format version                   : Version 4
Format profile                   : LC
Format settings, SBR             : No
Codec ID                         : A_AAC
Duration                         : 1h 28mn
Channel(s)                       : 6 channels
Channel positions                : Front: L C R, Side: L R, LFE
Sampling rate                    : 48.0 KHz
Title                            : Russian AAC-LC 6Ch 48KHz ~288Kbps
Language                         : Russian

Audio #2
ID                               : 3
Format                           : AAC
Format/Info                      : Advanced Audio Codec
Format version                   : Version 4
Format profile                   : LC
Format settings, SBR             : No
Codec ID                         : A_AAC
Duration                         : 1h 28mn
Channel(s)                       : 6 channels
Channel positions                : Front: L C R, Side: L R, LFE
Sampling rate                    : 48.0 KHz
Title                            : English AAC-LC 6Ch 48KHz ~289Kbps
Language                         : English

Возможно наличие дополнительных материалов, субтитров и т.п. Но они нам не нужны. Выбираем необходимые треки, а именно видео с id 1 и русское аудио с id 2.

$ mkvextract tracks video.mkv 1:video.h264 2:audio.aac

Далее необходимо перекодировать 6-ти канальную звуковую дорожку aac в 2-х канальную mp3. Для этого я использовал audacity. Импортировал файл, а затем экспортировал его в mp3. Консольный вариант для подобной операции я не нашел. Если известен пишите! Как указывал выше ffmpeg и lame с этим у меня не справились. Может им надо указать какие-то хитрые параметры?

Дальше надо перекодировать h264 видео с помощью xvid кодека. Битрейд выбираем такой же как и был. Значения по умолчанию сильно качество портят.

$ ffmpeg -i video.h264 -b 1000k -vcodec libxvid -vtag xvid -aspect 16:9 video.avi

Теперь все можно собрать в один файл:

$ ffmpeg -i video.h264 -i audio.mp3 -vcodec copy -acodec copy out.avi

Обновляем ushare и avi-файл можно смотреть на xbox.

Используемые ссылки

P.S.

Cy6erBr4in подсказал, что fuppes должен налету перекодировать видео. Попробую. Это конечно будет удобнее. Только вот сомнения гложут, что все корректно перекодироваться будет. А также думаю, что не потянет мой компьютер вовремя все перекодировать.

P.S.S.

Перекодировку аудио в случае с 6-ти каналами можно сделать так:

$ ffmpeg -i audio.aac -acodec ac3 -ab 192k tmp.ac3
$ ffmpeg -i tmp.ac3 -acodec libmp3lame -ab 192k -ac 2 audio.mp3

Подсмотрено тут. Вариант с использование опции -strict experimental у меня не заработал.

3 комментария:

derand комментирует...

Перекодировать звук из 6-ти канального в стерео можно тем-же ffmpeg:
$ ffmpeg -y -i "input.mkv" -map 0.x -vn -acodec libfaac -ab 128k -ac 2 -ar 48000 -strict experimental "output.aac"

Ilya Zonov комментирует...

Не работает у меня так с ffmpeg-0.5_p20373:

Resampling with input channels greater than 2 unsupported.
Can not resample 6 channels @ 48000 Hz to 2 channels @ 48000 Hz

Ilya Zonov комментирует...

2derand

Удалось перекодировать в 2 канала через промежуточный файл как у вас описано http://derand.blogspot.com/2010/07/iphoneipod-touch-ipad.html:

$ ffmpeg -y -i -map 0.1 -vn -acodec ac3 -ab 128k ./tmp.ac3
$ ffmpeg -y -i ./tmp.ac3 -vn -acodec libmp3lame -ab 128k -ac 2 .mp3