分解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
- 分解264/265裸流的帧
- 数的分解、分解质因数
- 裸的素因子分解==
- 音视频流的合成和分解
- 5. 矩阵的LU分解、QR分解
- C项目的分解
- 乘积最大的分解
- 数的分解
- 过程分解的必要性
- MATLAB的LU分解
- 3nf的分解
- 结婚的WBS分解
- 排列的分解
- 分解质因数的问题
- 数的分解
- 矩阵分解的Jungle
- Job的任务分解
- 分解链接的方式:
- FOR XML PATH的使用方法
- java虚拟机内存分区
- 三极管概念工作原理及其应用
- 操作Cassandra(2)-添加,替换,移动和删除节点
- 解决:mac visual code1.8.1 运行时提示:无法在 PATH 上找到运行时”node“。
- 分解264/265裸流的帧
- 摄像机人工标定(OpenCV2.4.11)
- git入门
- oracle用逗号分隔符分割的字段,转换中文说明
- poj 2079 Triangle (旋转卡壳)
- lua c++ 相互调用
- 配置高并发jdbc连接池
- Bean的作用域
- ROW_NUMBER的使用方法