資源簡介
在一些視頻服務中,如VOD推流的快進、快退中,經常需要快速從ts節目流中找出I幀(I-frame)來,以便推流服務器可以推送只包含視頻畫面而沒有聲音的ts數據到終端,而終端并不需要做任何特殊處理,即可實現快進/快退的畫面效果。
因此,實現上需要做到以下三點:
1、要找到I幀
2、確保找出來的I幀數據前后都要完整,即符合MPEG-2的188長度的封包格式
3、去掉其中的音頻數據
本資源直接給出用java實現的從ts流中提取I幀的代碼
代碼片段和文件信息
/**
?*?從ts字節流中提取出I幀數據,且去掉其中的音頻數據,輸出的內容仍然符合MPEG-2的188結構
?*?@param?src:ts數據字節內容
?*?@param?pos:提取I幀的起始位置,即從ts數據字節內容的什么位置開始提取,默認給0即可
?*?@param?audioPid:ts數據中音頻的pid,以便去掉音頻數據,否則推送I幀數據時會聽到異常的聲音
?*?@return:符合MPEG-2的188數據封裝結構的I幀數據(可能是多個I幀數據)可以直接把返回內容寫到文件,用vlc播放看到效果
?*/
public?static?byte[]?getiframes(byte[]?srcint?posint?audioPid){
List?list?=?new?linkedList();
int?start?=?0;
int?idx?=?0;
idx?=?pos;
boolean?iframe?=?false;
int?offset?=?0;
int?suffix?=?0;
int?totalLen?=?0;
while(idx?(src.length-6)){
if(src[idx]==0x0?&&?src[idx+1]==0x0&&src[idx+2]==0x01?&&?src[idx+3]==0x00){
if(((src[idx+5]>>3)&0x07)==0x01){
if(!iframe){
start?=?idx;
iframe?=?true;
}
else{
if(idx>start){
offset?=?start%188;
suffix?=?188-(idx%188);
byte[]?buff?=?new?byte[idx+offset+suffix-start];
System.arraycopy(src?start-offset?buff?0?idx+offset+suffix-start);
totalLen?+=?buff.length;
list.add(buff);
}
start?=?idx+suffix;
- 上一篇:zookeeper的相關介紹
- 下一篇:java畢業設計外文文獻翻譯
評論
共有 條評論