• 大小: 2KB
    文件类型: .java
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: Java
  • 标签: java  ts  提取  I帧  

资源简介

在一些视频服务中,如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;

评论

共有 条评论