使用ffmpeg读取flv视频总时长
2011-04-18 11:40
399 查看
使用ffmpeg时总会遇到到在读取flv视频时读不到总时长,方法如下:
int seconds = pFormatCtx->streams[videoStream]->duration*pFormatCtx->streams[videoStream]->time_base.num/pFormatCtx->streams[videoStream]->time_base.den;
其中变量及类型参考:
http://dranger.com/ffmpeg/tutorial01.html
此方法是找到AVFormatContext结构体中的第一个视频流AVStream结构中的duration来计算,问题就发生在在处理flv视频文件时读到的duration是个严重错误的值(0或着很大很大的正负值)。
这个问题,困扰了一天终于有解决方法了:
1。在测试tutorial01时,发现了dump_format(pFormatCtx, 0, argv[1], 0);这一行代码,这个方法在avformat.h头中,用此demo打开一个flv视频时居然可以打印出正确的duration,于是找到dump_format源码,如下处理:
av_log(NULL, AV_LOG_INFO, " Duration: ");//打印日志 if (pFormatCtx->duration != AV_NOPTS_VALUE) { int hours, mins, secs, us; secs = pFormatCtx->duration / AV_TIME_BASE; us = pFormatCtx->duration % AV_TIME_BASE; mins = secs / 60; secs %= 60; hours = mins / 60; mins %= 60; av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs, (100 * us) / AV_TIME_BASE); } else { av_log(NULL, AV_LOG_INFO, "N/A"); }
原来通过AVFormatContext就可以得到duration……
2。老大提出的方法,首先我们能得到总的视频帧,其次能得到每帧的时间戳,那么只要读出最后一帧的时间戳即可得到flv视频的总时长了
最后我们采用了第一种方法。
快近1一个月了,从将ffmpeg移植到android系统,从读取视频到修改android的C层代码画到Java层SurfaceView对象中,然后读音频并处理声质,最后同步视音频数据,再其次处理视频控制信息,最后测试修改bug,很辛苦但也很有收获很充实。
转自:http://baimingjiang.blog.163.com/blog/static/168633206201082805933970/
int seconds = pFormatCtx->streams[videoStream]->duration*pFormatCtx->streams[videoStream]->time_base.num/pFormatCtx->streams[videoStream]->time_base.den;
其中变量及类型参考:
http://dranger.com/ffmpeg/tutorial01.html
此方法是找到AVFormatContext结构体中的第一个视频流AVStream结构中的duration来计算,问题就发生在在处理flv视频文件时读到的duration是个严重错误的值(0或着很大很大的正负值)。
这个问题,困扰了一天终于有解决方法了:
1。在测试tutorial01时,发现了dump_format(pFormatCtx, 0, argv[1], 0);这一行代码,这个方法在avformat.h头中,用此demo打开一个flv视频时居然可以打印出正确的duration,于是找到dump_format源码,如下处理:
av_log(NULL, AV_LOG_INFO, " Duration: ");//打印日志 if (pFormatCtx->duration != AV_NOPTS_VALUE) { int hours, mins, secs, us; secs = pFormatCtx->duration / AV_TIME_BASE; us = pFormatCtx->duration % AV_TIME_BASE; mins = secs / 60; secs %= 60; hours = mins / 60; mins %= 60; av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs, (100 * us) / AV_TIME_BASE); } else { av_log(NULL, AV_LOG_INFO, "N/A"); }
原来通过AVFormatContext就可以得到duration……
2。老大提出的方法,首先我们能得到总的视频帧,其次能得到每帧的时间戳,那么只要读出最后一帧的时间戳即可得到flv视频的总时长了
最后我们采用了第一种方法。
快近1一个月了,从将ffmpeg移植到android系统,从读取视频到修改android的C层代码画到Java层SurfaceView对象中,然后读音频并处理声质,最后同步视音频数据,再其次处理视频控制信息,最后测试修改bug,很辛苦但也很有收获很充实。
转自:http://baimingjiang.blog.163.com/blog/static/168633206201082805933970/
相关文章推荐
- 使用ffmpeg循环推流(循环读取视频文件)推送EasyDSS RTMP流媒体服务器的方法
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库
- codeigniter教程之上传视频并使用ffmpeg转flv示例
- 应用dranger教程使用ffmpeg库从视频中读取图片的示例程序
- 使用ffmpeg进行视频文件转换成FLV整理
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 安装和使用ffmpeg转换视频为flv文件
- “上传视频到服务器”之FLV视频转换利器ffmpeg.exe的简单使用
- 使用ffmpeg进行视频文件转换成FLV整理
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三).so文件编译过程问题的解决
- 使用ffmpeg循环推流(循环读取视频文件)方法以及局限
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 使用ffmpeg进行视频文件转换成FLV整理
- codeigniter教程之上传视频并使用ffmpeg转flv示例
- android 使用 ffmpeg 进行视频转码(二)
- PHP使用ffmpeg实现视频截图(Linux系统和windows系统)