多媒体

warning: Creating default object from empty value in /srv/www/blog.sqlitedeveloper.com/www/modules/i18n/i18ntaxonomy/i18ntaxonomy.pages.inc on line 34.

JM Decoder计算PSNR的一个bug

今天发现JM Decoder的一个bug,对于有I帧全部是IDR帧的码流,由于IDR的帧号是0,IDR之前如果有B帧的时候,B帧的帧号为负值。JM Decoder在查找YUV文件的参考帧来计算PSNR时,由于负值会找不到相应的参考帧,导致算出的PSNR是错误的。解码时它会报类似下面的错误。

Warning: Could not seek to frame number -2 in reference file. Shown PSNR might be wrong.

 

 

 

一个很好用的H264文件分析工具

Elecard StreamEye Studio

视频开发中使用有理数进行小数运算

在研究视频解码程序的时候,我们看到的源代码比如FFMpeg中几乎都是使用有理数来进行运算小数运算,原因就是有理数相对浮点运算来说,几乎没有误差,不会产生误差的累积和扩散。

实现H264恢复点的功能




H264的2:3 pulldown的实现

关于pulldown的解释,参见http://en.wikipedia.org/wiki/Telecine#2:3_pulldown

简单的说,就是将电影的流媒体(24fps)转换为NTSC(30fps)或者PAL上可以正常播放的流媒体。

实现的方式就是播放器将4帧图像在播放时扩展为5帧图像。对于编码器来说,需要在编码时写入指定的SEI扩展信息。pulldown实现相关的SEI信息参考H264标准的D.2.1Buffering period SEI message semantics中Pic_Struct这一部分。

常见的2:3 pulldown的实现就是

帧号         0     1      2  3  4  5  6 ..
PIC_STRUCT  3     5      4    6    3  .......
场结构        TB    TBT    BT   BTB  TB .......

注意pulldown只对帧模式有效,因为标准中场模式情况下Pic_Struct只能是1(顶场)和2(底场)

除了Pic_Struct之外,相关的

编译ffmpeg

ffmpeg的编译,主要是参考了http://soenkerohde.com/tutorials/ffmpeg/上面的编译指南。

有几点要注意的是,上面的教程写得时间比较早,对于最新版的ffmpeg不太适用

1.在Vista好像编译有问题,老是报告权限不够,我只好换到xp上编译。

2.用MSYS1.0.10已经无法编译了,必须更新到1.0.11(包括CoreUtils和Make3.81,bash shell)

3.MP3的编译要使用

./configure --enable-memalign-hack --enable-libmp3lame --extra-cflags=-I/local/include --extra-ldflags=-L/local/lib

旧的编译使用--enable-mp3lame,反正编译不过的时候看一下.configure --help就行了。

4.要输出DLL文件,可以使用--enable-shared编译选项

Syndicate content