momo zone

调核人的blog

让mencoder取悦PS3/PSP

对于视频编解码一向不感兴趣的我,因为要用mencoder 做一下媒体文件的分离,所以就拿PSP做了下测试,结果就把PSP的旧资料翻了一下。 7年前的psp支持下面的几种视频编码和封装格式:

  • Memory Stick™ Video Format
  • – MPEG-4 Simple Profile (AAC)
  • – H.264/MPEG-4 AVC Main Profile (CABAC) (AAC) and Baseline Profile (AAC)
  • MP4
  • – MPEG-4 Simple Profile (AAC)
  • – H.264/MPEG-4 AVC Main Profile (CABAC) (AAC) and Baseline Profile (AAC)
  • AVI
  • – Motion JPEG (Linear PCM)
  • – Motion JPEG (μ-Law)

PSP-MP4-MPEG4:

视频编码标准:MPEG-4 Simple Profile(AAC)

最大分辨率320×240 。当然,它无法满屏,但可以用psp的缩放来实现。

mencoder -oac lavc -ovc lavc -of lavf  -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=500:acodec=libfaac -af lavcresample=24000 -vf harddup,scale=320:-10,unsharp=l3x3:0.7,expand=320:240 -ofps 30000/1001 -lavfopts format=psp -srate 22050 原始文件名 -o 输出文件名.mp4

PSP-MP4-H264/AVC:

视频编码标准:

H.264/MPEG-4 AVC Main Profile(CABAC)(AAC)

H.264/MPEG-4 AVC Baseline Profile(AAC)

H264/AVC/MP4-part10 其实都是一个东西

支持320×240、352×240、480×272、720×480、720×576 分辨率,尽管屏幕最大分辨率是480×272 但越大还是效果越好,只不过没那么明显而已。main

mencoder -sws 10 -ovc x264 -x264encopts global_header:frameref=2:bframes=3:b_adapt:b_pyramid=none:weight_b:me_range=24:subq=7:psy-rd=0.8,0.2:me=umh:level_idc=30:partitions=p8x8,b8x8,i4x4:trellis=1:cabac:aq_mode=1:8x8dct=no:chroma_me:nofast_pskip:nodct_decimate:vbv_maxrate=4000:vbv_bufsize=2500:bitrate=1000  -vf scale=480:272,harddup -oac faac -faacopts br=128:object=2:raw -channels 2 -af resample=48000,volume=10 -of lavf -lavfopts format=psp 原始文件名 -o 输出文件名.mp4

还有更高规格的,使用pass1,pass2 两次编码,据说效果更好,但在PSP上没看出来

pass1:

mencoder -sws 10 -ovc x264 -x264encopts global_header:frameref=2:bframes=3:b_adapt:b_pyramid=none:weight_b:me_range=24:subq=7:psy-rd=0.8,0.2:me=umh:level_idc=30:partitions=p8x8,b8x8,i4x4:trellis=1:cabac:aq_mode=1:8x8dct=no:chroma_me:nofast_pskip:nodct_decimate:vbv_maxrate=4000:vbv_bufsize=2500:bitrate=2000:threads=2:pass=1 -oac faac -faacopts br=128:object=2:raw -channels 2 -of lavf -lavfopts format=psp  原始文件名  -vf scale=720:480,harddup -af resample=48000,volume=10 -o /dev/null

这里比较特殊的是pass1 不需要指定输出,因为他会固定地输出一个名为divx2pass.log 和divx2pass.log.mtree 的中间文件,在pass2里,他将和原始输入文件再次进行编码。

pass2:

mencoder -sws 10 -ovc x264 -x264encopts global_header:frameref=2:bframes=3:b_adapt:b_pyramid=none:weight_b:me_range=24:subq=7:psy-rd=0.8,0.2:me=umh:level_idc=30:partitions=p8x8,b8x8,i4x4:trellis=1:cabac:aq_mode=1:8x8dct=no:chroma_me:nofast_pskip:nodct_decimate:vbv_maxrate=4000:vbv_bufsize=2500:bitrate=2000:threads=2:pass=2 -oac faac -faacopts br=128:object=2:raw -channels 2 -of lavf -lavfopts format=psp -vf scale=720:480,harddup -af resample=48000,volume=10 原始文件名 -o 输出文件名.mp4

