使用FFmpeg录制iSight视频

13

如果您想在Linux上使用FFmpeg来录制网络摄像头视频,可以尝试以下命令...

ffmpeg -f video4linux2 -s 640x480 -i /dev/video0 out.avi
但在Mac上,这种方法不起作用,所以我想知道如何在Mac上使用ffmpeg录制isight?我进行了研究,很多人说这是不可能的,但是大多数帖子都非常古老,所以我想知道自那时以来是否有改变。
3个回答

20

更新:当前(2014年8月)版本的ffmpeg支持QTKit和AVKit框架:

ffmpeg -f qtkit -video_device_index 0 -i "" out.mpg
ffmpeg -f qtkit -i "default" out.mpg

你也可以获取可用设备列表:

ffmpeg -f qtkit -list_devices true -i ""

旧答案:

我用 QuickTime Broadcaster 解决了这个问题。它是一个小工具,可以捕捉视频和音频,压缩它,将压缩流封装在 RTP 数据包中,并将其传输到网络中。

因此,解决方法相当繁琐,需要双重编码,但它有效:

  1. 在 QuickTime Broadcaster 的“音频”和“视频”选项卡中设置流

  2. 转到“网络”选项卡,将“传输”设置为“手动单播”,将“地址”设置为“127.0.0.1”,将“端口”设置为“6000、6002”之类的内容

  3. 选择“文件 -> 将广播设置保存为...”并将其保存到某个文件中(例如 Untitled.qtbr)

  4. 导出 SDP 文件:选择“文件 -> 导出 -> SDP”。SDP 代表“会话描述协议”,其中包含有关在哪里找到流、其参数和编解码器选项等信息。

  5. 现在您可以从命令行启动/停止 QTB:

  6. osascript -e 'tell application "QuickTime Broadcaster" to start document "Untitled.qtbr"'
    
    osascript -e 'tell application "QuickTime Broadcaster" to stop document "Untitled.qtbr"'
    

启动QTB后,ffmpeg将能够使用您在第4步导出的sdp文件读取压缩流(实际上,您可以在VLC或QuickTime播放器中打开它:open -a vlc stream.sdp)。

因此,QTB作为“捕获代理”工作,使转换“iSight-to-UDP socket”成为可能。

ffmpeg -i stream.sdp -vcodec mjpeg -an -vf vflip -y /tmp/q.avi

或将其传输到ffserver:

ffmpeg -i stream.sdp http://localhost:1881/feed1.ffm

(imho) 给ffmpeg/libavdevice添加iSight支持是相当困难的。iSight具有基于ObjC的API(QTKit),必须将其包装在C静态库中,同时ffmpeg必须链接所有特定于OS X的框架-这是可行的,但需要相当多的工作。


直播的质量非常差,帧率很低。我在vlc上测试了stream.sdp:'open -a vlc stream.sdp',以及在ffserver上:'ffmpeg -i stream.sdp http://localhost:8090/feed1.ffm',两者都有可怕的质量。因此,QTB一定有问题。我将QTB中的设置调整为30 fps和1000 kbps,但没有任何改善。 - alex
我目前正在使用600x480。 - alex
屏幕大部分是灰色的,可能会有一两个像素不是。我确定我的iSight也正常工作,因为在Photobooth等应用程序中它可以正常使用。 - alex
顺便提一下,每次更改 QTB 设置后都应该保存(导出)SDP 文件。 - Vadim Kalinsky
非常感谢,现在似乎正常工作了!只是好奇低帧率是由于 iSight,还是 QTB 使帧率变慢? - alex
显示剩余5条评论

12

使用最新的ffmpeg,您可以记录iSight视频及麦克风音频到文件:

# List available AVFoundation input devices:
ffmpeg -f avfoundation -list_devices true -i ""

# Record video at 30 fps from device 0:
ffmpeg -r 30 -f avfoundation -i 0 out.mp4

# Record from video device 0 and audio device 0:
ffmpeg -r 30 -f avfoundation -i 0:0 out.mp4

截至目前为止,在录制视频的过程中,您仍可能会遇到AVFoundation同步问题


4
在Linux上,“ffmpeg”使用“video4linux2”捕获API,在Windows上有一个名为“video4windows”的版本。不幸的是,没有人为Mac制作过这个版本。

幸运的是,你仍然可以使用这个免费软件从命令行录制iSight相机的视频:

Wacaw - Mac OS X 的网络摄像头工具


这里是使用方法的示例。

  • 步骤1)查看已安装的视频硬件

wacaw -L

  • 步骤2)将您的视频捕获到文件中。在我的MacBook上,它会报告我的内部iSight相机为ID为“2”的USB设备,输入为ID为“0”。以下是我的MacBook的外观。 “video-device”可能因计算机而异,您也可以省略“--video-input 0”部分:

wacaw --video --video-device 2 --video-input 0 --duration 3 --VGA ~/MyMovie


希望这可以帮到你!

我能否使用wacaw将我的iSight实时流式传输到ffserver,就像video4linux2一样? - alex
或者一般的直播流。 - alex
如果您需要进行直播,您将需要使用其他工具。我没有使用过chazlever的“creepycam”,但根据您的需求它可能有效。它位于这里:http://github.com/chazlever/creepycam 它需要安装“imagesnap”(因此也需要“HomeBrew”)。我认为“creepycam”不会接近24fps,因为它通过反复调用“imagesnap”来获取单个图像。 - original_username
还有苹果自己的QTSS,不过我相信那是一个付费的选择。VLC应用程序具有基于GUI的流媒体功能(请参见:http://autonome.wordpress.com/2009/05/31/streaming-your-isight-camera-to-the-web-with-the-video-tag/),但如果您选择这条路线,您可能可以使用Web技术拼凑出一些东西,因为Flash也提供视频捕获功能。 - original_username
1
以 ffmpeg 进行实时流媒体直播的示例:ffmpeg -f avfoundation -i "0" -s 320x240 -f flv -r 30.0 "<rtmp-url>" - Christof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接