C 在linux中从一个图像更新创建电影
我是linux上的C程序员 我编写了一个程序,将图像保存在/srv/ftp/preview.png中,该文件正在频繁更新,我想从更新中创建一部电影 它的时间戳对我很重要,例如,如果图像在3.654秒后更新,我希望电影在3.654秒后也显示此更新(帧) 我在网上搜索了几个小时,但找不到任何解决办法 我知道ffmpeg,但它会将图像(而不是一个图像)转换为无毫秒时间戳的电影 我发现了这个,但在这种情况下它似乎没有用处C 在linux中从一个图像更新创建电影,c,linux,video,ffmpeg,timestamp,C,Linux,Video,Ffmpeg,Timestamp,我是linux上的C程序员 我编写了一个程序,将图像保存在/srv/ftp/preview.png中,该文件正在频繁更新,我想从更新中创建一部电影 它的时间戳对我很重要,例如,如果图像在3.654秒后更新,我希望电影在3.654秒后也显示此更新(帧) 我在网上搜索了几个小时,但找不到任何解决办法 我知道ffmpeg,但它会将图像(而不是一个图像)转换为无毫秒时间戳的电影 我发现了这个,但在这种情况下它似乎没有用处 有什么工具可以做到这一点吗?如果没有,请在c中引入API以自己编写程序您可以尝试使
有什么工具可以做到这一点吗?如果没有,请在c中引入API以自己编写程序您可以尝试使用
inotify
观看对文件的修改,并ffmpeg
将文件附加到电影中:
#!/bin/bash
FRAMERATE=1
FILE="/path/to/image.jgp"
while true
do inotifywait -e modify "$FILE"
echo "file changed"
# create temp file name
TMP=$(mktemp)
# copy file
cp "$FILE" "$TMP$
# append copy file to movie
# from https://video.stackexchange.com/q/17228
# if movie already exist
if [ -f movie.mp4 ]
then
# append image to a new movie
ffmpeg -y -i movie.avi -loop 1 -f image2 -t $FRAMERATE -i "$TMP".jpg -f lavfi -t 3 -i anullsrc -filter_complex "[0:v] [1:v] concat=n=2:v=1 [v] " -map "[v]" newmovie.avi
# replace old by new movie
mv newmovie.mp4 movie.mp4
else
#create a movie from one image
ffmpeg -framerate 1 -t $FRAMERATE -i "$TMP" movie.mp4
fi
rm "$TMP"
done
这个脚本一定要被改编(特别是当你的帧率很高的时候),但我认为你可以尝试使用它
还有一件坏事,那就是电影制作会越来越慢,因为电影变得越来越大
您应该将特定时间段的图像存储在一个目录中,并一次转换所有图像(如一小时/天一次)
如果你想提供一个流而不是创建一个视频文件,你可以看看我希望这不是一个愚蠢的建议(我不太喜欢Linux编程),但是你能在收到图像后立即将其直接复制到帧缓冲区吗?@gulume Petitjean一点也不,任何建议都是有用的。我可以立即将图像复制到缓冲区,但我该怎么做?如何将这些缓冲区转换为视频?如果直接写入帧缓冲区,基本上就是创建视频。但是,我不确定它是否是Linux下的最佳解决方案。此外,可能存在反序列化问题或类似的视频特定问题。但基本上,当你解码一个压缩格式的视频(如H264)时,你会重新生成一组图片,并以正确的速率写入帧缓冲区。我想我无法通过直接将图像复制到缓冲区来创建视频,因为我在某个地方读到帧缓冲区有额外的头,需要编解码器来压缩和编码它们。顺便说一下,谢谢你的关注。我试试看。