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

来源:互联网 发布:mac版 帝国时代2hd 编辑:程序博客网 时间:2024/05/17 01:04

项目中有一需求,将存储在硬盘上的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一点东西了。


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

0 0