# 录像下载无法拖放问题总结
问题就是下载下来的录像用本地的win10自带的播放器可以播放但是不能拖放,只有用VLC工具可以播放。
## 解决思路:
### 1、首先跟踪调试下载录像代码流程:
av_register_all注册所有的文件格式和编解码库;
avformat_network_init初始化全局网络库;
avformat_open_input打开输入流,读取流头部信息;
avformat_find_stream_info获取流信息,获取编解码器参数;
avformat_alloc_output_context2初始化输出封装格式;
avformat_find_stream_info获取必要的编解码器参数信息;
avformat_new_stream创建新的输出流;
avcodec_parameters_copy拷贝输入流的编解码器参数到输出流;
avformat_write_header写输出流头部信息即输出格式信息;
av_read_frame读取流数据并构建时间戳;
av_interleaved_write_frame写数据到媒体文件;
av_write_trailer写流的尾部数据到媒体文件;
剩下的释放资源空间。
根据以上流程没有发现异常。
### 2、问题翻来覆去的复现
在设备上下载下来录像文件用vlc和本地播放器反复播放,拖动实验,最终都没有头绪;只看找度娘查一查。
### 3、如何解决
首先,先搞清楚我们的设备上下载下来的格式fmp4格式,不是普通的mp4格式,二者是有区别的:
fMP4(fragmented MP4),可以简单理解为分片化的MP4,是DASH采用的媒体文件格式,文件扩展名通常为(.m4s或直接用.mp4)。
使用mp4info工具可以查看对应的文件内容对比。
fmp4是apple公司发布的视频格式。
将mp4格式转换为flv格式是可以正常播放的;
FMP4文件就是由各式各样的Box组成的,先简单介绍几个重要的box,以便诸位在后续学习时心中有数:
1、 ftyp box,在文件的开始位置,描述的文件的版本、兼容协议等;
2、 moov box,这个box中不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息,moov box下有mvhd和trak box。
>>mvhd中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息。
>>trak中的一系列子box描述了每个媒体轨道的具体信息。
3、 moof box,这个box是视频分片的描述信息。并不是MP4文件必须的部分,但在我们常见的可在线播放的MP4格式文件中(例如Silverlight Smooth Streaming中的ismv文件)确是重中之重。
4、 mdat box,实际媒体数据。我们最终解码播放的数据都在这里面。
5、 mfra box,一般在文件末尾,媒体的索引文件,可通过查询直接定位所需时间点的媒体数据。
### 结论
根据mp4info工具读取的结果可以对照,我们的视频数据是正常的,没有异常。
所以只能说是格式兼容性问题,也就是说fmp4格式视频在apple设备上是可以播放的,在win10上面的播放器除了vlc以外,其他播放器某些可以播放但不能拖动,迅雷等播放器直接不能播放。
为了验证结论的真实性,用ffmpeg命令行将h264格式视频转换为mp4格式尝试看是能播放:
ffmpeg -i d:\test.264 -g 52 -vcodec copy -f mp4 -movflags frag_keyframe+empty_moov d:\output.mp4
最终是转换之后也是vlc可以播放,本地自带win10播放器可以播放但是不能拖放,迅雷不能播。