Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在linux中从一个图像更新创建电影_C_Linux_Video_Ffmpeg_Timestamp - Fatal编程技术网

C 在linux中从一个图像更新创建电影

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以自己编写程序您可以尝试使

我是linux上的C程序员

我编写了一个程序,将图像保存在/srv/ftp/preview.png中,该文件正在频繁更新,我想从更新中创建一部电影

它的时间戳对我很重要,例如,如果图像在3.654秒后更新,我希望电影在3.654秒后也显示此更新(帧)

我在网上搜索了几个小时,但找不到任何解决办法

我知道ffmpeg,但它会将图像(而不是一个图像)转换为无毫秒时间戳的电影

我发现了这个,但在这种情况下它似乎没有用处


有什么工具可以做到这一点吗?如果没有,请在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)时,你会重新生成一组图片,并以正确的速率写入帧缓冲区。我想我无法通过直接将图像复制到缓冲区来创建视频,因为我在某个地方读到帧缓冲区有额外的头,需要编解码器来压缩和编码它们。顺便说一下,谢谢你的关注。我试试看。