Конвертирование mkv в mp4 для просмотра на XBOX360
Задача: использовать xbox 360 для просмотра HDTV с сервера.
Проблема: почти все HDTV видео выкладывают в формате h.264, звук в формате aac 6-ch и все это в контейнере mkv. Xbox 360 в свою очередь умеет читать видео h.264, aac 2-ch и контейнер mp4.
Нам понадобится:
- mpeg4ip для mp4created
- ffmpeg с поддержкой faac, для перекодирования 6-и канального звука в 2-х канальный
- mkvtoolnix для выдирания из mkv аудио и видео дорожек
Используя mkvinfo узнаем нужные нам дорожки и битрейт видео.
Далее:
1 2 3 4 5 6 | mkvextract tracks input.mkv 1:video.h264 2:audio.ac3 mp4creator -create=video.h264 -rate=29.970 output.mp4 mp4creator -hint=1 output.mp4 ffmpeg -y -i audio.ac3 -vn -acodec libfaac -ac 2 -ab 384kbits audio.aac mp4creator -c audio.aac -interleave -optimize output.mp4 rm audio.aac audio.ac3 video.mp4 |
Так же читаем по следующим ссылкам:
- http://oddmanout.wordpress.com/2008/01/26/converting-an-mkv-h264-file-to-ps3-mp4-without-re-encoding-on-mac-os-x/
- http://torrents.ru/forum/viewtopic.php?t=632076
Небольшой shell:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #!/bin/sh if ! [ -f "$1" ] then echo "usage: $0 filename" exit fi vt=1 at=2 fps=23.976 fps=29.970 audio=ac3 filename=$1 size=`stat "$filename" | awk '{print $8}'` if [ 4314967296 -lt "$size" ] then mkvmerge -o "`echo $filename|sed -e 's/mkv/Part.mkv/'`" --split 4G "$filename" mask="`echo $filename|sed -e 's/mkv/Part-*.mkv/'`" files=`ls $mask` else files=$filename fi for i in $files do mkvextract tracks "$i" $vt:video.h264 $at:audio.$audio mp4creator -create=video.h264 -rate=$fps output.mp4 mp4creator -hint=1 output.mp4 if [ "$audio" = "dts" ] then mplayer -vo null -ao pcm audio.dts ffmpeg -y -i audiodump.wav -vn -acodec libfaac -ac 2 -ab 384kbits audio.aac rm audiodump.wav else ffmpeg -y -i audio.ac3 -vn -acodec libfaac -ac 2 -ab 384kbits audio.aac fi mp4creator -c audio.aac -interleave -optimize output.mp4 rm audio.aac audio.$audio video.h264 outfile=`echo $i|sed -e 's/mkv/mp4/'` mv output.mp4 "$outfile" mp4creator -list $outfile done |
Т.к. xbox не поддерживает профиль кодирования h264 выше чем 4.1 – приходится его менять. Пока что делается так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/bin/sh if ! [ -f "$1" ] then echo "usage: $0 filename" exit fi vt=`mp4creator --list $1|grep video|awk '{print $1}'` at=`mp4creator --list $1|grep audio|awk '{print $1}'` fps=`mp4creator --list $1|grep video|awk '{print $11}'` mp4creator --extract=$vt $1 mv $1.t$vt video.h264 mp4creator --extract=$at $1 mv $1.t$at audio.aac echo -n "demuxed? [yes/no]: " while read x do if [ "$x" = "yes" ] then break else echo -n "demuxed? [yes/no]: " fi done mp4creator -create=video.h264 -rate=$fps output.mp4 mp4creator -hint=1 output.mp4 mp4creator -c audio.aac -interleave -optimize output.mp4 mv output.mp4 $1 rm audio.aac video.h264 |
Как только спрашивает demuxed – в hex-редакторе (например bpatch) открываем video.h264 и меняем 8-й байт с 33 на 29.
