PLAYSTATION3で再生できるH.264/AVCファイルの作り方


1. はじめに

PLAYSTATION3はHDTVサイズのH.264/AVCを再生でき、 ムービープレイヤーとして最適です。 そこで、PV3でキャプチャしたデータをPS3で再生できるH.264/AVCのエンコード方法を記します。
使うツールはAviSynth、x264、mp4box、avs2wav、waveflt2、neroAacEncです。 ただし、私が個人的に調べたことなので、間違い等があるかもしれませんので、あらかじめご了承ください。
基本的に2010年4月10日現在の情報で、x264 rev.1523を基本にしています。

2. Aviutilでaupファイルの作成

まず始めに、Aviutilを使って、aupファイルを作成します。 24fps化、1440x1080への縮小(Lanczos3フィルタ)、編集などの事前処理をaviutl上で行います。

3. エンコード用バッチファイル

エンコードを行うバッチファイルです。

@echo off
rem #############
rem # File Name #
rem #############
set AUP=E:\DATA\Intensity\sample.aup
set OUT=OUT\BSD - sample - 第01話 - 1920x1080-24p - 12Mbps.mp4
set LOG="%OUT%.log"
set STAT="%OUT%.status"
set OUT="%OUT%"
set IN=tmp\tmp.avs
set AVIUTLVFP=D:\PROGRAMS\AviUtl\aviutl.vfp
set X264=x264.exe


rem #################
rem # BITRATE(kbps) #
rem #################
set BITRATE=12000
rem ###################################################
rem # MAX BITRATE(20000=for PS3 , 15000= for Xbox360) #
rem ###################################################
set MAX_BITRATE=15000
rem ######################
rem # SOUND BITRATE(bps) #
rem ######################
set SOUND_BITRATE=256000
rem ##############################
rem # FPS=59.94 , 29.97 , 23.976 #
rem ##############################
set FPS=23.976
rem ####################################
rem # SPEED=NORMAL , FAST , MID , SLOW #
rem ####################################
set SPEED=SLOW
rem #######################################
rem # LEVEL=4 , 4.2 (4.2 = only 1080/60p) #
rem #######################################
set LEVEL=4
rem ############################
rem # INTERLACE=0(off) , 1(on) #
rem ############################
set INTERLACE=0
rem #######################################################
rem # ASPECT=1280x720 , 1280x1080 , 1440x1080 , 1920x1080 #
rem #######################################################
set ASPECT=1920x1080
rem ###################################################
rem # PROFILE=HIGH(High Profile) , MAIN(Main Profile) #
rem ###################################################
set PROFILE=NORMAL
rem ###############################################
rem # VOLUME_ADJUST=0(no adjust) , 1(-2dB adjust) #
rem ###############################################
set VOLUME_ADJUST=0
rem #####################
rem # Encode Pass=1 , 2 #
rem #####################
set PASS=2
rem ##############################
rem # Thread Number=1 , 2 , .... #
rem ##############################
set THREAD=4
rem ###############
rem # DISPLAY_OPT #
rem ###############
set DISPLAY_OPT=--quiet



rem ################## SPEED option ###########################
                       set SPEED_OPT=--threads %THREAD% --ref 2  --trellis 2
if "%SPEED%" == "FAST" set SPEED_OPT=--threads %THREAD% --me dia --ref 1 --subme 0 --no-cabac --no-chroma-me --b-adapt 0
if "%SPEED%" == "MID"  set SPEED_OPT=--threads %THREAD% --me umh --ref 3 --subme 7 --no-fast-pskip --no-dct-decimate --weightb  --trellis 2 --b-adapt 1
if "%SPEED%" == "SLOW" set SPEED_OPT=--threads %THREAD% --me umh --ref 3 --subme 9 --no-fast-pskip --no-dct-decimate --weightb  --trellis 2 --b-adapt 2

rem ################## LEVEL option ###########################
                      set LEVEL_OPT=-v -B %BITRATE% --vbv-maxrate %MAX_BITRATE% --vbv-bufsize=25000 --fps %FPS% --level 4   --bframes 3 --b-pyramid strict --mixed-refs --keyint 300 --min-keyint 30 %ENCODE_OPT%
