dwing吧 关注:5,665贴子:89,012

基于x264的静态图像编解码工具(开发中)

只看楼主收藏回复

至今我还没搜索到基于x264 intra帧的编解码工具,所以只能自己动手了.
因为要支持任意分辨率和alpha通道,所以只能自定义一种简单的封装格式,目前暂定名为UCI(Ultra Compact Image),目标不仅仅是h.264,而是追求压缩质量最佳的有损静态图像编码.

编码器组件包含x264.exe和一个外壳ucienc.exe.
解码器组件包含基于ffmpeg的ucidec.dll和一个外壳ucidec.
由于x264经常更新,而且是以GPL协议发布的,所以我不打算直接提供,可到x264.nl那里下载.

目前仅仅完成了24/32位bmp到uci的编码,以后打算支持输入其它常用格式.
alpha以另一帧Y通道的形式编码,色彩目前仅支持4:2:0.


IP属地:北京1楼2008-12-07 16:56回复
    这楼的目的不仅仅是发一个通知.

    还要征求各位图像/视频领域的高手共同讨论.
    目前有几个问题:
    1.静态图像支持4:4:4的色彩采样是否有必要?
    2.计算机内保存的位图的RGB到YUV的转换是采用以下那种?
    Y = 0.2990 R + 0.5870 G + 0.1140 B
    Y = 0.257 R + 0.504 G + 0.098 B + 16


    IP属地:北京2楼2008-12-07 17:00
    回复
      3.如果使用4:2:0采样,编码和解码时是否要对UV通道做加权和插值处理?


      IP属地:北京3楼2008-12-07 17:03
      回复
        1)感觉4:4:4无必要,但有些情况下4:2:0的color banding很难避免。
        2)使用的矩阵无所谓,关键是RGB<->YUV时使用的矩阵必须一致。如果你直接输出YUV到显卡需要指定正确的矩阵。一般HD分辨率使用BT 709,其他使用BT 601。ffmpeg内部的RGB->YUV会根据解码器提供的信息选择正确的矩阵,但如果缺失信息默认使用BT 709。
        3)这个和resize的方法相同。

        另外我已经实现了在MSVC上编译x264。你可以直接静态链接libx264.lib。
        还想知道你对alpha通道用什么办法压缩?


        IP属地:美国4楼2008-12-07 17:13
        回复
          1.先暂时用4:2:0,color banding看看能不能用较好的插值算法避免.
          2.公式我先用前者,后者感觉很奇怪,输出的Y值总是>=16.
          3.x264官方提供了vc的工程文件,但我不想用,这样更新方便一些,而且我不必遵循GPL协议.


          IP属地:北京5楼2008-12-07 18:45
          回复
            alpha通道我暂时的想法是当作Y通道去单独压缩,UV用0填充.
            这样含alpha的UCI文件就包括了2个x264帧.

            插值暂时选用lanczos,不知道会不会很影响解码速度.


            IP属地:北京6楼2008-12-07 18:48
            回复
              色彩空间转换可以完全通过ffmpeg内的swscale解决,你不用关心具体的公式,速度更不是问题,应该很难找到比ffmpeg更快的了。

              至于那个Y值总是>=16,这是tv scale(limited range),16<=Y<=235。在PC上应该用PC scale(full range),0<=Y<=255


              IP属地:美国7楼2008-12-07 19:48
              回复
                ffmpeg用VC编译是比较痛苦的,我决定使用FreeImage来做图像上的格式转换,色彩转换及缩放处理.


                IP属地:北京8楼2008-12-07 21:13
                回复
                  • 221.9.88.*
                  别的我不懂
                  我想知道的是,如何提供解码支


                  9楼2008-12-07 21:45
                  回复
                    会提供dll来解码,以及进一步的开发.


                    IP属地:北京10楼2008-12-07 21:58
                    回复
                      ffmpeg用MinGW编译成dll,就像ffdshow的方法,反正解码还是需要用ffmpeg的。当然全程MinGW编译就更简单了


                      IP属地:美国11楼2008-12-07 23:23
                      回复
                        用目前最新的ffmpeg解h.264单帧的速度比较理想,即使不使用任何汇编优化也比解同等大小的hd-photo快一点.


                        IP属地:北京12楼2008-12-11 10:07
                        回复
                          D大如此反感gcc?


                          IP属地:美国13楼2008-12-11 10:21
                          回复
                            win环境下还是vc比较好用,h.264解码部分我已经掌握了所需文件和修改方法,可以在VC7以上顺利编译,编译结果是600多KB,UPX可以压到170多KB.


                            IP属地:北京14楼2008-12-11 19:04
                            回复
                              用vc大部分汇编的部分用不了吧,那可是ffmpeg的精髓


                              IP属地:美国15楼2008-12-11 21:32
                              回复