`
cloudtech
  • 浏览: 4605849 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

基于移动平台的多媒体框架——AVS的编解码

 
阅读更多

AVS的编解码


AVS是我国具备自主知识产权的第二代信源编码标准。如果需要更加详细了解AVS,可以访问AVS工作组的主页 http://www.avs.org.cn/ 。从官网的页面可以看出来,这个标准已经很久没有什么动静了,很多年都没有什么更新。但是AVS最近突然非常热门,2011年11月4日,中国质量报发表了一篇名为《AVS将成为我国电视机支持的唯一视频标准》的文章,从中也可以看出一些国家的趋势。

好啦,我们只谈技术层面的东西吧。


AVS的解码


官方的解码方法:

有一些AVS的测试流可以从官网上下载得到,并且可以用官方网站给出的几种解码器进行解码播放。主要有如下四种:
1. AVS decoder SDK实例
2. AVS参考软件
3. AVS视频码流解析软件QtAVS
这几种解码器各有优劣,但是普遍来说都不好用。尤其是有的解码器在解码某些测试流的时候会出现不少bug。并且通过看源码可以发现,这几个软件都已经很多年没有更新过了。

推荐的解码方法:

这里推荐的解码方法是用ffmpeg或者基于ffmpeg的播放器,常见的有mplayer,kmplayer,vlc,以及各种“xx影音”等。ffmpeg就不用说了,很强大,几乎所有的codec都支持。早在ffmpeg0.7.2版,就加入了对CAVS的支持(CAVS就是指Chinese AVS)。经过测试可以发现,ffmpeg库对avs视频的支持非常稳定。

关于Gstreamer。我用GStreamer 0.10.35 + Gstffmpeg 0.10.12在ubuntu上面测试了一下。发现有ffdec_cavs,但是不能顺利解码。具体原因我也没有深入研究了,可能是Gstffmpeg插件包的版本不够抑或是cavs插件写的本身有问题。总之,随着Gstreamer快速的更新,我相信很快就会支持AVS的。


AVS的编码


官方的编码方法:

对应官方的解码方法,编码主要是用官方的“AVS编/转码器”。这个包已经开源,在Windows和Linux上都可以运行,并且在Windows中用图形界面和命令行都可有。
如果用命令行,大致编码过程为:
1. 用视频转换器将一个其他格式的视频文件转成xxx.avs格式。
2. 用音频转换器将一个视频中的音频提取出来;或者直接用一个mp3格式的文件也可以。
3. 用编码器将两个音频和视频文件打包成一个asm文件或者ts文件。
以上是大致的过程,具体的命令用法以及详细参数可以参考压缩包里自带的pdf文档。
如果用图形界面,可以在导入视频文件并进行配置后,直接点转码的按钮就可以得到asm文件或ts文件。
注意1:在第一步转换视频格式到avs格式的时候转到一半卡住了,可能是因为这个视频转换器有bug。这个时候可以ctrl+c终止掉,得到的视频可以播放但是不完整,而且播放时无法seek。我在测试的时候会遇到很多次,甚至官方提供的test.avi到了98%也会卡住。所以这种转码方式不推荐。
注意2:第三步里面提到了asm文件和ts文件,我来解释一下。虽然AVS是Audio+Video的Stream,但是我发现官方提供的avs文件,包括用官方转码器得到的avs文件都是只有视频流没有音频流(我很纳闷这是为什么……)。所以我们需要一个muxer将声音和视频打包在一起,就是第三步要做工作了。ts格式很出名,但是打包好之后无法播放,只能听到声音,看不到视频;asm从来没听过,但是用转码包中提供的Windows Media Player插件就可以解码播放。这是目前我发现的唯一一种官方提供的可以同事播放音视频的方法,可惜必须用Windows Media Player才行。

官方的另一种编码方式:

利用官网提供的XAVS,这个相对与“AVS编/转码器”比较新(看官网 http://xavs.sourceforge.net 也只更新到2010年底,其实也很旧了,只是后者更老)。在linux下会生成一个库,这个库可以和ffmpeg编译在一起。方法可以参考官网。
XAVS的一个缺点是,它只有编码的功能,并没有muxer的功能;另一个缺点是,XAVS对输入的文件有严格要求:Infile can be raw YUV 4:2:0 (in which case resolution is required),常常需要两次转码才可以。
推荐的编码方法:
还是推荐ffmpeg,Linux下编译需要./configure --enable-libxavs;Windows可以直接下载Windows build就自带支持avs编解码。大致格式为:
ffmpeg -i test.avi -vcodec libxavs output.cavs
具体的编码方法和详细参数可以参考http://xavs.sourceforge.net/xavs_ffmpeg.html
用ffmpeg编码,比“AVS编/转码器”成功率高,几乎都可以成功;比XAVS支持的输入格式多,一般的格式都可以。

独创的编码方法:

前面说过,avs格式的文件没有音频流;“AVS编/转码器”生成的asm文件只能用Windows Media Player + AVS官网的播放插件来播放;“AVS编/转码器”生产的ts文件只能播放声音。于是本人自己用一种简单的打包方法,讲avs格式的视频流和其他音频流打包,生成的文件可以用所有基于ffmpeg的播放器解码播放。
本来也是想ffmpeg的mux来打包,但是后来发现ffmpeg选择codec以及demuxer/muxer的时候都是根据文件名的后缀来匹配的,如果输出文件的后缀为ts,就会自动转码成mpeg的格式。虽然可以通过用类似“-vcodec libxavs”的方式指定,但是如果后缀名不一致还是不能成功。后来发现了mplayer自带的mencoder,如果制定了codec就可以完全忽略后缀名。方法为:
mencoder -oac copy -ovc copy -idx test.cavs -audiofile test.mp3 -o test.ts
用ffprobe可以看到:
Metadata:
encoder : MEncoder SVN-r33713-4.6.1
Duration: 00:02:04.95, start: 0.000000, bitrate: 2658 kb/s
Stream #0.0: Video: cavs, yuv420p, 1280x544, 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 64 kb/s

用mencoder这样得到的ts流中包含的codec与原先的音视频是没有变化的。这样我们就可以得到一个包含完整的音视频的流了,并且可以用所有基于ffmpeg的播放器解码播放。


后记:记录这篇文章,主要是给打算接触AVS的朋友做一个参考,提供一些能够快速解码播放AVS以及快速从其他格式转到AVS音视频的方法。本人刚刚开始学习AVS和ffmpeg相关的内容,尚不甚了解,对其中的很多用法和功能都不能充分了解,非常欢迎大牛们指点一二。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics