根据ts文件的pcr值,获取文件总时长
直接上代码
long long int get_ts_duration(string file_url)直接上代码
{
ts_pid.clock_begin = 0;
ts_pid.clock_end = 0;
ts_pcr_error_time = 0;
ts_pcr_error = false;
int pkt_count = 0;
USES_CONVERSION;
std::string file_url=T2A(m_Url);
FILE *fp = fopen(file_url.c_str(), "rb");
if (!fp) {
MessageBox(m_Url);
return 1;
}
_fseeki64(fp, 0, SEEK_END);
libvlc_time_t totle_size = _ftelli64(fp);
libvlc_time_t size = totle_size;
rewind(fp);
// 该部分为提升效率前的代码
// while (size>0)
// {
// int read_size=fread (buf, 1, sizeof(buf), fp);
// size -= read_size;
// double clock = get_length(buf);
//
// if (clock >= 0)
// {
// if((clock >= 0) && (ts_pid.clock_begin == 0.0))
// {
// ts_pid.clock_begin = clock;
// }
//
// if (clock >= ts_pid.clock_end)
// {
// if (clock-ts_pid.clock_end>200&&ts_pid.clock_end!=0)
// {
// continue;
// }
// ts_pid.clock_end = clock;
// }
// else if((clock > 0) && (clock < ts_pid.clock_end))
// {
// ts_pcr_error_time += (ts_pid.clock_end - ts_pid.clock_begin);
// ts_pid.clock_end = clock;
// ts_pid.clock_begin = clock;
//
// }
// }
//
// }
while (size>0)
{
if (ts_pcr_error==false)
{
if ((totle_size-size)>188*10*1000&&size>188*10*1000)
{
_fseeki64(fp,188*10*1000,SEEK_CUR);
size -= 188*10*1000;
}
}
double clock=-5;
do
{
int read_size=fread (buf, 1, sizeof(buf), fp);
size -= read_size;
clock = get_length(buf);
pkt_count++;
} while (clock<0&&size>0);
if (clock >= 0)
{
if((clock >= 0) && (ts_pid.clock_begin == 0.0))
{
ts_pid.clock_begin = clock;
}
if (clock >= ts_pid.clock_end)
{
if (clock-ts_pid.clock_end>200&&ts_pid.clock_end!=0)
{
continue;
}
ts_pid.clock_end = clock;
pkt_count = 0;
}
else if((clock > 0) && (clock < ts_pid.clock_end))
{
if (ts_pcr_error==true)
{
ts_pcr_error_time += (ts_pid.clock_end - ts_pid.clock_begin);
ts_pid.clock_end = clock;
ts_pid.clock_begin = clock;
ts_pcr_error = false;
}
else
{
if ((totle_size-size)>188*10*1000)
{
_fseeki64(fp,-188*(10*1000+pkt_count),SEEK_CUR);
size += 188*(10*1000+pkt_count);
}
pkt_count = 0;
ts_pcr_error = true;
}
}
}
}
fclose(fp);
double time = 0;
time = ts_pid.clock_end - ts_pid.clock_begin + ts_pcr_error_time;
llong long int ts_time = time*1000;
return ts_time;
}
double get_length(unsigned char* pkt)
{
if (pkt[0] != TS_SYNC_BYTE) {
return -1;
}
uint8_t const adaptation_field_control = (pkt[3] & 0x30) >> 4;
if (adaptation_field_control != 2 && adaptation_field_control != 3) {
return -2;
}
uint8_t const adaptation_field_length = pkt[4];
if (adaptation_field_length == 0) {
return -3;
}
uint8_t const pcr_flag = pkt[5] & 0x10;
if (pcr_flag == 0) {
return -4;
}
uint32_t pcr_base_high = (pkt[6] << 24) | (pkt[7] << 16) | (pkt[8] << 8)
| pkt[9];
double clock = pcr_base_high / 45000.0;
if ((pkt[10] & 0x80)) {
clock += 1 / 90000.0;
}
unsigned short pcr_ext = ((pkt[10] & 0x01) << 8) | pkt[11];
clock += pcr_ext / 27000000.0;
return clock;
}