使用ffmpeg通过编解码器压缩后从网络摄像头获取所有字节流?

Posted

技术标签:

【中文标题】使用ffmpeg通过编解码器压缩后从网络摄像头获取所有字节流?【英文标题】:Get all bytes of stream from webcam after being compressed by codec with ffmpeg? 【发布时间】:2014-08-14 02:05:57 【问题描述】:

我需要从网络摄像头捕获视频流的每个字节 - 在使用 commandline-ffmpeg 使用编解码器对其进行压缩之后。

那么,您能否介绍一下 ffmpeg 命令行的外观以及将输出流导入我由 VB6 或 VB.net 编写的程序的策略? (我需要处理每一个字节!)非常感谢任何建议。


更新:我想知道是否可以将输出保存为硬盘上的“avi”文件,同时使用我的程序读取保存文件的内容。我可以在保存(附加)文件时播放我检索的“avi 文件的一部分”吗?除了“avi”之外,还有什么更好的文件格式可以同时读写(录音和播放)?

或者任何更好/更快的解决方案?

【问题讨论】:

不完全确定,但您需要使用 DirectShow 过滤器。这是捕获音频的方法:ffmpeg -nostats -f dshow -i audio="S/PDIF (M-Audio Delta AP 192)" -acodec mp3 -f mp3 -ab 谢谢!我看到有些人将输出用作 url(例如“192.168.1.123:8090”),但我想将流输入到我的程序中,你知道怎么做吗? 使用 STDIO。最后一个参数应该是- @Brad :你能解释一下STDIO和最后一个参数“-”吗?我刚刚将最后一个参数尝试为“-”,但出现错误“[NULL @ 03714500] 无法为 'pipe:' pipe:: Invalid argument”找到合适的输出格式” 使用我最初发布的命令。您没有指定任何格式,为什么将stdio 放在那里? ffmpeg -f dshow -i video="Lenovo EasyCamera" -f mp4 - 什么的。您至少需要指定输出格式,最好也将输出编解码器设置为您的规范。此外,您不想在命令提示符下运行它,否则原始数据将被转储到您的控制台。如果这样做,至少使用> someFile 输出到文件。 【参考方案1】:

请浏览页面https://trac.ffmpeg.org/wiki/Capture/Webcam 那里清楚地提到了如何使用 ffmpeg 捕获网络摄像头视频。 是的,您可以将 avi 流保存到磁盘并同时从中读取,我相信这在 linux 中是可能的,因为没有文件锁定。 或者您可以写入管道并逐帧从管道中读取它。 用于捕获视频并将其写入管道的 Linux 示例。 从 /dev/video0 读取

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 -f rawvideo -pix_fmt yuv420p pipe1。

你应该首先创建 pipe1 来运行这个命令,现在你可以从这个管道中读取。 Piple 是 linux 中的 FIFO 数据结构,它将在读取数据时刷新。所以这将满足您的要求。

【讨论】:

我已经在 Windows 中解决了这个问题,但您的回答肯定对许多其他 linux 用户有用。 @vantrung-cuncon 也可以为 Windows 用户提供答案(Satyam 提供的链接也有 Windows 示例)。

以上是关于使用ffmpeg通过编解码器压缩后从网络摄像头获取所有字节流?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 流使用 H264 (mp4) 编解码器捕获 CAM

海康威视 NVR 视频转换 ffmpeg

ffmpeg基本知识

ffmpeg如何从url获取视频帧数据

使用FFmpeg进行音视频编解码

在OpenCV中使用H.264压缩编写视频文件