当前位置: 首页 > 开源项目, 我的研究, 流媒体学习 > 正文

记一次FFMPEG转avi视频保存到ftp服务器的失败尝试

项目中有一需求,将存储在硬盘上的h264码流转成Avi文件,并上传到FTP服务器。首先想到是用ffmpeg将h264转换成avi格式的文件,保存到本地磁盘,一切正常,很快完成了。

正当以为结束时,突然发现,需求方是要求保存到FTP服务器的,我一想,要将将转换好的视频放到内存中,再使用FTP客户端接口上传到服务器,这样做有点麻烦。于是上官网找了一下资料,发现FFMPEG支持FTP、HTTP、UDP、TCP、RTSP等等众多协议。于是重新配置支持FTP重新编译,很快又完成了。一开始遇到一个很奇怪的错误,后来才意识到是FTP目录路径不存在导致,看了源代码,FFMPEG的FTP模块使用PWD在判断当前目录是否存在,但不会创建目录的。于是自己手动创建,可以看到服务器上有文件了。用vlc播放器播放,正常,但用kmplayer播放不了。用UE打开看二进制,发现头部表示AVI文件大小的字段全为FF,文件最后没有idx1索引信息,怪不得kmplayer播不了。——这些判断,是基于好多年前研究AVI格式的经验,根据目测就能知道了。

于是跟踪代码,发现FFMPEG写尾部数据函数中并没有写idx1,再看原来有个seekable标志,为1时表示可以进行seek操作,而FTP模块又支持并赋值,看不出问题。后来几经打印跟踪,发现FTP默认是不使能seek的,而这,在官网的说明中很清楚了。又一次因看文档不详细而耗时。

后来找如果通过AVOptions来赋值,但发现不行,因为FTPContext是私有的,不对外公开。于是放弃,在FFMPEG源代码中直接将seekable置为1,这回可以seek了,但一看服务器上的文件,只有区区6KB,注释掉写尾部数据函数又变回原来的样子。上overstack看人家遇到的问题,有人回复说有的FTP不支持seek,一旦用了,文件会截断的。从代码分析得知,第一个有seek操作的是查找movi字段,刚好是头部数据,6KB,和测试的结果一样。后来想过往这个方向上继续走,但因为不同的FTP特性不同,万一有的服务器不支持,岂不是白搞?于是就放弃了。

这个问题,纠结了一周多了。这次应该要趁机学习学习FFMPEG一点东西了。

6月初的PS:
1、目录不存在,跟踪函数出现,会有如下提示:

avformat_write_header failed: Input/output error[-5]

出错在ftp_current_dir函数,因为没有创建目录,没有路径,所以提示IO错误。

2、打印错误时使用av_err2str,发现编译不通过,后来自己封装一下函数,如下:

static char err_buf[128] = {0}; static char* av_get_err(int errnum) { av_strerror(errnum, err_buf, 128); return err_buf; }

3、编译ffmpeg使其支持多种协议,配置如下:

--enable-protocol=file,http,tcp,udp,ftp,rtp,pipe

更多详细,可以./configure --help来查看。

李迟,2015.5.26,与高中同学夜宵回来写的

本文固定链接: http://www.latelee.org/open-project/failed-to-save-avi-to-ftp-server-using-ffmpeg.html

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter