??xml version="1.0" encoding="utf-8" standalone="yes"?>
1.UDP输入UDP输出
2.提供源切换的接口Q客户会再某个时L掉某个源
3.良好的异常处理,某个UDP源断或恢复不媄响现有节目。这不是客户的要求,但有q大型项目经验的人知道,q是一定要考虑?br />从实现层面来Ԍ需要以下技术点Q?br />1.UDP单播l播接收
2.TS装的H264与MPEG2视频解码为YUV
3.YUV~放
4.YUV画面拼接
5.合成后的YUV压羃为H264
6.压羃后的视频打包TS
7.打包后的TS通过UDP发?br />8.发送时需要进行流控,保证VLC可正常播放?br />q些技术点不算难,真正的难点在于统{运作,N个源各自的解码后画面输出速度不同Q虽然我们要求各源率相同。各解码U程画面输出虽整体相同,但肯定会忽高忽低。如果每个源都正常的话,我们可以{待每个源都有画面的时候才q行合成。但是我们需要考虑源断与恢复Q就不能一直等待某个源。其二,Z支持源切换,我们应该涉及好运作模式,实现无缝切换Q但q些只是我特?业务的需要,接下来只讲与ffmpeg相关技术?br />先讲上面提到?个技术点QUDP收发׃用说了,值得一提的是接攉要用异步模式,q个在后面会提到。除了YUV画面拼接Q其他都可以用ffmpeg sdk实现。因此主要讨Z用ffmpegq行解码~码Q这U技术文章其实很多,但他们一般只有简单的ҎQ对于这些比较常见的东西Q我们也不做讨论Q只讨论几个重点Q而又~Z资料的问题,主要有:
1.对解码及~码自定义io回掉。UDP接收及发送不通过ffmpeg实现。对于UDP源来_ffmpeg对MPTS支持不好。对于输出UDP来说Qffmpeg没有控
有时我们希望ffmpeg的api打开的不是文件或某个协议的URLQ直接传递数据缓冲给他,ffmpeg不支持传递数据指针给他,要求他编码或解码Q这在ffmpeg api中的实现方式是IO回掉函数。他在需要的时候来调用你的函数来读取或写入。以解码ZQ下面ؓCZ代码Q?br />AVIOContext *pb = avio_alloc_context(pbuf+1316, AVIO_BUF_SIZE-1316, 0, this, ReadDataCb, NULL, NULL);
if (av_probe_input_buffer(pb, &pinFmt, "", NULL, 0, MAX_PROBE_SIZE) < 0)
{
//error...
}
AVFormatContext *pFmtCt = avformat_alloc_context();
pFmtCt->pb = pb;
if (avformat_open_input(&pFmtCt, "", pinFmt, NULL) < 0)
{
//error...
}
d回掉原型如下Q?br />static int ReadDataCb(void *opaque, uint8_t *buf, int buf_size);
实现理念一般应该是除非惌停止解码Q返?1Q否则返回数据长度。保证他d数据
不知道是Z内存寚wq是什么原因,
uint8_t *pbuf = (uint8_t *)calloc(AVIO_BUF_SIZE,1);
pb = avio_alloc_context(pbuf+1316, AVIO_BUF_SIZE-1316, 0, this, ReadDataCb, NULL, NULL);
的时候第一个参数直接传pbuf会崩溃,所?1316
而若使用av_malloczQ虽可以直接传pbuf,却在av_free的时候崩溃,没有扑ֈ原因?br />
2.׃需要实现切换,所以需要将某个源完全销毁,不生内存泄Ԍ不要看q个问题Q网上的很多代码是不对的?br />
销?AVFormatContext
正确销毁方式:
/* close decoder for each stream */
for (int i = 0; i < pFmtCt->nb_streams; i++)
{
if (pFmtCt->streams[i]->codec->codec_id != AV_CODEC_ID_NONE)
{
THREAD_MUTEX_LOCK(&g_mutex_avcodec_oc);
avcodec_close(pFmtCt->streams[i]->codec);
THREAD_MUTEX_UNLOCK(&g_mutex_avcodec_oc);
}
}
avformat_close_input(&pFmtCt);
销?AVIOContext
//不可使用avio_close
av_free(pb->buffer);
av_free(pb);
销?AVFrame
AVFrame *pframe = avcodec_alloc_frame();
avcodec_free_frame(&pframe);
3.多线E用ffmpeg sdk问题
avcodec_open/avcodec_close不是U程安全的,必须q行全局加锁保护Q或者其他同步方式。除了这两个函数外,׃av_find_stream_info内部调用了avcodec_openQ也需要加锁。但av_find_stream_info有可能执行时间比较长Q如果没特别的必要,可以不用此函数。对于解码来_有下面两个函敎ͼ
av_probe_input_buffer
avformat_open_input
大部分情况下已经可以正常解码了?br />
关于压羃
ffmpeg压羃H264 TS时CBRq不好用Q设|了mux_rate会导致TS装出错。老老实实用VBRQ不讄mux_rate
q行H264压羃时一个选项一定要讄的:
preset
在压~效率和q算旉中^衡的预设|可用选项Q?br />ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo
]]>
在隔行扫描中,当有Ud的对象或摄像机移动时Q与逐行相比Q两个相邻行們减少l计的相x,q种情况应比每场分别压羃更ؓ有效。ؓ了达到高效率QH.264/AVC在编码Ӟ有以下可选方案:
● l合两场成一个完整Q作为~码Q称为模式?/p>
● 两场分别~码Q称为场模式?/p>
● l合两场成一个完整Q作为压羃。在~码Ӟ划分垂直盔R的两个宏块对成两个场宏块Ҏ帧宏块,再进行编码?/p>
每囑փ可自适应选择3U模式之一q行~码。在前两U之间进行选择UCؓ囑փ自适应?场编码(PAFFQ,当一帧作Z场编码时Q每场划分ؓ宏块Q编码方式与帧编码方式很怼Q主要有下面的例外:
● q动补偿用参考场Q而不是参考?/p>
● 变换pL?#8220;之字?#8221;扫描方式不同?/p>
● 宏块水^Ҏd滤L器的强度不选用“?#8221;Q因为场行在I间上是两倍行的距离?/p>
在研制H.264/AVC标准Ӟ据报道,采用ITU-601分L率,PAFF~码技术与帧编码相比可减少码率16%?0%?/p>
如果囑փp动区和非q动区合组成,非运动区用模式、运动区用场模式是最有效的编码方法。因此每个垂直宏块对Q?6×32Q可独立选择~码Q/场)模式。这U编码选择UCؓ宏块自适应?场编码(MBAFFQ。对于模式宏块对,每个宏块包含帧行Q对于场模式宏块对,剙宏块包含场行,底部宏块包含底场行?/p>
处理场宏块对的每个宏块与帧PAFF模式怼Q然而,因ؓ在MBAFF帧中发生?帧宏块对混合Q需要修改用作下列用途的ҎQ?/p>
● 之字型扫描?/p>
● q动矢量预测?/p>
● 帧内预测模式的预?/p>
● 帧内预测帧采L度?/p>
● d效应滤L器?/p>
● 上下文模型的늼码?/p>
主要思想是尽可能保留多的I间一致性,MBAFF帧的I间盔R的规范相当复杂,下面讲到的空间相邻都是指非MBAFF帧?/p>
MBAFF 和PAFF的另一个重要区别是Q用MBAFFҎQ一个场不能使用同一帧的另一个场中的宏块作ؓq动补偿参考。这P有时PAFF比MBAFF~码更有效,特别是在快速全局q动、变换场景、图像刷新等情况下?/p>
在开发MBAFF标准期间Q据报道Q采用ITU-601分L率,MBAFF~码技术比PAFF相比可减码?4%?6%?/p>
囑փ序列是由囑փl构成的Q是随机存取D落?
sequence_header_code – The sequence_header_code is the bit string ‘000001B3’ in hexadecimal
sequence_end_code – The sequence_end_code is the bit string ‘000001B7’ in hexadecimal.
MPEG-2Z实现随机讉KQ在码流中会插入repeat_sequence_header,它可以插在I、P帧或GOP前面Q假如是场编码,只能插在W一场前面?
囑փl头
囑փl(GOPQ是为方侉K机存取而加的,囑փl是随机存取视频单位。一个GOP׃串IBP帧组成,起始为I帧。基准(I/P)的反复频率用M表示Q它描述为多里出CơI/P帧。GOP的长度是一个I帧到下一个I 帧的间隔Q即多少帧里面出CơI帧,一般用N表示Q这个长度是可变的,长GOP可以提供高的压羃比,但是会造成随机存取的gq(必须{到下一个I帧)和误差的U篏QP帧的误差传播Q。一般是一U内有两个I帧,用来作ؓ随机存取的入口。在MPEG2中也没有规定GOP的结构,帧反复方式可以是IPQIBQIBPQIBBPQ甚臛_部是I帧?
M=1 N=XQIPPP...
M=2 N=XQIBPBP...
M=3 N=XQIBBPBBP...
MPEG-2标准中的GOP语法l构如下Q?
group_start_code – The group_start_code is the bit string ‘000001B8’ in hexadecimal.
closed_gop – This is a one-bit flag which indicates the nature of the predictions used in the first consecutive B-pictures (if any) immediately following the first coded I-frame following the group of picture header.closed_gop is set to ‘1’ to indicate that these B-pictures have been encoded using only backward prediction or intracoding.
broken_link – This is a one-bit flag which shall be set to ‘0’ during encoding. It is set to ‘1’ to indicate that the first
consecutive B-Pictures (if any) immediately following the first coded I-frame following the group of picture header may not be correctly decoded because the reference frame which is used for prediction is not available (because of the action of editing).A decoder may use this flag to avoid displaying frames that cannot be correctly decoded.
使用说明
目录
本程序是一?/span>TS文g静态分析工P支持188/204、单?/span>/多\节目 mpeg2/h.264Q分析模块齐全,支持特大文gQƈh一的处理速度。其主要功能如下Q?/span>
l 媒体播放
l 媒体详细信息
l PIDl计
l 同步分析Q?/span>GOPl计Q码率变化分?/span>
l PSI/SI解析
l TS包列表、十六进制显C,TS_调整字段Q?/span>PES首部解析
1.Windowns2000以上操作pȝ
2.IE6.0以上
3.内存Q?/span>128M以上
选择打开一?/span>TS文gQ?/span>
通过菜单栏或工具栏打开Q或文件拖动到EasyICEQ可以看到如下对话框
你可以在q里选择分析整个文g或部分数?/span>
当文件分析完毕,播放器窗口会被初始化Qƈ处于暂停状态,单击播放按钮开始播放?/span>
播控按钮Q?/span>
依次为:播放、暂停、停止、降低播N度、加大播N度、逐播放
播放速度的调整分七个U别Q?/span>
1/4速?/span>1/3速?/span>1/2速、正帔R度?/span>2倍速?/span>3倍速、四倍?/span>
当前播放速度会在“质量”区显C?/span>
“节目”区列Z当前中所含有的节目,单击卛_播放选中节目Q展开可以看到节目的三?/span>PIDQ视频、音频?/span>PCR
“质量”区显CZ当前播放媒体的简单信息,如播N度{,但由于Y仉题有些数据获取不到或存在问题Q请?#8220;媒体信息”栏检结果ؓ准?/span>
特别的,软g首先会查找流中的PSI/SI信息Q如果存在,按?/span>PSI/SI信息解析Q如果不存在QY件将自己试视音频PID?/span>PCRPID
如果你没有看到播攑֙画面Q表明Y件没有找到视频流或没有找?/span>PCR
该模块显CZ视频序列Q音频的几乎所有参敎ͼ以及视音频流数量。具体不再叙q?/span>
此模块对所有的PSI/SIq行了解析,当流中存?/span>PSI/SI数据Ӟ会在此模块列出。在视图中点击鼠标右键,可以展开/折叠所有节炏V?/span>
列出当前TS中各个PID出现的数量及占用癑ֈ比,所属类?/span>
当流中存在多路节目时Q图标界面会昄一节节目选择对话框,单击可以昄相应节目图表
旉戛_表显C的是,DTS?/span>PTS出现Ӟ?/span>PCR的采栗与“PCR抖动”图表相同的是Q时间戳?/span>PCR旉为基准?/span>DTS?/span>PTS值取自视频流中的I帧。由于的编码顺序与昄序的关p,不取B?/span>P或其他?/span>PTS?/span>DTSQ否则时间就不是累加的?/span>
滚动鼠标滚轮可以~放/扩展图表昄Q这里大U提供了20倍的扩展Q如果你需要显C更数量的图表,可以在开始分析文件时选择分析一些数据?/span>
囑փ可以用鼠标拖动,来调整显CZ|?/span>
在图表上点击右键Q可以选择当前图标存储ؓpng/jpg{格式的囄?/span>
DTS?/span>PCR?/span>PTS?/span>PCR的差?/span>
视频?/span>GOPl构
GOPl构变化
码率~码曲线Q图中的每一个点为每ơ采P码率计算方式为:两个PCR包之间的TS包数量除以时?/span>
数据包列表中昄了包IDQ类型,Payload是否为真以及PCR{数据,炚w某个条目,可以昄相应TS包的十六q制Q及标示位等信息?/span>
在数据包列表点击右键Q可以执行上下翻,或保存选中TS包等操作?/span>
节点列表的包qo器尚未实现?/span>
填入你要抽取出来?/span>PIDQ如果有多个Q以英文的逗号隔开。此处的PID要填十进?/span>
填入要重讄原始及目?/span>PIDQgؓ十进?/span>
204包长?/span>TS{?/span>188包长
相比同类?/span>TS分析软gQ本E序臛_存在以下不Q?/span>
l 没有Ҏq子q行解析
l 没有对连l计数校验,PCR间隔校验{验证信?/span>
l 没有对视频序列协议的解析
l 没有数据包查扑֊?/span>
l 没有PIDqo功能Q无法各PID?/span>TS包分cLC?/span>
l 没有友好的语法分?/span>
l 没有软复用功?/span>
l 不支持加解扰
软g的处理机制是Q当中存在PSI/SI信息Ӟ对节目的分析完全依?/span>PMT对节目的说明Q当不存?/span>PSI/SI信息Ӟ软g会自己判断流中是否含有音视频?/span>PCR{信息,q对分析类型。但是,一些特别的情况Q例如不含有PCR信息Q在“数据?#8221;?#8220;PID”视图中对包类型的昄会是“未知”状态,?#8220;MediaInfo”视图Ҏ的分析则是独立的Q您应当?#8220;MediaInfo”视图昄的结果ؓ准?/span>
当您在用过E当中遇到问题,或发现Y?/span>bugQ可以与我联p,h问题详l描qͼ最好再附加上遇到问题的TS(5-10M卛_Q,发邮件给我,我会快为您{复?/span>
?/span>2.2.1版本P软g取消用时间限Ӟ因ؓ我无法再保障更新速度?/span>EasyICE是业余时间开发,一q多来消耗了太多的时间与_֊Q有时ؓ了设计一U界面布局会考虑好几天,或者ؓ了优化处理速度调整实现方式Q甚x个重构。虽然现在也不尽完美Q但我一直在量地去做。很多理想的功能未实现Q那些可能不再被d了,实在没有旉?/span>
本Y件供交流学习使用Q您无须为此支付费用Q但不得用于商业用途?/span>
致谢Q?/span>Easy, hero, 介于01, 师傅:nooby
版权所有:ZK天?/span>
Win内核驱动开?/span>QQ:75446994
视频~解?/span>QQ:85390662
Email: shangxinjian1972@163.com
2010/9/14 于北?/span>
Q?Q安装Cygwin?/p>
下蝲地址Q?a target="_parent" style="line-height: 22px; text-decoration: none; color: rgb(255, 57, 248); ">http://www.cygwin.com/setup.exe
以下选项为必选项Q好象是不全Q,版本全按最新的Q条件允许的话,可以全部安装。占用空间比较大?/p>
Archive
unzip (5.52-2)
zip (2.32-2)
Devel
autoconf (4-1 2.13-3 2.61-1)
automake (2-1 1.10-1 1.4p6-4 1.5-2 1.63-3 1.7.9-3 1.8.5-3 1.9.6-2)
binutils (20080624)
cvs (1.11.22-1)
gcc (3.4.4-3)
gcc-core (3.4.4-3)
gcc-g++ (3.4.4-3)
gcc-mingw (20040810-1)
gcc-mingw-core (20050522-1)
gcc-mingw-g++ (20050522-1)
gdb (6.8-2)
gettext (0.15-1)
gettext-devel (0.15-1)
git (1.6.0.2-1)
libiconv (1.11-1)
libgcrypt-devel (1.41-4)
libtool (1.5.27a-1)
make (3.81-2)
mingw-runtime (3.15.1-1)
nasm (2.02-1)
patchutils (0.2.31-2)
pkg-config (0.23a-2)
subversion (1.5.2-1)
Editor
vim (7.2-3)
Libs
expat (2.0.1-1)
libgcrypt (1.4.1-4)
Web
curl (optional: for building extras/contrib) (7.16.3-1)
wget (optional: for building extras/contrib) (1.11.3-1)
下蝲地址Q?/p>
解压命oQtar xjf arm-mingw32ce-0.59.1.tar.bz2 -C
在windows下解压也行,但有的时候会文Ӟ最好用linux命o解压Q解压完拯?opt/mingw32ce (默认解压在当前目录,q个包是个压~包Q没有\??/p>
Q?Q安装第三方库?br style="line-height: 22px; ">
下蝲地址Q?/p>
http://download.videolan.org/pub/testing/contrib/contrib-20091114-wince-bin-gcc-4.1.0-runtime-3.15.2-only.tar.bz2
解压刎ͼ
/usr/wince
注意一个问题:此处下蝲的库Q一定要和VLC代码匚w?br style="line-height: 22px; ">
下蝲地址Q?/p>
http://download.videolan.org/pub/videolan/vlc/1.0.5/vlc-1.0.5.tar.bz2
解压目录Q?/p>
\home\UserName\vlc-1.0.5\
q且q入该目录执行:
./bootstrap
一般没有错误,可能出现的错误:
+ aclocal-1.9 -I m4
/usr/bin/m4:configure.ac:4643: cannot create temporary file for diversion: Permission denied
autom4te-2.61: /usr/bin/m4 failed with exit status: 1
aclocal-1.9: autom4te failed with exit status: 1
分析Q杀毒Y件有关系?/p>
解决ҎQ关闭杀毒Y仉新运?/bootstrap?/p>
x准备工作完成?/p>
Q二Q配|编译选项
建立一个conf-vlc.sh文gQ徏议用UltraEdit打开Q编辑,如果直接文本~辑的话最后编辑完的文仉要用
dos2unix conf-vlc.sh
转换脚本的编码格式。(注意行尾的空格和斜线Q最后一行只有空格没有斜U)。文件的开始几行是讄一些\径,一般也不需要修攏V后辚w分主要是对VLC的功能的d和删除。有很多选项都有默认|具体h行命令:
./configure –help > conf.txt
后,在conf.txt中查看具体选项讄说明?/p>
下面的列出的是,VLC1.0.5版本讄成功的conf-vlc.sh
PATH=/opt/mingw32ce/bin:$PATH \
CPPFLAGS="-I/usr/wince/include -D_WIN32_WCE=0x0500" \
LDFLAGS="-L/usr/wince/lib" \
PKG_CONFIG_LIBDIR=/usr/wince/lib/pkgconfig \
./configure --host=arm-mingw32ce \
--enable-dshow --enable-bda --disable-hal --disable-activex --disable-vlc \
--disable-directx --disable-dvdnav --disable-libgcrypt --enable-wingdi \
--disable-remoteosd --disable-sdl --disable-skins2 \
--disable-faad --enable-mad --enable-wingdi --enable-waveout \
--enable-mkv --enable-httpd --enable-libmpeg2 --enable-ogg \
--enable-live555 --enable-realrtsp --enable-bda \
--enable-ffmpeg --with-ffmpeg-mp3lame --with-ffmpeg-faac \
--with-ffmpeg-zlib --enable-faad --enable-flac --enable-theora \
--enable-csri --enable-libass --enable-asademux --enable-freetype=/usr/wince/freetype-2.3.12 \
--enable-release --enable-disable --enable-optimizations --enable-sse --enable-mmx --enable-optimize-memory
~辑完conf-vlc.sh文gQ执行脚本:
./conf-vlc.sh
如果脚本遇到了类似Permission denied的错误,提升脚本的权限:
chmod 777 configure-vlc01.sh
如果q有错误Q一般是对应的库没有Q或者版本不寏V?/p>
见到以下内容说明脚本q行成功了?/p>
You can tune the compiler flags in vlc-config.
To build vlc and its plugins, type `./compile' or `make'.
x配置工作完成了
执行命oQ?/p>
make
如果刚执行几行就出现错误Q请重新讄PATHQ命令:
PATH=/opt/mingw32ce/bin:$PATH
如果中途遇到关键字atoll的错误,打开config.h搜烦关键字atoll
注掉以下代码Q?/p>
#define HAVE_ATOLL 1
如果中途遇到关键字iconv的错误,打开config.h搜烦关键字iconv
注掉以下代码Q?/p>
#define HAVE_ICONV 1
再遇其他错误Q检查lib是否正确Q实在不行将相关模块?a name="OLE_LINK1" style="line-height: 22px; text-decoration: none; color: rgb(255, 57, 248); ">conf-vlc.sh
中disable掉。(需要重新运行conf-vlc.shQ?/p>
最后打包?/p>
执行Q?/p>
make package-wince
p直接生成的文g打包成vlc-1.0.5.zip
或者执行:
make package-wince-base
得到一个vlc-1.0.5的目?/p>
x我们p得到我们要的DLLs?/p>
原地址Q?/p>
http://bk6.blog.163.com/blog/static/24498560201051193449196/
仅仅使用前一个显C的基准帧来~码的被称?#8220;P?#8221;Q同时用前一个显C和未来作ؓ基准帧进行编码的帧称?#8220;B?#8221;。在通常的场景中Q编解码器编码一个I帧,然后向前跌几个帧,用编码I帧作为基准对一个未来P帧进行编码,然后跛_到I帧之后的下一个。编码的I帧和P帧之间的帧被~码为B帧。之后,~码器会再次跌几个帧,使用W一个P帧作为基准~码另外一个P帧,然后再次跛_Q用B帧填充显C序列中的空隙。这个过E不断l,?2?5个P帧和B帧内插入一个新的I帧。例如,?U给Z一个典型的视频帧序列?/p>
通常Q更换场景后的第一帧就?span>I帧,I帧应当全帧传送。从压羃的程度来看,I画面的压~量最;P画面ơ之Q它是以I画面为基QB画面压羃最多。ؓ了加大压~比Q通常在I帧后面相?帧(最?帧)讄1个P帧,在I、P帧之间都是B帧,在两个P帧之间也是设|??帧B帧。B帧传送它与I帧或P帧之间的差g息,或者P帧与后面P帧或I帧之间的差g息,或者它与前后I、P帧或P、P帧^均g间的差g息。当M内容变化愈大Ӟ两个I画面之间的数D;当主体内容变化小ӞI面画的间隔可以适当大一些。或者说QB帧、P帧所占比例越大,囑փ压羃比越高。一般两个I画面盔R13?5帧,盔R帧数不宜再多?/span>
下面?span>15帧ؓ例,说明VCD囑փ帧的排列序。I、P、B三种画面的典型设|方式,对NTSC制共U需半秒旉。节目输入顺序是按实际出现顺序排列的Q即I、B、B、P、B、B、P、B、B……I、B、B、P……Q但Z解码时便于从I、P画面插补得到B画面Q在~码录制节目Ӟ顺序改变了Q即按照I、P、B、B……序Q即改ؓ按原??????????…的画面顺序。解码时先解?帧?帧,再由其插补预计得?帧?帧等{。ؓ此,d解码器内讄动态存储器Q将I、P帧先解码q存储,再计出各个B帧。不q最后输出时Q还是应当按照实际播N序重l读出,按正顺序输出?/span>
1. encode yuv file
ffmpeg -s cif -vcodec mpeg4 -i paris.yuv paris.avi
-s 指定帧大?cif ?352x288Qqcif ?176x144Q?cif ?704x576
-vcodec 指定采用的编码器
-i 指定输入文g
2. output raw YUV420P file
ffmpeg -i paris.avi paris0.yuv
3. 一D视频输Zؓ囄序列
ffmpeg -i 1.avi cat%d.png -vcode png
-vcodec mjpeg
-vcodec ppm
ffmpeg -i 1.avi cat%04d.jpg -vcodec mjpeg -ss 0:1:2 -t 0:0:1
?.avi视频 1?2U?处开始,持箋1U长的视频输Zؓjpg的序?br>
ffmpeg -vcodec mjpeg -i 1.flv test%02d.jpg -ss 0:0:2 -t 0.001
-t 表示持箋旉?.001U,q个命o相当于截取开?U处的一qjpeg的图?br>
4. 多输入单输出
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
5. 单输入多输出
ffmpeg -i /tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0
-map file:stream_index 指定哪一个输入流用于输出,序对应
6. DVD to mpeg4
ffmpeg -i snatch_1.vob -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 -acodec mp2 -ab 128 snatch.avi
压制高品质mp4的参考参敎ͼ
'-mbd rd -flags +4mv+trell+aic -cmp 2 -subcmp 2 -g 300 -pass 1/2'
可以试试Q?'-bf 2', '-flags qprd', '-flags mv0', '-flags skiprd'
7. encode mpeg1/mpeg2
ffmpeg -i 1.avi -vcodec mpeg2video 2.mpg
注意mpeg2的codec?mpeg2video
其他codec可以使用 ffmpeg -formats 查看
压制高品质mp1/mp2的参考参敎ͼ
'-mbd rd -flags +trell -cmp 2 -subcmp 2 -g 100 -pass 1/2'
注意Q加 '-g 100' 可能会某些解码器没法解?
可以试试Q?'-bf 2', '-flags qprd', '-flags mv0', '-flags skiprd'
8. encode flv
ffmpeg -i 1.avi -ab 56 -ar 22050 -b 500 -r 15 1.flv
9. X 屏幕录像
FFmpeg can grab the X11 display.
ffmpeg -f x11grab -i :0.0 /tmp/out.mpg
0.0 is display.screen number of your X11 server, same as the DISPLAY environment variable.
ffmpeg -f x11grab -i :0.0+10,20 /tmp/out.mpg
0.0 is display.screen number of your X11 server, same as the DISPLAY environment variable.
10 is the x-offset and 20 the y-offset for the grabbing.
10. 韌频采?br>
ffmpeg -f audio_device -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
Note that you must activate the right video source and channel before launching FFmpeg with
any TV viewer such as xawtv (http://bytesex.org/xawtv/) by Gerd Knorr. You also have to set
the audio recording levels correctly with a standard mixer.
11. 常用选项
-i filename 输入文g
-f fmt 采用格式fmt
-y 覆盖输出文g
-ss position 搜烦到指定的旉处开?[-]hh:mm:ss[.xxx]的格式也支持
-b bitrate 讄比特率,~省200kb/s
-r fps 讄帧频 ~省25
-s size 讄帧大?格式为WXH ~省160X128.下面的简写也可以直接使用Q?br> sqcif 128X96 qcif 176X144 cif 352X288 4cif 704X576
-vcodec codec 强制使用codec~解码方式?如果用copy表示原始~解码数据必被拯?br>
-sameq 使用同样视频质量作ؓ源(VBRQ?br>
-g gop_size 讄囑փl大?br>
-intra 仅适用帧内~码
-bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4
-ab bitrate 讄音频码率
-ar freq 讄音频采样?br>
-ac channels 讄通道 ~省?
-an 不能音频纪?br>
-acodec codec 使用codec~解?br>
-benchmark 为基准测试加入时?br>
-hex 們ր每一个输入包
12. mpayer 截图Q?br>
mplayer -ss START_TIME -noframedrop -nosound -vo jpeg -frames N NAME_OF_VIDEO_FILE
获取视频旉(seconds)Q?br>
mplayer -identify movie-filename -nosound -vc dummy -vo null | grep ID_LENGTH
13. 快速合q视频文Ӟ
mencoder -oac copy -ovc copy -idx -o output.avi video1.avi video2.avi video3.avi
? 像映成Slice Group,是把宏块或者宏块对q行映射成不同的Slice GroupQSlice Group,0、Slice Group,1{等Q,在不同的Slice Group中再q行分成Slice Q相对于Slice Group来说QSlice 包含Slice Group内部按照光栅扫描序排列的整C宏块或宏块对Q但是若是相对于囑փ来说q不一定是按光栅扫描的序q箋排列的,因ؓ中间l过了图像到 Slice Group的映。Slice Group的提出是Z采用FMO实现错误隐藏。若是采用映,那么在同一Slice Group中的盔R宏块在实际图像中不一定是盔R的, 那么当某一个Slice Group内的Slice 的宏块发生丢包等错误的时候,可以利用其他Slice Group内的Slice的宏块对其进行预恢复,因ؓ其他Slice Group中的宏块或宏块对与该丢失宏块或宏块对在位|上是相ȝQ相x最强,预测误差最。当不采用Slice Group的时候,若是Slice的宏块发生错误,那么导致一部分I间位置盔R的宏块或宏块Ҏ法解出,那么得利用周边宏块或宏块对对其q行预测Q这 L预测效果随着靠q出错区域中心越差。显Ӟ采用Slice GroupҎ的预效果要好。如图所C?/p>
若红色边框区域发生错误,也即某Slice0发生错误Q那么上图中该区域宏块对应的原始囑փ的位|如左边所C,由Slice Group1恢复Slice Group0 Q由其空间相x可知恢复效果应该会不错?/p>
但是下图的情况就不一样了Q两个片的空间相x没那么强,恢复效果比上一U方法差?/p>
I 帧编码的基本程为:
2、MPEG压羃中的 I、B、P?/strong> 首先,MPEG-1压羃的基本思想:帧内压羃和间压~?br>其次,旉相关性的l计分析:l计的结果表?在间?~2帧的囑փ?各像素只?0%以下的点,其亮度差值变化超q?%,而色度差值的变化只有1%以下?br> |
? 始视频Q最原始的视频数据)Ҏ~码的需要,以不同的方式q行扫描产生两种视频帧:q箋或隔行视频Q隔行视频包括场和底场,q箋Q遂行)扫描的视 频与隔行扫描视频有着不同的特性和~码特征Q生了所谓的帧编码和场编码。一般情况下Q遂行q行帧编码,隔行帧可在~码和场~码间选取?img src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunnymov/EntryImages/20090817/%E5%BF%AB%E7%85%A7-2.jpg" alt="扫描格式" height="295" width="816">
在~码中,参考ؓ帧图像,采用帧运动补偿,两个场是联合~码Q?/span>Q在场编码中Q参考ؓ场图?/span>Q两个场是分别编码,采用动补ѝ?/span>
帧编码与场编码的选择
1.对于q动Ȁ烈的情况Q也是画面变化快,画面中的人物、背景等{短旉里就会有很大的变化。这P如果使用帧编码,׃盔R两行Q一行在场Q一行在底场Q的扫描旉相差了许多(因ؓ是隔行扫描)Q那么由于变化剧烈(画面在短旉内就会生很大的差异Q,盔R行没有太多的相关性。而对于场囑փ来说Q相邻行的扫描时间非常短Q所以即使运动剧烈,但还是有很强的时间相x。所以在q种情况下用场编码,p去除旉上的冗余?/p>
2.对于相对静止没有什么变化的情况应该相对好理解,因ؓ画面内容没有太大的变化,扫描旉的长短ƈ不媄响相x。倒是帧场的相邻行׃是真正意义上的相邻,所以空间相x肯定要比场的相邻行Q其实是隔行Q的I间相关性要大。那么在q种情况下用~码Q就能去除空间上的冗余?/p>
二、视频序列、场~码方式
1.固定帧编?/span>(全)----视频序列的全部始终采用帧编码方式?/span>
2.固定场编码(全场Q?/span>
视频序列中被分成两个场独立~码。编码规则:
1. I帧可~码成两?/span>I场或一?/span>I场和一?/span>P场,?/span>II?/span>IP.
2. P帧可~码成两?/span>P场或一?/span>P场和一?/span>B场,?/span>PP?/span>PB.
3. B帧可~码成两?/span>B场,?/span>BB.
3.囑փU、场自适应~码 (PAFF)
视频序列能被~码成一个或两个场Q自适应选择原则是根据采用该U编码方式的每一帧的RD倹{?/span>
4.宏块U、场自适应Q?/span>MBAFFQ?/span>
Zq一步提高编码效率,采用了宏块帧场自适应.,宏块U采用了宏块对(MBPQؓ基本~码单元Q如?/span>2所C)
H.264采用?/span>MBAFFҎQ?/span>
在图像中q动比较大的地方采用场编码,q动比较的地方采用帧编码,~码序例子如下Q?/span>
原文链接Q?/p>
http://blog.csdn.net/sunnymov/archive/2009/08/17/4454424.aspx
本程序时一ƾTS静态分析工P怿许多功能是o人欣喜的Q譬如对大文件的支持Q以及处理速度{等。Y件处于不断完善中Q将有更多优U的地方以友好的方式添加进来?/p>
功能介:
1.TS包列表显C,没有条目限制
2.十六q制昄数据
3.TS_调整字段Q以及PES分析
4.保存单个数据?br>5.对大文g的支持,可以支持几百G的文?br>6.可选数据分析,选择只分析文件的某一部分数据
7.psi/si表分?br>8.pidl计
9.同步分析Q图表显C?/p>
截图Q?br>
q行环境要求Q?br>1.Windowns2000以上操作pȝ
2.IE6.0以上
3.内存Q?28M以上
如果您遇C么问题,h交作者信?br>
本Y件供交流学习使用Q您无须为此支付费用Q但不得用于商业用途?br>致谢QEasy, hero, 介于01, 师傅:nooby
版权所有:2010 ZK天?br>
Win内核驱动开发QQ:75446994
视频~解码QQ:85390662
Email: shangxinjian1972@163.com
下蝲地址
一、SI信息的构?/p>
1、信息构?/p>
SI信息内容是按照network(|络)→transport stremQ传输流Q?#8594;serviceQ业务)→eventQ事Ӟ的分层顺序描qͼ如图1所C。SI数据信息是按照一定的数据l构q行存储的,q样一来才能达到方ѝ快捷地q行数据索和提取。SI数据主要有:|络信息、传输流信息、业务信息、业务的事g信息{,q且大量的信息都是通过描述W来传输的,所以可用树犉表来存储数据Q构成从|络、传输流、业务、事件的树状l构。机盒接收端的解析主要负责q些SI数据的重建?/p>
在数字电视系l中Qؓ了能有效C众多的数据包中组lvSI信息Q而用了很多的标识。有Network_id(|络标识)、Original_network_id(原始|络标识)、Transport_stream_id(传输标?、Service id(业务标识)、eventid_id(事g标识)、Bouquet_id(业务组标识)。这些标识是作ؓ信息查找定位用的Q例如:要在一个TS里找Z个业务信息,p知道q个业务信息在那个网l里、在哪个TS里和q个业务信息在这个流里的标识Q这样一来,通过层层qoQ就能精地定位描述q个业务信息的位|,q把它们扑և来进行数据组l。图1非常清楚地表明了这U查找思\?/p>
一个网l信息由network_id来定位?/p>
一个TS由network_id、Original_network_id、Transport_stream_id来定位,标明q个在那个|络播发Q它原属那个|络Qƈl它加上标识?/p>
一个业务由network_id、Original_network_id、Transport_stream_id、service_id来定位,标明q个业务在那个网l播发,它原属那个网l和那个,q给它加上标识。这体现在SDT表中?/p>
一个事件由network_id、Original_network_id、Transport_stream_id、service_id、event_id来定位,标明q个事g在那个网l播发,它原属那个网l和那个及那个业务Qƈl它加上标识。这体现在EIT表中?/p>
据此Q根据各个SI表的功能Q各表的IDl构如下Q?/p>
NITQnetwork_id、Original_network_id、Transport_stream_id 、service_id?/p>
SDTQOriginal_network_id、Transport_stream_id 、service_id?/p>
EITQOriginal_network_id、Transport_stream_id 、service_id、event_id?/p>
BATQbouquet_id 、Original_network_id 、Transport_stream_id 、service_id?/p>
另外Q还有一个PIDQ包标识Q,它的作用是给每一个数据包打上一个标讎ͼTS承蝲有视频数据、音频数据、PSI和SI信息数据、图文电视数据、字q数据、数据广播数据、交互业务数据、CApȝ的控制信息数据等{,除了PSI和SI信息数据和CApȝ的控制信息数据外Q其他的数据的PID都是通过PMT表给出的QCApȝ的控制信息数据的PID是由CAT表给出的Q而承载了PSI和SI信息的各U表的PID值是固定分配的。如下表
?nbsp; PID?/p>
PAT | 0X0000
CAT | 0X0001
TSDT | 0X0002
NIT、ST | 0X0010
SDT、BAT、ST | 0X0011
EIT、ST | 0X0012
RST、ST | 0X0013
TDT、TOT、ST | 0X0014
DIT | 0X001E
SIT | 0X001F
׃q些表是分配了固定的PID|所以机盒可以根据这些PID值来辨认出是什么表Qƈd表中的描q参数来生成EPG信息和完成各U数据的l织、解码出所需要的节目和信息?/p>
2、表的构?/p>
表是l成SI信息的一U数据结构。在TS中有很多不同节目的数据包Q解码器如何定哪个数据包属于某个节目?其答案就是在TS中的PSI和SI信息里,q些信息_地指引出获得某节目与该节目数据包的PID之间的关pR?/p>
由MPEG-2定义的TS里面Q数据包携带了两cM息:一是音、视频等素材的数据,二是PSI表。具有给定PID的数据包的有序排列就形成了TS。PSI表里的承载的内容主要是TSQ本节目)的描q参数。由MPEG-2定义的PSI主要包含有三个表QPAT、PMT、CAT。每个表都可作ؓ一个或多个TS包的净h入TS中传送?/p>
l 对于EIT表的子表h相同的table_id、oringinal_network_id、tansport_stream _id?service_id和version_number?/p>
以EIT表ؓ例。EIT的PID?X0012Q当它的table_id=0X4EӞEIT描述的是在当前TS中的当前/后箋QEIT present/followingQ事件信息;table_id=0X4FӞEIT描述的是在其它TS中的当前/后箋QEIT present/followingQ事件信息。这两个不同的描qŞ成了EIT的两个表。每个表分ؓ两个D,一个段用来描述当前正在播放的事Ӟ另一个段用来描述卛_播放的事件。此时两个段的table_id、service_id、tansport_stream_id是相同的Q但section_number不相同,section_number 0x00用来描述当前事gQsection_number 0x01描述下一个事件?/p>
NIT表主要是提供有关物理|络的信息,|络信息表传送本|络以及与此有关的其它网l的一些信息。每个网l都有唯一的识别符Qnetwork_idQ。网l信息表主要携带Q网l识别符(Network_ID)、网l名U、传输系l参?有线传输pȝ参数包括Q频率、调制方式、FEC外码、符L、FEC内码)、节目业务类型及Service_ID{信息。机盒只要调谐到携带NIT表的传送流中,卛_提取其它|络的参敎ͼ一般解码器便可Ҏ提取出来的信息,自动搜烦频道?/p>
q里说一说network_id和oringinal_network_id的分别。每个运营商都需要注册唯一的network_idQ假设中央电视台的network_id=0X01Q广州电视台的network_id=0X02 。当中央电视台直接播发自q节目Ӟnetwork_id=oringinal_network_idQ如果由q州电视台{播中央电视台的节目时Q那么network_id=0X02Qoringinal_network_id=0X01。也是说oringinal_network_id{于节目原发q营商的network_id?/p>
?nbsp; 业务描述表(SDTQ的作用
SDT表是由DVB定义的,是一个SI表,因此它是一个全局表,一个数字电视系l对应两个SDT表,分别为当前流Qactual transportQ表Qtable_id=0X42Q和其他?other transport)表(table_id=0X46Q。每一个TS对应一个子表(也有对应多个子表的,如同一个TS但业务来自不同的original_networkQ,通过tansport_stream_id和original_network_id来区分。图4是一个SDT表的构成图。从囑֏看出Q这个SDT表由两个表组成,一个是当前表Q只有一个子表;另一个是其他表Q由三个子表l成Q每个流对应一个子表?/p>
SDT表用于描q系l中业务的名U、业务提供者、是否有相应的事件描q表{方面的信息Q业务描q表可以描述当前传输,也可以描q其他传输流Q这p的Table_ID来区分。业务描q表提供了如下的信息Q属于哪一个节目业务群Q节目业务的cdQ如PAL、NTSC、SECAM、调频广播、图文电视、准视频Ҏ{;节目业务的提供者;可以接收该业务的国家和不可以接收该业务的国家Q指向特定的链接信息Q实现准视频Ҏ的指g息;实现多画面的控制信息Q指CZ用的加密pȝQ给出实C互式回传信道的电话号码;提供多语U的节目业务名称和广播者以及私有数据。但最常用的是业务列表Q即对业务名U的描述Q如中央1台、广州新d、珠江台{等?/p>
?nbsp; 事g信息表(EITQ的作用
EIT表是由DVB定义的,是一个SI表,因此它是一个全局表,一个数字电视系l每一个业务对应两UEIT表。一是EIT present/following表(描述当前事g/后箋事gQ,一个业务对应着一个EIT present/following表,EIT present/following表分为当前流表(table_id=0X4EQ和其他表Qtable_id=0X4FQ,每一个流通常对应6个(?个业务)EIT present/following子表Q每个子表由两个D늻成,分别是EIT presentD和EIT followingD,section_number= 0x00的段描述当前播放的事Ӟ section_number= 0x01D|q后l播放事Ӟ?所C。其他流表结构与当前表相同Q二是EIT scheduleQ时间表Q表Q一个业务最多可对应16个EIT schedule表,那么每个通常最多可对应6Q业务数Q?#215;16=96个子表,每个子表?56个段l成Q由于分D号?个比特,所以最多只能有256个分D)Q?/p>
对于EIT schedule表,它是用作描述一个业务在一D|_可以是一天、一周,最大可以是64天,Ҏ冗余带宽来进行设定)内所播放的节目安排,节目的播出安排是以时间和节目介作为描q的。时间及内容是描qC个事件的最基本元素Q例如:把一个业务所播放的每一个节目都看成是一个事Ӟ那么每一个节目开始播攄旉和播放时间的长度及事件的内容是该事件的基本元素QEIT schedule子表是用这一基本元素来描q每一个事件ƈ产生某一D|间内要发生的所有事件的列表Q因此EIT schedule子表的信息量很大QEIT表的D限?096字节Q,?56个sectionl成Q所以又引入了segmentQ片D)的概c把256个段分成32个segmentQ一个segment?个sectionQ分D)l成Q每个segment可以描述3个小时的事g信息Q也是_一个EIT schedule表由32个片D늻成,每个片段?个分D늻成,通过section_number来区分,那么每个子表可描q?2*3=96时Q?天)的事件信息,׃一个业务最多可对应着16个EIT schedule表,则对于一个业务来说最多可以描q?6(0X50----0X5F)*4=64天的事g信息。这里,segment相当于一个事件组Qsection是事件组内具体的一个事件。EIT schedule表也分ؓ当前表Qtable_id=0X50---0X5F ?6个)和其他流表(table_id=0X60---0X6F ?6个)Q?EIT schedule表是可选的Q即pȝ可以发送此表也可以不发送此表)Q事件信息按旉序排列?/p>
EIT表包含事件或节目的有x据,如事件的名称、开始时间、持l时间、运行状态等。事件信息表提供如下信息Q节目段的标识号、v始时间、持l时间、播攄态、是否加密;指向特定信息的链接信息;节目D多语种的简短介l;节目D늚详细介绍Q两D同栯目段的时间偏U;基本码流cd介绍Q如视频的幅型比、伴音的cd、字q的cd{;使用的加密系l介l;节目cd介绍Q如电媄/戏剧、新闅R综艺、体肌Ӏ少ѝ音乐、艺术、社会政沅R文教等Q节目限定年龄的U别介绍Q给出实C互式回传信道的电话号码;为满_节目D늚码率而提供的~存大小信息及私有数据。事件信息中提供了类gq播电视报所提供的节目表的内容,ҎEIT及其它表所提供的信息,可以做出各种EPG功能Q如按节目类型检索、按旉索及Ҏc节目的锁定{。可以说EIT表是提供EPG信息的主要表Q也是结构最复杂的SI表?/p>
在EIT present/following表中Q每一事g都用一个event_id来标识它Q每一个事件的序关系Q当前正在发生的事g/后箋发生的事ӞqEIT present/following来描q?/p>
那么如何来识别当前正在发生的事情和后l发生的事情呢?那是通过event_id来标识的Q如?所C。图中event_id=0X49表示当前正在发生的事Ӟevent_id=0X4A表示后箋发生的事件。那么在当前事g完成q入后箋事gӞ此时的后l事件变成当前事Ӟ后箋事g由一个新的事件代ѝ这一变化是用version_number来加以描q的。例如:
当前播出 19Q?0----19Q?0 新闻联播 event_id=0X49Q?/p>
后箋播出 19Q?1----20Q?0 动画?event_id=0X4AQ此时version_number=0
设新的后l?21Q?1---21Q?5 曲艺节目。当新闻联播完成后,则变化ؓQ?/p>
当前播出 19Q?1----20Q?0 动画?event_id=0X49Q?/p>
后箋播出 21Q?1----21Q?5 曲艺节目 event_id=0X4AQ此时version_number=1
?/span>6是由SDT表和EIT表所产生?/span>EPG信息Q图7是由EIT表所产生的一个节目频道的节目播出旉表?br>
EIT表是SI表中l构最复杂的表Q图8是它的结构图?/span>
机顶盒通常都有一?#8220;节目指南”的按钮,按动它就可以dEIT schedule自表里的信息Q显C某一个业务在某段旉内的所有事件列表?/span>
?span> 业务l关联表Q?/span>BATQ的作用
BAT表是?/span>DVB定义的,是一?/span>SI表,因此它是一个全局表,一个数字电视系l只对应一?/span>BAT表,?/span>table_id=0X
BAT表还支持一个特别的描述W,UCؓ国家获得性描q符。此描述W的意义是:q营商可能出于运营的需要,把一些业务提供给特定Q国Ӟ的h收看,而不希望l其他(其他国家Q的人群收看Q那么,可以利用国家获得性这一描述W,在其他h收看节目时不显C些业务。这个描q符同样支持SDT表,不过?/span>SDT 表中指的是某一个业务,而不是一个业务组。所以,BAT表概括地说是提供l不同观众不同组合节目的一U方法?/span>
?/span> 其他?/span>
对于PAT?/span>PMT?/span>CAT表,都是?/span>MPEG-2定义的,?/span>PSI里面的表Q所以这三个表都不是全局表,它们存在在每一?/span>TS中?/span>PSI信息使用q?/span>3个表来定义码的l构Q一?/span>TS对应一?/span>PAT表;一?/span>CApȝ和一?/span>TS对应一?/span>CAT表,CAT表的PID值L1Q每?/span>CAT都只l出其所在流?/span>EMMQ包括携带组密钥?/span>EMM和携带品密钥的EMMQ包?/span>PID{信息;一个业务(节目频道Q对应一?/span>PMT表,一?/span>TS对应多个PMTQ视中所携带的业务数而定Q且只对应本的业务?/span>
PAT?/span>PID?/span>0Q它?/span>PSI信息的根Q要查找信息旉先必MPAT开始,表中列出了传送码中所有节目所对应?/span>PMT?/span>PIDQ可Ҏq些PID扑ֈ相应?/span>PMT包。在PMT表中又可以找C节目有关的所有基本码,如视频、音频?/span>ECM和数据等有关信息?/span>PIDQ然后把q些标有q一PID的数据包l织h通过解码Q把节目或数据还原出来?/span>
以上PSI的几个表?/span>NIT表是解码所必需的表Q?/span>SDT?/span>EIT是构成业务信息所必需的表?/span>
SIq有其他的表Q如Q?/span>TDT表,UCؓ旉日期表,它给Z当前的时间和日期的信息,有时也可作ؓ机顶盒解码时钟的更新Q?/span>RST表,UCؓq行状态表Q属于可选表Q它用于快速更新某节目或某些节目的q行参数Q?/span>RST只有在状态或节目变更时才发送一ơ;ST表,UCؓ填充表,属于可选表Q它用来替代不传送的表?/span>
?/span> 描述W?/span>
描述W是用来携带节目要素?/span>TS等的各U参数的信息l构、语法与语义Q描q符?/span>PSI/SI表的构成MQ?/span>PSI/SI表的主要意义是传送这些描q符Qؓ机顶盒提供相关业务描qCq行参数Q可以认?/span>SI表是舟而描q符是舟上的货物。描q符的通用l构都是?/span>descriptor_tag (描述W标?/span>)字段与紧跟其后的descriptor_lengthQ描q符长度Q字D开始。每?/span>SI表通常都用特定的描述W,但也不限制这些描q符在其他表中用?/span>
描述W是随用它?/span>SI表一起发送的?/span>
描述W以及在它们?/span>PSI/SI表中的位|见下表
?/span>PSI/SI表里Q我们通常都看C个@环语句,如:
for(I=0;I<N;I++){
descriptor()
}
q个循环语句是用来引导机盒d描述参数用的Q以SDT子表ZQ由于一?/span>SDT子表里面包含了对多个业务的描qͼ每个业务的都使用?/span>Multilingual_service_name_descriptor?/span>service_descriptor描述W,也就是说一?/span>SDT子表里同L描述W被使用了多ơ(也可以理解ؓQ一个描q符里存有多个描q参敎ͼQ通过循环语句来对描述W进行重复有序的dQ来提取里面的描q参敎ͼ直到d为止?/span>
|络信息表(NITQ的D|据结构:
Netwok_information_section(){ |络信息D?/span>
Table_id 8bit 表标?/span>
Section_syntax_indicator 1bit D序列指C?/span>(标记?/span>),此?/span>=1?/span>,规定?/span>sectionW?/span>43位开始的5位是版本?/span>
Reserved_future_use 1bit 保留来使用字段
Reserved 2bit 保留字段
Section_length 12bit D长?/span>
Network_id 16bit |络标识
Reserved 2bit 保留字段
Version_number 5bit 表版本号Q作更新机制
Current_next_indicator 1bit 当前/下一个有效指CZQ标CQ,表示当前表是否有效,如果Current_next_indicator?/span>1,则当前表有效;0表示当前表无?/span>.
Section_number 8bit 当前D|?/span>
Last_section_number 8bit 最后段?/span>(反映了这个子表由多少个段l成Q如其gؓ0X01那么表示q个子表׃个段l成)
Reserved_future_use 4bit 保留来使用字段
Network_description_length 12bit |络描述W长?/span>
For(I=0;I<N;I++){ 获取|络
Descriptor() d|络描述参数Q网l名U描q符、连接描q符Q?/span>
}
reserved_future_use 4bit 保留来使用字段
transport_stream_loop_length 12bit 传输@环长?/span>
for(I=0;I<N;I++){ 获取传输(整个pȝ的传输流Q?/span>
transport_stream_id 16bit 传输标?/span>
original_network_id 16bit 原始|络标识
reserved_future_use 4bit 保留来使用字段
transport_descriptors_length 12bit 传输描述W长?/span>
for(j=0;j<N;j++){ 获取传输的描述子(有线传送系l描q符、业务列表描q符{)
descriptor() d描述参数
}
}
CRC_32 32bit 循环校验?/span>
}
**************ffmpeg的编?***************
1。首先获取ffmpeg 如果已经获取了ffmpeg的tar包那W一步可以蟩q?/p>
很多人找不到怎么下蝲,其实之前ffmpeg可以通过cvs下蝲Q不q最q他已经换成了更加强大的svn
如何使用SVN我这里不再介l,|上q有大量的安装和使用的文章可以借鉴Q这里简单罗列几个SVN辅助的YӞ
SubVersionQ从 http://subversion.tigris.org/ 下蝲Q支持linuxQ我们这里就装这?/p>
TortoiseSVNQ从 http://tortoisesvn.tigris.org/ 下蝲Q是很不错的SVN客户端程序,为windows外壳E序集成到windows资源理器和文g理pȝ的Subversion客户端,用v来很方便Qcommit动作变得像Winrar右键压羃一hѝ?/p>
okQ先装subversionQ记住最好之前装qapr和apr-utilQ在apache.org|站能下?/p>
wget http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz
tar zvxf subversion-1.3.2.tar.gz
cd subversion-1.3.2
./configure --with-apr=/usr/local/apr-httpd --with-apr-util=/usr/local/apr-util-httpd/
make
make install
到此Q我们就可以通过svn命o获取最新的ffmpeg?/p>
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
你会发现在你所在的目录Q自动出C个ffmpeg的目录,是你下载的源代码?/p>
我们q不能这么快~译ffmpegQ应该如果要让ffmpeg支持更多格式的{换,q需做一些前期工?/p>
2.支持mp3Qlinux当然是lameQ下载解?br>tar zxvf lame-3.97b3_.tar.gz
cd lame-3.97.1
./configure --prefix=/usr --enable-shared
make
make install
q里推荐量装在/usr下,默认是装?usr/local下。这样ffmpeg~译都能利的找到库文g
3.支持Ogg和Vorbis:
as4你可以安装一下如下tar?br>libvorbis, libvorbis-devel,libogg, libogg-devel
tar jxvf libvorbis-1.1.1-1-src.tar.bz2
cd libvorbis-1.1.1-1
./configure --prefix=/usr --enable-shared
make
make install
其他的(libvorbis-devel,libogg, libogg-develq三个tar直接解压可以了用tar jxvf libvorbis-devel.........)
4.支持xvid x264Q现在最行的两U高质量的压~格?br>xvid的编译安?br>下蝲 http://downloads.xvid.org/downloads/xvidcore-1.1.0.tar.gz
tar zvxf xvidcore-1.1.0.tar.gz
cd xvidcore-1.1.0/build/generic/
./configure --prefix=/usr --enable-shared
make
make install
***在安装X264之前必须安装nasm-0.98.39.tar.bz2 不然X264装不上去***
下蝲nasm-0.98.39.tar.bz2
tar jxvf nasm-0.98.39.tar.bz2
cd nams-0.98.39
./configure --prefix=/usr --enable-shared
make
make install
下蝲 x264-snapshot.tar.bz2
tar jxvf x264-snapshot.tar.bz2
cd x264-snapshot.tar.bz2
./configure --prefix=/usr --enable-shared
make
make install
5.AC3和dts~码的支?br>as4pȝg已经支持ac3~码Q编译的时候只要加--enable-a52 --enable-gpl参数p
libdts-0.0.2.tar.gz~译参数
tar zxvf libdts-0.0.2.tar.gz
cd libdts-0.0.2
./configure --prefix=/usr --enable-shared
make
make install
6.mpg4 aac格式支持Q由于服务器q针Ҏ机用h务,所以,cMaacQmpg4铃声格式的支持,我们也得做。这里我们安装faad2和faacp
下蝲请到http://www.audiocoding.com/modules/mydownloads/
***先编译FAAD2Q然后在~译FAAC。有个先后顺序的***
//////////////////////////FAAD2的编译\\\\\\\\\\\\\\\\\\\\\\\\\\\\
tar zxvf faad2-2.5.tar.gz
cd faad2
在编译FAAD2时可能出现的错误Q参照你的错误现象去修改
错误现象Q?/p>
cd faad2
[root@TServer faad2]# autoreconf -ivf
autoreconf: Entering directory `.'
autoreconf: configure.in: not using Gettext
autoreconf: running: aclocal --force
autoreconf: configure.in: tracing
autoreconf: running: libtoolize --copy --force
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.in: installing `./install-sh'
configure.in: installing `./missing'
common/mp4ff/Makefile.am: installing `./compile'
common/mp4ff/Makefile.am: installing `./depcomp'
plugins/Makefile.am:12: required directory plugins/bmp does not exist
plugins/xmms/src/Makefile.am:2: libdir was already defined in condition TRUE, which includes condition HAVE_BMP ...
configure.in:10: ... `libdir' previously defined here
plugins/xmms/src/Makefile.am:8: libdir was already defined in condition TRUE, which includes condition !HAVE_BMP ...
configure.in:10: ... `libdir' previously defined here
Makefile.am: installing `./INSTALL'
autoreconf: automake failed with exit status: 1
解决ҎQ?br>只要把BMP相关的编译条Ӟ一般都是以if-else形式存在的,注意要把整个块都删除Q都removeQ就好了?br>操作如下Q?br>[root@TServer faad2]# cd plugins/
[root@TServer plugins]# grep -lr BMP *
Makefile.am
xmms/src/libmp4.c
xmms/src/Makefile.am
[root@TServer plugins]# vi Makefile.am
if HAVE_MPEG4IP_PLUG
if HAVE_XMMS
SUBDIRS = xmms mpeg4ip
else
SUBDIRS = mpeg4ip
endif #HAVE_XMMS
else
if HAVE_XMMS
SUBDIRS = xmms
else
SUBDIRS =
endif #HAVE_XMMS
endif #HAVE_MPEG4IP_PLUG
~
~
~
~
~
~
~
"Makefile.am" [dos] 13L, 200C 已写?nbsp;
[root@TServer plugins]# grep -lr BMP *
xmms/src/libmp4.c
xmms/src/Makefile.am
[root@TServer plugins]# vi xmms/src/libmp4.c
/*
* MP4/AAC decoder for xmms
*
* OPTIONNAL need
* --------------
* libid3 (3.8.x - www.id3.org)
*/
#include <pthread.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include "neaacdec.h"
#include "mp4ff.h"
#define MP4_DESCRIPTION "MP4 & MPEG2/4-AAC audio player - 1.2.x"
#define MP4_VERSION "ver. 0.5-faad2-version - 22 August 2004"
#define MP4_ABOUT "Written by ciberfred"
#define BUFFER_SIZE FAAD_MIN_STREAMSIZE*64
static void mp4_init(void);
static void mp4_about(void);
static void mp4_play(char *);
static void mp4_stop(void);
"xmms/src/libmp4.c" [dos] 574L, 15762C 已写?br>[root@TServer plugins]# ls
in_mp4 Makefile.am mpeg4ip QCD QCDMp4 xmms
[root@TServer plugins]# grep -lr BMP *
xmms/src/Makefile.am
[root@TServer plugins]# vi xmms/src/Makefile.am
if HAVE_BMP
libdir=$(shell pkg-config --variable=input-plugin-dir bmp)
local_CFLAGS=$(shell pkg-config --cflags bmp)
local_LDFLAGS=$(shell pkg-config --libs bmp)
else
local_CFLAGS=`$(XMMS_CONFIG) --cflags` -Wall
local_LDFLAGS=`$(XMMS_CONFIG) --libs`
libdir = `$(XMMS_CONFIG) --input-plugin-dir`
endif #HAVE_BMP
lib_LTLIBRARIES = libmp4.la
libmp4_la_CFLAGS = $(local_CFLAGS) -Wall \
-I$(top_srcdir)/include -I$(top_srcdir)/common/mp4ff
libmp4_la_LIBADD = $(top_builddir)/libfaad/libfaad.la \
$(top_builddir)/common/mp4ff/libmp4ff.la
libmp4_la_LDFLAGS = -module -avoid-version $(local_LDFLAGS) -lpthread
libmp4_la_SOURCES = libmp4.c mp4_utils.c aac_utils.c
~
~
"xmms/src/Makefile.am" [dos] 11L, 373C 已写?br>[root@TServer plugins]# cd ..
[root@TServer faad2]# grep -lr BMP *
configure.in
[root@TServer faad2]# vi configure.in
AM_CONDITIONAL([HAVE_BMP], true)
fi
if test x$WITHDRM = xyes; then
AC_DEFINE(DRM, 1, [Define if you want to use libfaad together with Digital Radio Mondiale (DRM)])
AC_DEFINE(DRM_PS, 1, [Define if you want support for Digital Radio Mondiale (DRM) parametric stereo])
fi
AC_CONFIG_FILES(libfaad/Makefile)
AC_CONFIG_FILES(common/Makefile)
AC_CONFIG_FILES(common/mp4ff/Makefile)
AC_CONFIG_FILES(plugins/Makefile)
AC_CONFIG_FILES(plugins/xmms/Makefile)
AC_CONFIG_FILES(plugins/xmms/src/Makefile)
AC_CONFIG_FILES(plugins/mpeg4ip/Makefile)
AC_CONFIG_FILES(faad2.spec)
AC_CONFIG_FILES(frontend/Makefile)
AC_CONFIG_FILES(Makefile)
已查扑ֈ文gl尾Q再从开头l查?br>AC_PROG_MAKE_SET
AC_CHECK_PROGS(RPMBUILD, rpmbuild, rpm)
AM_CONFIG_HEADER(config.h)
AC_ARG_WITH(xmms,[ --with-xmms compile XMMS-1 plugin],
WITHXMMS=$withval, WITHXMMS=no)
AC_ARG_WITH(drm,[ --with-drm compile libfaad with DRM support],
WITHDRM=$withval, WITHDRM=no)
AC_ARG_WITH(mpeg4ip, [ --with-mpeg4ip compile mpeg4ip plugin],
WITHMPEG4IP=$withval, WITHMPEG4IP=no)
dnl Checks for header files required for mp4.h
AC_HEADER_STDC
AC_CHECK_HEADERS(stdint.h inttypes.h)
AC_CHECK_HEADERS(mathf.h)
AC_CHECK_HEADERS(float.h)
/BMP
fi
AM_CONDITIONAL(HAVE_XMMS, true)
else
AC_MSG_NOTICE(no xmms build configured)
AM_CONDITIONAL(HAVE_XMMS, false)
fi
if test x$WITHDRM = xyes; then
AC_DEFINE(DRM, 1, [Define if you want to use libfaad together with Digital Radio Mondiale (DRM)])
AC_DEFINE(DRM_PS, 1, [Define if you want support for Digital Radio Mondiale (DRM) parametric stereo])
fi
AC_CONFIG_FILES(libfaad/Makefile)AC_CONFIG_FILES(common/Makefile)AC_CONFIG_FILES(common/mp4ff/Makefile)AC_CONFIG_FILES(plugins/Makefile)
AC_CONFIG_FILES(plugins/xmms/Makefile)
"configure.in" [dos] 131L, 3776C 已写?br>[root@TServer faad2]# grep -lr BMP *
[root@TServer faad2]# ls
aacDECdrop common faad2.spec.in libfaad README
AUTHORS configure.in frontend Makefile.am README.linux
bootstrap COPYING include NEWS TODO
ChangeLog docs in_mpeg4aac.nsi plugins
[root@TServer faad2]# autoreconf -vir
/usr/bin/autoreconf: unrecognized option `-r'
Try `/usr/bin/autoreconf --help' for more information.
[root@TServer faad2]# autoreconf -vif
autoreconf: Entering directory `.'
autoreconf: configure.in: not using Gettext
autoreconf: running: aclocal --force
autoreconf: configure.in: tracing
autoreconf: running: libtoolize --copy --force
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.in: installing `./install-sh'
configure.in: installing `./missing'
common/mp4ff/Makefile.am: installing `./compile'
common/mp4ff/Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
autoreconf: Leaving directory `.'
cd faad2
autoreconf -vif
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install
////////////////faac的编译\\\\\\\\\\\\\\\\\\\\\\\\
cd faac
faac-1.25Q有两个地方需要修改,一是m4 macro文gQ另外一个是需要对文g的格式及权限作一下处?
错误现象 1Q?br>[root@TServer faac]# autoreconf -vif
autoreconf: Entering directory `.'
autoreconf: configure.in: not using Gettext
autoreconf: running: aclocal --force
configure.in:10: warning: underquoted definition of MY_DEFINE
run info '(automake)Extending aclocal'
or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
autoreconf: configure.in: tracing
autoreconf: running: libtoolize --copy --force
configure.in:10: warning: underquoted definition of MY_DEFINE
run info '(automake)Extending aclocal'
or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
autoreconf: Leaving directory `.'
[root@TServer faac]# grep MY_DEFINE *
configure.in:AC_DEFUN(MY_DEFINE, [ AC_DEFINE($1, 1, [define if needed]) ])
configure.in:AC_CHECK_DECL(strcasecmp, MY_DEFINE(HAVE_STRCASECMP))
configure.in: MY_DEFINE(HAVE_LIBMP4V2)
configure.in:AC_CHECK_DECL(strchr, MY_DEFINE(HAVE_STRCHR))
configure.in:AC_CHECK_DECL(memcpy, MY_DEFINE(HAVE_MEMCPY))
configure.in:AC_CHECK_DECL(strsep, MY_DEFINE(HAVE_STRSEP))
解决Ҏ1Q?br>[root@TServer faac]# grep MY_DEFINE *
configure.in:AC_DEFUN(MY_DEFINE, [ AC_DEFINE($1, 1, [define if needed]) ])
configure.in:AC_CHECK_DECL(strcasecmp, MY_DEFINE(HAVE_STRCASECMP))
configure.in: MY_DEFINE(HAVE_LIBMP4V2)
configure.in:AC_CHECK_DECL(strchr, MY_DEFINE(HAVE_STRCHR))
configure.in:AC_CHECK_DECL(memcpy, MY_DEFINE(HAVE_MEMCPY))
configure.in:AC_CHECK_DECL(strsep, MY_DEFINE(HAVE_STRSEP))
把configure.in文g中的AC_DEFUN(MY_DEFINE, [ AC_DEFINE($1, 1, [define if needed]) ])
修改?AC_DEFUN([MY_DEFINE], [ AC_DEFINE($1, 1, [define if needed]) ])
然后可以autoreconf -ivf了?/p>
错误现象2Q?br>./configure的时候,会出C下错误:
configure: creating ./config.status
config.status: creating common/Makefile
config.status: creating common/mp4v2/Makefile
config.status: creating \
.infig.status: error: cannot find input file: \
q个问题是文件的格式问题造成的,可以用一下方法处理:
[root@TServer faac]#find . -type f | xargs dos2unix
[root@TServer faac]#chmod * 777 -R
处理之后Q就可以安装了?br>
chmod +x bootstrap
./bootstrap
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install
7.支持3gp格式Q这也是现在好多手机支持的格式,所以也得支持编?/p>
~译的时候加?-enable-amr_nb --enable-amr_wb参数pQ根据编译系l的提示Q所以我们得下蝲一
些编?gp所需得文件?br>先在ffmpeg-0.4.9-p20051120/libavcoder/Z个目?br>mkdir -p amr
mkdir -p amr_float
mkdir -p amrwb_float
下蝲http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26073-530_ANSI_C_source_code.zip
解压以后把里面的文g都拷贝到libavcodec/amr
下蝲http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-530_ANSI-C_source_code.zip
解压以后把里面的文g都拷贝到libavcodec/amrwb_float
下蝲http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-540_ANSI_C_source_code.zip
解压以后把里面的文g都拷贝到libavcodec/amr_float
修改libavcodec/amr/makefile 扑ֈCFLAGS = -Wall -pedantic-errors -I. $(CFLAGS_$(MODE)) -D$(VAD) 换成CFLAGS = -Wall -I. $(CFLAGS_$(MODE)) -D$(VAD) -DMMS_IO
8.~译ffmpeg-0.4.9-p20051120
tar xvf ffmpeg-0.4.9-p20051120.tar
cd ffmpeg-0.4.9-p20051120
./configure --prefix=/usr --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb --enable-amr_nb-fixed --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-dts --enable-pp --enable-faad --enable-faadbin --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay --cpu=CPU
make
make install
修正一下,如果上面的configure不行Q在我的机器上得q样Q可能由于版本的关系Q?br>./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-x11grab --prefix=/usr --enable-shared
补充1Q?br>要是说在当在cpu是x86的情况下Q不能编译过去,如果你真~译不过去,可以试着加上--cpu=CPU
补充2Q?br>当遇到编译ffmpeg出错Ӟ扑ֈvi ffmpeg/libavcodec/x264.c删除x4->params.rc.b_cbr = 1;q一?/p>
到此Q一个ffmpeg~译好了Q不q目前管方的ffmpegq不支持wma9和rmvbQ不q网上有很多解决Ҏ?/p>
ffmpeg的{换参敎ͼ
ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 320x240 -b 128 -r 15 test.3gp
*************************mencoder的编?*******************************
mencoder安装?/p>
1、下载主E序Q?MPlayer-1.0rc1.tar.bz2
2、下载essential-20061022.tar.bz2Q安装:
tar vjxf essential-20061022.tar.bz2
mv essential-20061022 /usr/lib/codes
chmod 644 /usr/lib/codes/*
chown root.root /usr/lib/codes/*
3、下载windows-essential-20061022.zipQ安装:
unzip windows-essential-20061022.zip
mv windows-essential-20061022 /usr/lib/wincodes
chmod 644 /usr/lib/wincodes/*
chown root.root /usr/lib/wincodes/*
4、安装mplayer
tar vjxf MPlayer-1.0rc1.tar.bz2
cd MPlayer-1.0rc1
./configure --prefix=/usr --with-codecsdir=/usr/lib/codecs/ --language=zh_CN
make
make install
如果你需要用mplayer在linux下播放视频,q需要加?-enable-gui(囑Ş界面)Q不q这样就要安装多很多东西了,q里我们只用它的mencoderQ所?-enable-gui可以省略
mencoder的配|参敎ͼ
./configure --prefix=/usr --with-codecsdir=/usr/lib/codecs/ --language=zh_CN
mencoder转换参数Q?br>mencoder /var/www/woyo/image.woyo.com/%inputfile% -o /var/www/woyo/image.woyo.com/%outputfile% -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:last_pred=3:dia=2:cmp=3:vb_strategy=1 -sws 3 -vf scale=400:300 -ofps 30 -srate 22050 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames
声明Q以下内容{帖自http://blog.lmtw.com/b/moreframe/archives/2006/40865.htmlQ作者写的非常好Q感谢作者的辛苦?br> 应该说真正了解TSQ还是看了朋友推荐的《数字电视业务信息及其编码》一书之后,MPEG2 TS和数字电视是紧密不可分割的,值得ȝ一下其中的一些关pR?/p> ISO/IECQ?3818Q?Q系l部分;ISO/IECQ?3818Q?Q视频;ISO/IECQ?3818Q?Q音频;ISO/IECQ?3818Q?Q一致性测试;ISO/IECQ?3818Q?QY仉分;ISO/IECQ?3818Q?Q数字存储媒体命令与控制QISO/IECQ?3818Q?Q高U音频编码;ISO/IECQ?3818Q?Q系l解码实时接口; MPEG2pȝd包括Q?. 规定以包传输数据的协议;2. 规定收发两端数据同步的协议Q?. 提供多个数据的复用和解复用协议Q?. 提供数据加密的协议。以包Ş式存储和传送数据流是MPEG2pȝ之要炏V?/p> ES是直接从~码器出来的数据,可以是编码过的视频数据流Q音频数据流Q或其他~码数据的l称。ES经qPES打包器之后,被{换成PES包。PES包由包头和payloadl成Q具体格式摘录如下: 可以看到PTS/DTS是打在PES包里面的Q这两个parameters是解册音频同步昄Q防止解码器输入~存上溢或下溢的关键。PTS表示昄单元出现在系l目标解码器(STD: system target decoder)的时_DTS表示存取单元全部字节从STD的ES解码~存器移走的时刻?span lang=ZH-CN style="FONT-SIZE: 11.5pt; FONT-FAMILY: 宋体">每个I?/span>P?/span>B帧的包头都有一?/span>PTS?/span>DTSQ但PTS?/span>DTS?/span>B帧都是一LQ无L?/span>B帧的DTS。对I帧和P帧,昄前一定要存储于视频解码器的重新排序缓存器中,l过延迟Q重新排序)后再昄Q一定要分别标明PTS?/span>DTS?/span> 上节介绍q,ES首先需打包成PES包Q然后PESҎ需要打包成PS或TS包进行存储或传输。其每\ES只包含一路信源的~码数据,所以每路PES也只包含相对应信源的数据?/p> 对PS而言Q每个PES包头含有PTS和DTSQ流识别码,用于区别不同性质ES。然后通过PS复用器将PES包复用成PS包。实际上是将PES包分解ؓ更细的PS包。在解码的时候,解复用器PS分解成一个个PES包,拆包器然后将PES包拆成视频和音频的ESQ最后输入至各自解码器进行解码。一个问题是Q各个ES在解码时Q如何保证视音频的同步呢Q除了PTS和DTS的配合工作外Q还有一个重要的参数是SCR(system clock reference)。在~码的时候,PTSQDTS和SCR都是由STC(system time clock)生成的,在解码时QSTC会再生,q过锁相环\QPLLQphase lock loopQ,用本地SCR怽与输入的瞬时SCR怽锁相比较Q以定解码q程是否同步Q若不同步,则用q个瞬时SCR调整27MHz的本地时钟频率。最后,PTSQDTS和SCR一起配合,解决视音频同步播攄问题。PS格式摘录如下Q?/p> PS包的长度比较长且可变Q主要用于无误码环境里,因ؓ长的话Q同步越困难Q且在丢包的情况下,重组也越困难。所以,PS适合于节目信息的~辑和本地内容应用的application?/p> TS也是由一个或多个PESl合而来的,他们可以h相同的时间基准,也可以不同。其基本的复用思想是,对具有相同时间基?font color=#000000>的多个PES现进行节目复?/font>Q然后再对相互有独立旉基准的各个PSq行传输复用Q最l生出TS?/font>
TS包由包头和包数据2部分l成Q其中包头还可以包括扩展的自适用区。包头长度占4bytesQ自使用区和包数据共?84bytesQ整个TS包长度相当于4个ATM包长?span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: ˎ̥">TS包的包头由如下图摘录所C的同步字节、传输误码指C符、有效蝲荷单元v始指C符、传输优先、包识别Q?/span>PID-Packet IdentificationQ、传输加扰控制、自适应区控制和q箋计数?/span>8个部分组成?/span>
![]() 其中Q可用同步字节位串的自动相关Ҏ,数据流中的包限Ӟ建立包同步;传输误码指示W,是指有不能消除误码时Q采用误码校正解码器可表C?/span>1bit 的误码,但无法校正;有效载荷单元起始指示W,表示该数据包是否存在定的v始信息;传输优先Q是l?/span>TS包分配优先权Q?/span>PID值是qL定的Q解码器ҎPID?/span>TS上从不同ES来的TS包区别出来,以重建原来的ESQ传输加扰控Ӟ可指C数据包内容是否加扰Q但包头和自适应区永q不加扰Q自适应区控Ӟ?/span>2 bit表示有否自适应区,卻I01Q表C有有用信息无自适应区,Q?/span>10Q表C无有用信息有自适应区,Q?/span>11Q表C有有用信息有自适应区,Q?/span>00Q无定义Q连l计数器可对PID包传送顺序计敎ͼ据计数器LQ接收端可判断是否有包丢失及包传送顺序错误。显Ӟ包头?/span>TS包具有同步、识别、检错及加密功能?/span> TS包自适应区由自适应区长、各U标志指C符、与插入标志有关的信息和填充数据4部分l成。其中标志部分由间断指示W、随机存取指C符?/span>ES优化指示W?/span>PCR标志、接Ҏ志、传输专用数据标志、原?/span>PCR标志、自适应区扩展标?/span>8个部分组成。重要的是标志部分的PCR字段Q可l编解码器的27MHz旉提供同步资料Q进行同步。其q程是,通过PLLQ用解码时本地用PCR怽与输入的瞬时PCR怽锁相比较Q确定解码过E是否同步,若不同步Q则用这个瞬?/span>PCR调整旉频率。因为,数字囑փ采用了复杂而不同的压羃~码法Q造成每幅囑փ的数据各不相同,使直接从压羃~码囑փ数据的开始部分获取时钟信息成Z可能。ؓ此,选择了某些(而非全部Q?/span>TS包的自适应区来传送定时信息。于是,被选中?/span>TS包的自适应区,可用于测定包信息的控?/span>bit和重要的控制信息。自适应区无M随每个包都发送,发送多主要由选中?/span>TS包的传输专用时标参数军_。标志中的随机存取指C符和接Ҏ志,在节目变动时Qؓ随机q入I帧压~的数据提供随入点Q也为插入当地节目提供方ѝ自适应Z的填充数据是׃PES包长不可能正好{?/span>TS包的整数倍,最后的TS包保留一部分有用容量,通过填充字节加以填补Q这样可以防止缓存器下溢Q保持ȝ率恒定不变?/span> 前面3节ȝ了MPEG2 TS的基本格式,其中包括PESQPS和TSQ以及相兛_D늚介绍。那么作ZU传输流QTS内容进行打?复用Q让其媒体内容变成TS传输Qƈ最l在解码端解码。简单来看,TS是一个传输层的协议栈Q它可以承蝲各种内容的传输,比如MPEGQWMVQH264Q甚xIPQ那么其中的传输规范是如何定义的呢?q个xPSIQ节目特定信息)要做的事情?/font> PSI由四张表构成QPATQPMTQCAT和NITQ这四张表分别描qC一个TS所包括的所有ES的传输l构。首先的一个概忉|QTS是以包Ş式传播,在编解码端都需要以一定的包ID来标识TS里承蝲的内容,比如QPAT表会存在于一个或多个TS包里Q所以要用一个特别的包ID来表C,另外Q不同的ES也需要不同的包ID来标识。我们有了PAT和PMTq两U表Q解码器可以根据PIDQ将TS上从不同ES来的TS包区分出来进行解码?/font> TS的解码分两步q行Q其一Q是从PID?span class=566290807-13102006>0的TS包里Q解析出PAT表,然后从PAT表里扑ֈ各个节目源的PIDQ一般此c节目源都由若干个ES组成,q描q在PMT表里面,然后通过节目源的PIDQ就可以在PMT表里索到各个ES的PID。其二,解码器根据PMT表里的ES的PIDQ将TS上的包q行区分Qƈ按不同的ES进行解码。所以,TS是经q节目复用和传输复用两层完成的,卛_节目复用Ӟ加入了PMTQ在传输复用Ӟ加入了PAT。同样在节目解复用时Q可以得到PMTQ在传输解复用时Q可以得到PAT。下囑־好地概述了其思想?/span> TS是支持多路复用的Q所以它可用来传输经复用后的多层节目。在复用q程中,要注意的是,解码q程中所需要面对的旉参考和同步问题Q因复用是需要各U信息同步进行的Q所以在复用q程中,需要插入相关的旉信息QPTSQDTSQPCR?/p> 在TS形成q程中,PTS和DTS是在ES打包成PESӞҎSTC的参考,其旉信息注入PES包中的,而之后在PES切成TSӞ再将PID和PCR信息注入到TS包中Q当多\TS再进行复用的时候,各\TS的PCR会被提取出来,再进行分析,然后再根据统一的STC参考,新的PCR生成q注入到TS中去Q最后,因ؓ原来PAT表信息不在适用Q所以新的PAT表需要再生成Qƈ附加到新的TS中厅R经q这多层的复用之后,新的TS即可以q入调制Q传输阶Dc过E可参见下图Q?/p> 解码q程要面对的问题是:解复用,视音频的同步Q解码缓存器无上下溢。解复用xTS在同一信道里不同时序进行传输的节目分离出来Q视音频同步由DTS, PTS和PCR三者协调完成,q且PCR是重建系l时间基准的l对时标Q而DTS和PTS是解码和重现时刻的相Ҏ标;对解码缓存器无上下溢的问题,必须借助于系l目标解码器QSTDQ模型来对其q行实现Q基本思想如下Q?/p>
其过E可参见下图Q?/p> |
有的|友安装ProCoder 3后,可以启动Q可以正怋用,有的|友安装ProCoder 3后,不能启动Q无法用。究竟ؓ什么会出现两种不同的情况呢Q经q几天对ProCoder 3多次q行安装卸蝲、卸载安装的试验Q终于找C产生问题的原因:与安装EDIUS4Q?.5?.51Q后采用的破解方法有直接关系?/p> EDIUS4Q?.5?.51Q的破解Ҏ有两U:W一U方法是q行Canopus.Edius.4.xcrack.exe解除30天的使用限制Q第二种Ҏ是将1.5KB的pavedius.dllQ?006-8-15 16:26Q复制到windows\system32中覆盖原文g解除30天的使用限制?/p> 采用W一U方法破解后Q?windows\system32中pavedius.dll的大ؓ48KBQ在q种情况下安装ProCoder 3后,windows\system32中pavedius.dll的大仍?8KBQProCoder 3没有破解Q所以不能启动,要想让ProCoder 3启动Q就必须?.5KB的pavedius.dllQ?006-8-15 16:26Q复制到windows\system32中覆盖原文g才行。如果你安装EDIUS4Q?.5?.51Q后采用了第一U破解方法,那么你安装ProCoder 3后就会遇到麻烦,启动不v来。本人就属于q种情况?/p> 采用W二U方法破解后Qwindows\system32中的pavedius.dll?.5KBQ在q种情况下安装ProCoder 3后,windows\system32中pavedius.dll的大变?.5KBQProCoder 3已被破解Q所以安装后可启动使用。如果你安装EDIUS4Q?.5?.51Q后采用了第二种破解ҎQ那么你幸q了Q安装上ProCoder 3后就能用?/p> ProCoder 3与pavedius.dll关系密切, ProCoder 3安装后,当windows\system32中或ProCoder 3的安装目录中的pavedius.dll?.5KB?.5KBӞProCoder 3可以启动Q正怋用。当windows\system32或ProCoder 3安装目录中的pavedius.dll?8KB?6KBӞProCoder 3׃能启动,无法使用。而ProCoder 2同pavedius.dll的关pMProCoder 3却有所不同。当windows\system32中的pavedius.dll?8KB?6KBӞ你就别想安装上ProCoder 2Q会提示盘I间不无法安装。必dpavedius.dll删除Q或pavedius.dll替换?.5KB?.5KB后才能安装。ProCoder 2安装上以后,windows\system32中有无pavedius.dll以及pavedius.dll的大都不媄响它正常使用?/p> ProCoder 3与ProCoder 2可以共存?br>在电脑中没有安装qEDIUS、或windows\system32中没有pavedius.dll的情况下Q?ProCoder 3安装后肯定可以正怋用。这?windows\system32中的pavedius.dll?.5KB(007-3-27 0:00)Q是由安?ProCoder 3生成的?/p>
|
Packet的概?/p>
在实际用中,因ؓTS已l内部具有很强的错误处理能力,所以一般用较多的?88字节一个包的格?204字节一个包的格式据说一般在高清节目中用较?
typedef
{
}PACKET_HEADER;
以上l构刚好占用32
?nbsp;
?nbsp;
q?nbsp;
请对照上面的PACKET_HEADERl构:
typedef
{
}PACKET_HEADER;
那么对照一?我们可以发现:
依此cL,再看一下第二个?0x47 W三个包?0x47 L解码E序<<Seekfor 上图我们可以发现,Taiwan-551.ts有一个节目叫"DIMO",它的Video q有一个节目叫"Service q个数据刚好和我们刚才的分析是吻合的. ?nbsp;
DVB SI是Specific 上表格的PID是Q)Q保留的Q;Q,分配的其他PQD一定不会占用这些PQDQ解复用E序需要用到的表格只有PAT,PMT,SDT,而EQ应用还需要用CAT,EPG应用q需要用NIT,EIT,TDT,TOT{表?所以在需要解复用的时候,伪代码需要这样写: PAT, (1) (2) (3) PAT表定义如? 各字D含义如? PMT, PMT表中包含的数据如? (1) (2) (3) PMT定义如下: 各字D含义如? reserved:4bits保留?一般是'0000' program_info_length:节目信息长度(之后的是N个描q符l构,一般可以忽略掉,q个字段׃表描q符ȝ长度,单位是Bytes) 紧接着是频道内部包含的节目类型和对应的PIDL? stream_type:8bits类?标志是Videoq是Audioq是其他数据. reserved:3 elementary_PID:13bits对应的数据PIDL(如果stream_type是Video,那么q个PID是Video reserved:4 ES_info_length:和program_info_lengthcM的信息长?其后是N2个描q符? CRC_32:32bitsD|是本段的CRC校验?一般忽? 从以上的分析可以看出,只要我们处理了PMT,那么我们可以获取频道中所有的PID信息,例如当前频道包含多少个Video,共多个Audio,和其他数?q能知道每种数据对应的PID分别是什? q样如果我们要选择其中一个Video和Audio收看,那么只需要把要收看的节目的Video 比较全面实现解复用的伪代码如? int void { { } } 以上伪代码可以实现基本的解复?所有的频道,所有stream的PID,选择特定的节目进行播?只要d每个Packet?88字节的内?然后每次都调用Process_Packet()卛_实现单的解复? 介绍到这?我们可以ȝ一下DVB搜台的原理了.(?zx?) 只要pȝ传输速度_?是UC?码率"的东?,实现实时播放是没有Q何问题的. SDT, (1) (2) (3) SDT定义如下: 各字D定义如? ?nbsp;