if "%LEVEL%" == "4.2" set LEVEL_OPT=-v -B %BITRATE% --vbv-maxrate %MAX_BITRATE% --vbv-bufsize=25000 --fps %FPS% --level 4.2 --bframes 1 --b-pyramid strict --mixed-refs --keyint 300 --min-keyint 30 %ENCODE_OPT%

rem ################## INTERLACE option #######################
                        set INT_OPT=
if "%INTERLACE%" == "1" set INT_OPT=--tff --nal-hrd vbr

rem ################## VOLUME option ##########################
                        set VOLUME_OPT=
if "%VOLUME_ADJUST%" == "1" set VOLUME_OPT=-normal -2.0

rem ################## PROFILE option ##########################
                         set PROFILE_OPT=
if "%PROFILE%" == "HIGH" set PROFILE_OPT=--8x8dct --partitions p8x8,b8x8,i8x8,i4x4

rem ################## x264 option ############################
set OPTION=%INT_OPT% %ENCODE_OPT% %SPEED_OPT% %PROFILE_OPT% %LEVEL_OPT% %DISPLAY_OPT%


rem ################## Aspect #################################
                             set PAR=1:1
if "%ASPECT%" == "1280x1080" set PAR=3:2
if "%ASPECT%" == "1440x1080" set PAR=4:3





rem ################## start ##################################
echo ====================== start of %OUT% ====================== >> %LOG%
echo ==== x264 option ==== >> %LOG%
echo %OPTION% >> %LOG%

rem ################## make avs file #####################
mkdir tmp
mkdir out
echo LoadVFAPIPlugin( "%AVIUTLVFP%", "AUPSource" )>%IN%
echo AUPSource( "%AUP%" )>>%IN%
echo FlipVertical()>>%IN%
echo ConvertToYV12()>>%IN%


if "%PASS%" == "2" goto PASS2
	rem ################## x264(1pass) #####################
	echo ==== 1pass start ==== >> %LOG%
	time /t >> %LOG%
	%X264% %OPTION% -o tmp\tmp.264 %IN%
	echo ==== 1pass end ==== >> %LOG%
	time /t >> %LOG%
	goto PASS_END
:PASS2
	rem ################## x264(2pass) #####################
	echo ==== 1pass start ==== >> %LOG%
	time /t >> %LOG%
	%X264% -p 1 --stats %STAT% %OPTION% -o NUL %IN%
	echo ==== 2pass start ==== >> %LOG%
	time /t >> %LOG%
	%X264% -p 2 --stats %STAT% %OPTION% -o tmp\tmp.264 %IN%
	echo ==== 2pass end ==== >> %LOG%
	time /t >> %LOG%
:PASS_END


rem ################## sound #############################
avs2wav %IN% tmp\tmp.wav
waveflt2.exe %VOLUME_OPT% tmp\tmp.wav tmp\tmp2.wav
neroAacEnc.exe -br %SOUND_BITRATE% -2pass -if tmp\tmp2.wav -of tmp\tmp.m4a


rem ################## make mp4 file #####################
mp4box -fps %FPS% -new %OUT% -add tmp\tmp.264 -add tmp\tmp.m4a
mp4box -par 1=%PAR% %OUT%

mp4box -info %OUT%
mp4box -info 1 %OUT%
mp4box -info 2 %OUT%


rem #### LOG ####
echo ==== info ==== >> %LOG%
mp4box -info %OUT% >> %LOG%
mp4box -info 1 %OUT% >> %LOG%
mp4box -info 2 %OUT% >> %LOG%
echo ==== all end ==== >> %LOG%
time /t >> %LOG%

