ffmpeg 故意丢帧以降低文件大小

标签 ffmpeg h.264 filesize frame-rate

我们的安全系统使用 ffmpeg -use_wallclock_as_timestamps 1 -i rtsp://192.168.x.x:554/mpeg4 -c copy -t 60 my_input_video.avi 记录和存档我们的 IP 摄像机流

我每分钟使用 crontab 运行它,因此它每分钟为每个摄像头创建 60 秒 (~15Mb) 的视频。当入侵发生时,摄像头通过 FTP 发送一张图片和一个由 incrontab 调用的脚本:

1-立即通过电子邮件转发图片

2- 选择涵盖入侵发生那一刻的视频,用 h264 压缩(到 ~2,6Mb)并通过电子邮件发送

它工作得非常好,但如果小偷穿过各种摄像头的路径,与 SMTP 服务器的连接速度不够快,因此视频电子邮件会延迟。我想进一步压缩视频以避免这种情况。我可以降低分辨率(例如 640x480 到 320x240),但有时 640x480 可以方便地放大看起来正在移动的东西......

所以我的想法是在视频中丢帧以降低文件大小。我不在乎小偷是否像视频中的“定格乐高”一样走路,最重要的是我知道有人可以表演。
mediainfo my_input_video.avi说帧速率= 600.000 fps,但这当然是错误的。 IP摄像头发送的FPS总是假的,因为它随网络质量而变化;这就是为什么我在命令中使用“-use_wallclock_as_timestamps 1”来记录流。

ffmpeg -i my_input_video.avi -vcodec h264 -preset ultrafast -crf 28 -acodec mp3 -q:a 5 -r 8 output.avi视频还可以,但文件大小更高(3Mb)

ffmpeg -i my_input_video.avi -vcodec h264 -preset ultrafast -crf 28 -acodec mp3 -q:a 5 -r 2 output.avi文件大小较低(2,2Mb),但视频不起作用(在第一帧被阻止)。

在过程中间创建一个 mjpeg 视频(mjpeg = 非隔行扫描帧)(首先导出到具有较少帧的 mjpeg,然后导出到 h264)会产生相同的结果。

你知道我怎样才能让我的小偷像“定格乐高”一样走路以将文件大小降至最低吗?

谢谢你的帮助

最佳答案

您的限制文件大小是多少? 2.6MB 60 秒的视频对我来说似乎很合理,大约 350kbps,这对于视频质量来说相当低。

您需要指定视频码率-b:v 125000 (125kbps,应该让你降到大约 900kb)来控制你希望视频编码的比特率。您没有为 FFMpeg 提供足够的提示来说明您希望如何处理视频,因此它会选择您不喜欢的任意值。当您降低帧速率时,它只是用尽了为每个帧分配更多位的缓冲区。 (您需要记住的一件大事是,当您将视频拉伸(stretch)到更长的时间段时,场景发生显着变化的可能性越大,需要 I 帧(完整编码帧与基于前一帧的帧),因此减少帧速率会有所帮助,但可能没有您想象的那么大帮助)。

您的“(它在第一帧被阻止)。”很可能是您尝试在流不在 I 帧时开始解码流的问题,而不是您的设置问题。

关于ffmpeg 故意丢帧以降低文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26449063/

相关文章:

c++ - 使用 C++ 文件流 (fstream),如何确定文件的大小?

PHP 和 FFmpeg : works on terminal but ffmpeg error when in shell_exec

video - H264 AVC 编解码器中的各种配置文件和设置

ffmpeg - D3D11 损坏 : CopySubresourceRegion:Sixth parameter is corrupt or NULL?

java - 在java中减少JPG文件的文件大小

ada - 如何在 Ada 中读取大文件?

ffmpeg - 为 v4l2 实现循环缓冲区

ffmpeg - FFMPEG编译后需要的文件(CentOS)

FFmpeg:从 mp4 读取配置文件级别信息

video - 我可以使用 ffmpeg 或 ffprobe 获取 h.264 每帧的引用列表吗?