关于HTML5在线播放x.264编码的mp4格式文件的长时间缓冲问题

为了兼容iphone及ipad,我把在线播放的格式都改为了x.264编码的mp4格式,用jwplayer播放。但发现一个问题:
就是播放视频的时候,都是等视频完全加载(或者说下载)完毕以后才开始播放,缓冲很长时间。

在google找答案,发现是因为我转换的mp4文件索引信息在文件底部,就造成了要读取到索引信息的时候才开始播放。网上提供了一个解决办法:http://renaun.com/blog/code/qtindexswapper/
就是用这个工具改一下索引的位置。改了以后发现mp4只读取很少部分就开始播放了,大大减少了缓冲

但我觉得把文件转换为mp4,再用TIndexSwapper改索引有些麻烦(因为是给客户用,转两次比较麻烦),想有个一次性转换加改索引的办法,于是找到了Any Video Converter这个软件带有改索引的功能:

开启这个功能后,比如100M的文件,用firebug观测,用Any Video Converter转换的视频并不需要全都读取完才播放,而是大概加载70M开始播放,说明索引已经不在文件底部了。但相同的视频,用别的软件转为mp4,再用TIndexSwapper改索引却只需加载1-2M就开始播放了,边播放边继续加载。

我的问题是,都是改索引到头部以便快速加载,为什么Any Video Converter的要家在80%左右才开始播放呢?现在不管youtube或者youku都开始用x.264编码的mp4格式,应该很普及了啊,有什么更好的一次性转换软件吗?

这是另一个fix工具,http://howbits.com/stream-mp4-website-h264-high/
但我想找的是转换以后就自动fix的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H.264编码是一个复杂的过程,需要涉及许多算法和数据结构,因此编写一个完整的H.264编码库是一个相当复杂的任务。下面是一个简单的示例程序,用于演示如何使用C语言编写一个H.264编码器: ```c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> // 定义H.264编码器结构体 typedef struct { int width; // 视频的宽度 int height; // 视频的高度 int fps; // 视频的帧率 uint8_t *buffer; // 视频帧的缓冲区 int buffer_size; // 视频帧缓冲区的大小 } H264Encoder; // 初始化H.264编码器 H264Encoder* h264_encoder_init(int width, int height, int fps) { H264Encoder* encoder = (H264Encoder*)malloc(sizeof(H264Encoder)); encoder->width = width; encoder->height = height; encoder->fps = fps; encoder->buffer_size = width * height * 3 / 2; encoder->buffer = (uint8_t*)malloc(encoder->buffer_size); return encoder; } // 编码一帧视频 int h264_encoder_encode_frame(H264Encoder* encoder, uint8_t* frame_data, int frame_size) { // TODO: 实现H.264编码过程,将编码后的数据存储到encoder->buffer中 // 注意:编码后的数据大小可能会超过encoder->buffer_size,因此需要进行检查并返回错误码 return 0; } // 关闭H.264编码器 void h264_encoder_close(H264Encoder* encoder) { free(encoder->buffer); free(encoder); } int main() { // 初始化H.264编码器 H264Encoder* encoder = h264_encoder_init(640, 480, 30); // 加载一帧视频数据 FILE* fp = fopen("test.yuv", "rb"); uint8_t* frame_data = (uint8_t*)malloc(encoder->buffer_size); int frame_size = fread(frame_data, 1, encoder->buffer_size, fp); // 编码视频帧 int ret = h264_encoder_encode_frame(encoder, frame_data, frame_size); if (ret != 0) { fprintf(stderr, "Error: H.264 encoding failed.\n"); return -1; } // 关闭H.264编码器 h264_encoder_close(encoder); return 0; } ``` 上述示例程序仅仅是一个简单的框架,其中的TODO注释需要您自己实现H.264编码过程。在实现过程中,您可能需要使用到一些开源的H.264编码库,如x264等。此外,我们还需要注意H.264编码的标准,以便生成符合标准的H.264视频流。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值