PSP-AVI-MJPEG:

刚知道还有这个东西,把jpeg 图片衔接成视频,并且只能用AVI封装。

最大分辨率320×240 。

mencoder -oac pcm -ovc lavc -lavcopts vcodec=mjpeg -ofps 30000/1001 -vf harddup,scale=320:240 -of avi 原始文件名 -o 输出文件名.avi

注意:PSP只支持在AVI中封装PCM 音频和μ-Law ,否则音视频均无法播放。

###################################################################################################################

  • Memory Stick Video Format
  • – MPEG-4 SP (AAC LC)
  • – H.264/MPEG-4 AVC High Profile (AAC LC)
  • – MPEG-2 TS(H.264/MPEG-4 AVC, AAC LC)
  • MP4 file format
  • – H.264/MPEG-4 AVC High Profile (AAC LC)
  • MPEG-1 (MPEG Audio Layer 2)
  • MPEG-2 PS (MPEG2 Audio Layer 2, AAC LC, AC3(Dolby Digital), LPCM)
  • MPEG-2 TS(MPEG2 Audio Layer 2, AC3(Dolby Digital), AAC LC)
  • MPEG-2 TS(H.264/MPEG-4 AVC, AAC LC)
  • AVI
  • – Motion JPEG (Linear PCM)
  • – Motion JPEG (μ-Law)
  • AVCHD (.m2ts / .mts)
  • DivX
  • WMV
  • – VC-1(WMA Standard V2)

PS3-MP4-MPEG4:

和PSP 的一样

PS3-MP4-H264/AVC:

视频编码标准最高为:H.264/MPEG-4 AVC High Profile (AAC LC)

mp4容器下的MPEG4和H264 的编码方法可以和PSP 完全一样,不过要修改 -lavf -lavfopts format=mp4

PS3-AVI-MJPEG:

和PSP的一样

PS3-MPG-MPEG2:

传说中的”DVD 格式” mpeg2 而已。

mencoder \ -oac lavc -ovc lavc \ -of mpeg \ -mpegopts format=dvd:tsaf \ -vf softskip,scale=720:576,hqdn3d,harddup \ -srate 48000 \ -af lavcresample=48000:volnorm=2 \ -ofps 25 \ -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=5120:vstrict=0:keyint=15:vbitrate=5120:acodec=ac3:abitrate=192:autoaspect \ -o a.mpg

PS3-AVI-XDIV(v3):

PS3只支持XDIV v3及以上的播放,而mencoder 只有用vcodec=msmpeg4才能编码出XDIV v3。

mencoder -oac lavc -ovc lavc -of avi -lavcopts aglobal=1:vglobal=1:vcodec=msmpeg4:vbitrate=3000:acodec=ac3 原始文件名 -o 输出文件名.avi

PS3-ASF-WMV1,2:

ASF封装 其实就是WMV 了,两者仅仅是扩展名不同,所以将ASF 改扩展名为WMV 完全没问题。

这个其实ps3原生的播放器无法播放,而只能播放WMV3。 那么V1,V2 就交给自制播放器showtime 去应付吧 。

mencoder -of lavf -lavfopts format=asf -ovc lavc -lavcopts vcodec=wmv1:vbitrate=5000:vpass=1 -oac lavc -lavcopts acodec=wmav1 原始文件名 -o 输出文件名.wmv

mencoder -of lavf -lavfopts format=asf -ovc lavc -lavcopts vcodec=wmv2:vbitrate=5000:vpass=1 -oac lavc -lavcopts acodec=wmav2 原始文件名 -o 输出文件名.wmv

