加载中…
个人资料
南冠彤
南冠彤
  • 博客等级:
  • 博客积分:0
  • 博客访问:411,015
  • 关注人气:59
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

(转)获取TS文件视频长度

(2012-12-30 19:59:15)
标签:

杂谈

分类: 音视频
本篇大部分还是扣的live555的代码。live555代码中有计算ts的clock的值的,根据clock决定rtp的发包间隔。将clock收集起来,从最后一个clock减去第一个clock就能得到TS文件的大概长度。

    本小程序前提是视频文件必须是TS文件,第一个字节是0x47,每个TS包大小188,其余情况未考虑。

  1.  
  2.  
  3. #include   
  4. #include   
  5.  
  6. #define TS_SYNC_BYTE 0x47  
  7. #define TS_PACKET_SIZE 188  
  8.  
  9. typedef struct {  
  10.     unsigned pid;  
  11.     double clock_begin;  
  12.     double clock_end;  
  13. pid_t;  
  14.  
  15. pid_t pid_array[8191]; // 裤子说一个ts最多有8191个pid。那就建立一个8191的数组。  
  16. unsigned char buf[TS_PACKET_SIZE];  
  17.  
  18. void get_length(unsigned charpkt);  
  19. void store_pid(unsigned pid, double clock);  
  20.  
  21. int main(int argc, char **argv) {  
  22.     if (argc 2) {  
  23.         fprintf(stderr, "please use %s \n"argv[0]);  
  24.         return 1;  
  25.     }  
  26.  
  27.     FILE *fp fopen(argv[1], "rb");  
  28.     if (!fp) {  
  29.         perror("fopen");  
  30.         return 1;  
  31.     }  
  32.     fseek(fp, 0, SEEK_END);  
  33.     int size ftell(fp);  
  34.     rewind(fp);  
  35.  
  36.     while (size 0) {  
  37.         int read_size fread(buf, 1, sizeof(buf), fp);  
  38.         size -= read_size;  
  39.         get_length(buf);  
  40.     }  
  41.  
  42.     int i;  
  43.     for (i 0; 8191; i++) {  
  44.         if (pid_array[i].pid != 0) {  
  45.             printf("PID:0x%x length:%fs\n"pid_array[i].pid,   
  46.                 pid_array[i].clock_end pid_array[i].clock_begin);  
  47.         else {  
  48.             break;  
  49.         }  
  50.     }  
  51.     return 0;  
  52. }  
  53.  
  54. void get_length(unsigned charpkt{  
  55.     // Sanity check: Make sure we start with the sync byte:  
  56.     if (pkt[0] != TS_SYNC_BYTE) {  
  57.         fprintf(stderr, "Missing sync byte!\n");  
  58.         return;  
  59.     }  
  60.  
  61.     // If this packet doesn't contain PCR, then we're not interested in it:  
  62.     uint8_t const adaptation_field_control (pkt[3] 0x30) >> 4;  
  63.     if (adaptation_field_control != && adaptation_field_control != 3) {  
  64.         return;  
  65.     }  
  66.  
  67.     // there's no adaptation_field  
  68.     uint8_t const adaptation_field_length pkt[4];  
  69.     if (adaptation_field_length == 0) {  
  70.         return;  
  71.     }  
  72.  
  73.     // no PCR  
  74.     uint8_t const pcr_flag pkt[5] 0x10;  
  75.     if (pcr_flag == 0) {  
  76.         return;  
  77.     }  
  78.  
  79.     // yes, we get pcr  
  80.     uint32_t pcr_base_high (pkt[6] << 24) (pkt[7] << 16) (pkt[8] << 8)  
  81.                         pkt[9];  
  82.     // caculate the clock  
  83.     double clock pcr_base_high 45000.0;  
  84.     if ((pkt[10] 0x80)) {  
  85.         clock += 90000.0; // add in low-bit (if set)  
  86.     }  
  87.     unsigned short pcr_extra ((pkt[10] 0x01) << 8) pkt[11];  
  88.     clock += pcr_extra 27000000.0;  
  89.  
  90.     unsigned pid ((pkt[1] 0x1F) << 8) pkt[2];  
  91.     store_pid(pid, clock);  
  92. }  
  93.  
  94. void store_pid(unsigned pid, double clock) {  
  95.     int i;  
  96.     for (i 0; 8191; i++) {  
  97.         if (pid == pid_array[i].pid) {  
  98.             break;  
  99.         }  
  100.     }  
  101.     if (i == 8191) {  
  102.         for (i 0; 8191; i++) {  
  103.             if (pid_array[i].pid == 0) {  
  104.                 break;  
  105.             }  
  106.         }  
  107.         pid_array[i].pid pid;  
  108.         pid_array[i].clock_begin clock;  
  109.     else {  
  110.         pid_array[i].clock_end clock;  
  111.     }  

 


本文出自 “海狗哥的流媒体空间” 博客,请务必保留此出处http://jeremiah.blog.51cto.com/539865/281885

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有