ts文件时长获得

本文介绍了一种通过解析TS文件的PCR值来获取文件总时长的方法。主要包含读取TS文件、跳过无效数据段、提取PCR值并计算时长的步骤。代码中使用了libvlc_time_t类型来存储时长,并通过fseeki64进行文件定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据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;

}  

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值