FFmpeg 之FFM
FFmpeg 之 FFM
FFmpeg 提供了ffm muxer和demuxer, 从ffmpeg和fferver的code看, ffm是作为缓冲来使用的,即起到漏斗的作用。
ffm muxer 和 demuxer的实现是不完整的, 从 ffserver.c 可以看出来, 在使用过程中需要更新write_index, 真是一个蛋疼的实现。
注意: ffm的IO文件要位于ramfs之上, 比如tmpfs,不能是真实的磁盘文件系统。
实际使用过程中就碰到RTP出去的数据无法正常解码。
stream 流: v4l2(h264) -> ffm(muxer) ffm(demuxer) ->rtp(muxer)
通过VLC观看, 第一帧可以正常显示出来, 后续RTP一直有数据发送, 但VLC没能解出video。
通过tcpdump查看UDP数据包, 看不出异常。
trace了一下ffm write (av_write_frame) 的时间,发现每帧耗时在100~300ms之间, 这个时间太长了(fps为30).
因为ffm的write 是同步做的,所以肯定会导致V4L2丢帧; 对H264来说,丢帧就会导致很长一段时间不能正常解码。
当前ffm的IO文件位于 /tmp/h264.ffm, 对于tmpfs来说,写的速度应该非常快才对。
使用df命令查看了当前OS的文件系统挂载情况:
/dev/sda1 33032012 8790252 22563784 29% / udev 922740 4 922736 1% /dev tmpfs 186308 1948 184360 2% /run none 5120 0 5120 0% /run/lock none 931536 152 931384 1% /run/shm
问题找到了。tmpfs 挂载于 /run, 而不是/tmp.
修改ffm的IO文件位置, OK, 问题解决。
后记: 发现在系统memory资源紧张的情况下, tmpfs会被交换到swap 分区, 所以tmpfs不是太安全,应该使用ramfs
评论