分解264/265裸流的帧

来源:互联网 发布:数据库关联查询sql语句 编辑:程序博客网 时间:2024/06/05 09:32

也可直接分解avi文件格式的

#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <limits.h>#include <string.h>#include <assert.h>#include <pthread.h>typedef struct split_frame_s{    unsigned char buffer[1*1024*1024];    unsigned char dst[1*1024*1024];    FILE* fp;    int file_type; // 0->264, 1->265    int running;    pthread_t pid;}split_frame_s;static split_frame_s g_arg;int split_frame_264(char* src, int s_len, int* r_len, char* dst, int* len){    *r_len = 0;    *len = 0;    int i = 0;    int j = 0;    int valid = 0;    for (i = 0; i < s_len; i++)    {        if (i+3 < s_len && src[i] == 0 && src[i+1] == 0 && src[i+2] == 0 && src[i+3] == 1)        {            //printf("%d %02x %02x %02x %02x %02x %02x\n", __LINE__, src[i], src[i+1], src[i+2], src[i+3], src[i+4], src[i+5]);            for (j = i+3; j < s_len; j++)            {                if (j+3 < s_len && src[j] == 0 && src[j+1] == 0 && src[j+2] == 0 && src[j+3] == 1)                {                    //printf("%d %02x %02x %02x %02x %02x %02x\n", __LINE__, src[j], src[j+1], src[j+2], src[j+3], src[j+4], src[j+5]);                    valid = 1;                    break;                }            }            break;        }    }    if (valid)    {        memcpy(dst, src+i, j-i);        *len = j -i;        *r_len = j;    }    return 0;}int split_frame_265(char* src, int s_len, int* r_len, char* dst, int* len){    *r_len = 0;    *len = 0;    int i = 0;    int j = 0;    int valid = 0;    for (i = 0; i < s_len; i++)    {        if (i+5 < s_len && src[i] == 0 && src[i+1] == 0 && src[i+2] == 0 && src[i+3] == 1 && src[i+5] == 1)        {            //printf("%d %02x %02x %02x %02x %02x %02x\n", __LINE__, src[i], src[i+1], src[i+2], src[i+3], src[i+4], src[i+5]);            for (j = i+3; j < s_len; j++)            {                if (j+5 < s_len && src[j] == 0 && src[j+1] == 0 && src[j+2] == 0 && src[j+3] == 1 && src[j+5] == 1)                {                    //printf("%d %02x %02x %02x %02x %02x %02x\n", __LINE__, src[j], src[j+1], src[j+2], src[j+3], src[j+4], src[j+5]);                    valid = 1;                    break;                }            }            break;        }    }    if (valid)    {        memcpy(dst, &src[i], j-i);        *len = j -i;        *r_len = j;    }    return 0;}void* split_frame_proc(void* arg){    int r_len = 0;    int d_len = 0;    int writable = 0;    while (g_arg.running)    {        int n = fread(g_arg.buffer+writable, 1, sizeof(g_arg.buffer)-writable, g_arg.fp);        if (n > 0)        {            writable += n;        }        if (writable > 0)        {            if (g_arg.file_type)            {                split_frame_265(g_arg.buffer, writable, &r_len, g_arg.dst, &d_len);            }            else            {                split_frame_264(g_arg.buffer, writable, &r_len, g_arg.dst, &d_len);            }            if (r_len > 0 && d_len > 0)            {                memmove(g_arg.buffer, g_arg.buffer+r_len, sizeof(g_arg.buffer)-r_len);                writable = sizeof(g_arg.buffer)-r_len;                printf("%d %02x %02x %02x %02x %02x %02x, len: %d\n", __LINE__, g_arg.dst[0], g_arg.dst[1], g_arg.dst[2], g_arg.dst[3], g_arg.dst[4], g_arg.dst[5], d_len);            }        }        if (feof(g_arg.fp))        {            fseek(g_arg.fp , 0L, SEEK_SET);        }        usleep(20*1000);    }    fclose(g_arg.fp);    return 0;}int split_frame_init(const char* path){    g_arg.fp = fopen(path, "r");    assert(g_arg.fp != NULL);    g_arg.file_type = strstr(path, "265") ? 1 : 0;    g_arg.running = 1;    pthread_create(&g_arg.pid, NULL, split_frame_proc, NULL);    return 0;}int split_frame_exit(){    if (g_arg.running)    {        g_arg.running = 0;        pthread_join(g_arg.pid, NULL);    }    if (g_arg.fp)    {        fclose(g_arg.fp);    }    return 0;}// testint main(int argc, char** argv){    if (argc != 2)    {        printf("Usage: %s [file]\n", argv[0]);        printf("sample: %s hik.265\n", argv[0]);        printf("sample: %s hik.264\n", argv[0]);        return 0;    }    split_frame_init(argv[1]);    getchar();    return 0;}
1 0
原创粉丝点击