对于视频编解码一向不感兴趣的我,因为要用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_rate, rate, width 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