Home > Uncategorized > Конвертирование mkv в mp4 для просмотра на XBOX360

Конвертирование mkv в mp4 для просмотра на XBOX360

January 19th, 2009 Leave a comment Go to comments

Задача: использовать 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.

Tags: ,
  1. No comments yet.
  1. No trackbacks yet.