说到这个WMV 还真是让人迷惑,wmv1 其实就是windows media video7(有的情况也直接写wmv7了) 所以说让人混乱。同样wmv2 就是windows media video8,wmv3就是windows media video9 ,又称VC-1 编码。 支持高清1080p,H.264的竞争者。wmv3在mencoder 暂时不支持编码。

PS3-TS/MTS/M2TS-:

这几个封装格式mencoder 不支持, 只能用 tsmuxer 去封装。

可以用ffmpeg 封装。

ffmpeg -i  input_file  -vcodec copy -acodec copy  -vbsf h264_mp4toannexb -f mpegts output_file

如果需要编码aac可以用以下参数:

-acodec aac -strict experimental ,否则会提示maybe incorrect parameters such as bit_rateratewidth or height

另外ts封装的AAC 也有特殊要求:

總結一下,PS3版的AAC有三要素

1. AAC規格必為LC-AAC (low complexity), 不支援HE-AAC(high efficiency)規格.

2. LC-AAC的封裝格式必須是AAC格式, 不支援 MP4 封裝格式.

3. 必為 MPEG2 Version 的LC-AAC串流 , 不支援MPEG4 Version 的LC-AAC串流 ( MPEG2 與 MPEG4 Version 主要差異在於檔頭內容)

 

如果没有ffmpeg ,可以到mplayare/ffmpeg下去编译出来,配置参数-enable-gpl –enable-libx264。如果没有看到x264被enable 可以是缺少x264相关,可以到http://download.videolan.org/pub/videolan/vlc/SuSE去下载x264,lib264,lib264-devel。同样如果没有这些,mencoder也不支持x264。

###################################################################

某人写了一个傻瓜脚本,可以简单地给PSP,PS3,IPOD 转h264 视频。

https://github.com/asho/rip2pmp

mplayer/mencoder 中文文档:

http://www.mplayerhq.hu/DOCS/HTML/zh_CN/

http://www.mplayerhq.hu/DOCS/codecs-status.html

http://www.mplayer.org.cn/help_zh.html

http://web.njit.edu/all_topics/Prog_Lang_Docs/html/mplayer/

总结一下:

1.果然想玩转各种编码解码不是一个简单的事情,不是熟练掌握某个工具,某个参数的问题,关键是要了解播放设备的特性。有些时候还要面对编码器的bug 。不过我感觉各种视频压缩标准对应的编解码器真的很混乱,很多厂商的产品并不完全兼容标准。

2. FFmpeg/lavcodec 真的是开源编解码器的首选,大部分情况下他都工作得很好,效率也丝毫不比商业编解码器逊色。

3.如果一个视频播放都有问题,那么把他转到其他编码也同样会有问题。 但如果是因为封装格式造成的情况除外。

4.像PS3/PSP 这样的商业产品对各种编码还是要求很严格的,稍微超出其spec 范围的都会被拒绝播放。

5.如果有的视频编码或封装异常(av不同步,无法被其他设备识别),调整参数仍然无效,那么就去更新一下FFMPEG 吧。

6.如果不需要对音频,视频转码而只是改变封装格式,则可以用-oac copy -ovc copy  。 不过这里有一点特别要注意,就是目标封装器要求的codec id 可能和源封装格式不同。比如下面的:

mencoder -oac copy -ovc copy -of lavf -lavfopts format=mp4 intput.mkv -o out9.mp4

7. mplayer 多线程播放参数加 -lavdopts threads=2 ,不过这样好像实际有3个线程。

会提示:

Audio format 0x4134504d is incompatible with ‘-oac copy’, please try ‘-oac pcm’ instead or use ‘-fafmttag’ to override it.

意思是源封装指示的Audio codec id 0x4134504d 不能被mp4 这个封装兼容。那么其实这个codec id 就是AAC ,需要用-fafmttag 明确告诉目标封装器一个它兼容的AAC codec id ,其实0xff 就可以的:

mencoder -oac copy  -fafmttag 0xff -ovc copy -of lavf -lavfopts format=mp4 intput.mkv -o out9.mp4

留下评论