h264视频流文件转flv文件(C语言源码实现)

封装flv文件头
46 4C 56 01 01 00 00 00 09 00 00 00 00
int write_header( flv_buffer *c )
{
    x264_put_tag( c, "FLV" ); // Signature
    x264_put_byte( c, 1 );    // Version
    x264_put_byte( c, 1 );    // Video Only
    x264_put_be32( c, 9 );    // DataOffset
    x264_put_be32( c, 0 );    // PreviousTagSize0

    return flv_flush_data( c );
}
封装script帧
12 00 00 9F 00 00 00 00 00 00 00 02 00 0A 6F 6E
4D 65 74 61 44 61 74 61 08 00 00 00 07 00 05 77
69 64 74 68 00 40 9E 00 00 00 00 00 00 00 06 68
65 69 67 68 74 00 40 90 E0 00 00 00 00 00 00 09
66 72 61 6D 65 72 61 74 65 00 40 39 00 00 00 00
00 00 00 0C 76 69 64 65 6F 63 6F 64 65 63 69 64
00 40 1C 00 00 00 00 00 00 00 08 64 75 72 61 74
69 6F 6E 00 40 2E E1 47 AE 14 7A E1 00 08 66 69
6C 65 73 69 7A 65 00 41 61 94 AB 20 00 00 00 00
0D 76 69 64 65 6F 64 61 74 61 72 61 74 65 00 40
B2 A7 D6 BF 89 26 FF 00 00 09 00 00 00 AA
 
int set_script_param( flv_hnd_t *handle, double i_width, double i_height)
{
    flv_hnd_t *p_flv = handle;
    flv_buffer *c = p_flv->c;
printf("set_script_param 1\n");
    x264_put_byte( c, FLV_TAG_TYPE_META ); // Tag Type "script data"

    int start = c->d_cur;
    x264_put_be24( c, 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现H264YUV的过程一般可以分为以下几个步骤: 1. 打开H264文件并读取其中的视频帧数据。 2. 解析H264码流并从中提取出YUV数据。 3. 将提取出的YUV数据写入到目标文件中。 以下是一个简单的C语言示例代码,演示如何实现H264YUV的功能: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_FRAME_SIZE 1024*1024 // 最大帧大小 int main(int argc, char **argv) { FILE *fp_in = NULL, *fp_out = NULL; // 输入输出文件指针 unsigned char *buf = NULL; // 存储读取的帧数据 int nSize = 0, nLen = 0, nWidth = 0, nHeight = 0, nFrameType = 0, nFrameRate = 0; // 帧数据的大小、长度、宽度、高度、类型、帧率等信息 unsigned char *pY = NULL, *pU = NULL, *pV = NULL; // YUV数据指针 int nYSize = 0, nUSize = 0, nVSize = 0; // YUV数据大小 if (argc != 3) { printf("usage: %s <input.h264> <output.yuv>\n", argv[0]); return -1; } // 打开输入文件 fp_in = fopen(argv[1], "rb"); if (!fp_in) { printf("failed to open input file %s\n", argv[1]); return -1; } // 打开输出文件 fp_out = fopen(argv[2], "wb"); if (!fp_out) { printf("failed to open output file %s\n", argv[2]); return -1; } // 分配缓冲区 buf = (unsigned char*)malloc(MAX_FRAME_SIZE); if (!buf) { printf("failed to allocate memory\n"); return -1; } // 读取帧数据 while ((nLen = fread(buf + nSize, 1, MAX_FRAME_SIZE - nSize, fp_in)) > 0) { nSize += nLen; if (nSize >= 4 && buf[nSize-4] == 0x00 && buf[nSize-3] == 0x00 && buf[nSize-2] == 0x00 && buf[nSize-1] == 0x01) { // 解析帧数据 if (nWidth && nHeight) { fwrite(pY, 1, nYSize, fp_out); fwrite(pU, 1, nUSize, fp_out); fwrite(pV, 1, nVSize, fp_out); } nFrameType = (buf[4] & 0x1f); nWidth = ((buf[5] & 0xff) << 8) | (buf[6] & 0xff); nHeight = ((buf[7] & 0xff) << 8) | (buf[8] & 0xff); nFrameRate = (buf[9] & 0xff); if (nFrameType == 5) { // IDR帧 nYSize = nWidth * nHeight; nUSize = nVSize = nYSize / 4; pY = buf + nSize - (nYSize + nUSize + nVSize); pU = pY + nYSize; pV = pU + nUSize; } else { // 非IDR帧 pY = pU = pV = NULL; } } } // 关闭文件 if (fp_in) { fclose(fp_in); } if (fp_out) { fclose(fp_out); } // 释放缓冲区 if (buf) { free(buf); } return 0; } ``` 以上代码只是一个简单的示例,实际的H264YUV过程可能还需要进行一些其他的处理,例如进行解码、图像处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠哉无忧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值