rem ################## end ###############################
echo ====================== end of %OUT% ====================== >> %LOG%
先頭部分を修正するだけで使い回しが出来ます。 なお、事前に「tmp」、「out」のディレクトリを作ってください。
オプションは以下のとおりです。
AVS
入力ファイルのaupファイルを指定します。
OUT
出力するmp4ファイル名を指定します。
BITRATE
平均ビットレートです。単位はkbps。
MAX_BITRATE
最大ビットレートです。単位はkbps。PS3では20000kbps、Xbox360では15000kbpsが最大になります。
SOUND_BITRATE
音声のビットレートです。単位はbps。
FPS
フレームレートです。NTSCベースの場合、59.94 , 29.97 , 23.976で指定します。単位はfps。
SPEED
エンコードの速度です。FASTが最速で画質は一番悪いです。NORMAL、MID、FASTにいくほど遅くなる分、画質が良くなります。
LEVEL
H.264/AVCのLEVEL指定です。基本的にはLevel.4で、1080/60pだけがLevel4.2になります。
INTERLACE
インターレースとしてエンコードする場合は1を指定します。プログレッシブなら0です。
ASPECT
元画像の解像度を指定します。それを全て16:9として出力します。指定できるのは、1280x720 , 1280x1080 , 1440x1080 , 1920x1080です。
PROFILE
H264/AVCのProfileを指定します。HIGHでHigh Profile、NORMALでNormal Profileになります。インターレースの場合、High ProfileだとPS3でノイズが出ることがあります。
VOLUME_ADJUST
音量を調整するかどうです。0で調整なし、1で-2dBに調整します。
PASS
エンコードを何passで指定するかを指定します。2passだと単純に2倍の時間が掛かります。
THREAD
エンコードを1passで行うか、2passで行うかを指定します。Core2Duo等のデュアルコアのマルチコアプロセッサを使っている場合は、コア数に合わせてください。

5. 連続エンコード用バッチファイル

連続でエンコードを行うためのバッチファイルです。

@echo off

rem ##############################################
call bat\test_01.bat
call bat\test_02.bat
call bat\test_03.bat


rem ##############################################
echo ============= shutdown =============
shutdown -s -t 60 -c "x264エンコードが完了したのでshutdownします"
rem ##############################################

エンコード用バッチファイルを連続で実行した後、マシンの電源を落とします。

6. PLAYSTATION3の制約

PLAYSTATION3はver 1.80でHigh Profileに対応したようです。 Levelに関しては基本的にLevel 4です。 ただし、MPEG4/AVCの規格として、1080/60pはLevel4では実現できなくて、Level4.2になります。 そこで、1080/60pの時だけ、Level4.2を指定するようにしています。 これでも再生してくれます。
昔のPLAYSTATION3では 「--no-b-adapt」を付けないと、ほぼ途中で止まりましたが、いまは大丈夫のようです。 そのため、いまは「--b-adapt 2 --bframes 3」でも問題ないようです。 なお、PLAYSTATION3では、処理が間に合わなくなった時のビットレート表示はあてになりません。 コマ落ち時のビットレート表示は考慮されていないようで、デタラメな値が表示されるようです。 あと、上限は20Mbpsにするのが無難です。
昔のx264でエンコードしたインタレースデータは、デコードは出来ましたが、正しくでインタレース処理が出来ませんでした。 しかし、x264 rev.2510から「--tff --nal-hrd vbr」で正しくデインターレースできるデータを出力できるようになりました。

7. BDMV形式の作成方法

mp4ファイルをBlu-rayのBDMV形式にする場合は以下の手順でBDMVに出来ます。

  1. mkvtoolnixを使って、mp4ファイルをmkvファイルに変換します。 音声がAACの場合、
    neroAacDec -if foo.mp4 -of foo.wav
    
    とLPCMのWAVに変換し、 EncWAVtoAC3で、DOLBY DIGITALに変換して、その音声を使ってmkvファイルにします。 (BDMVではAACは使えません)
  2. tsMuxeRを使って、mkvファイルを「output」を「Create Blu-ray disk」にしてBDMV形式で出力します
  3. BDMV形式のファイルをBD-RやBD-RWに焼きます
1080pはPS3で問題なく再生できます。しかし、DMR-BW900だと最初のGOPが静止画になります。 1080iだとPS3はデインタレースが不完全です。DMR-BW900だと最初のGOPが静止画になりますが、 デインターレースは問題ありません。
x264のインターレースはMBAFFで、PS3はMBAFFには不完全なのかもしれません。 或いはx264はインターレースに積極的ではないので、x264の吐くコードに問題がある可能性もあります。
この情報は古いです。 x264 rev.1510から「--tff --nal-hrd vbr」でPS3でも正しくデコード、デインタレースできます。

8. ダウンロードサイト

このページで使っているプログラムのダウンロードサイト一覧です。

9. 参考資料

このページを作成する上で参考にしたものは以下のページ、書籍です。

10. 改変履歴



最終変更 2010年4月10日
nozz@sannet.ne.jp