如何使用ffmpeg录制视频和音频帧

3
如何使用FFMPEG从网络摄像头记录视频和音频,并将其连续分割为每40毫秒一个文件,持续时间达10秒?谢谢。

请尝试参考以下内容:https://dev59.com/lm015IYBdhLWcg3w7wMW - Education 4Fun
谢谢回复,每40毫秒连续录制多达10秒怎么样? - VijayR
1个回答

3

步骤1:网络摄像头捕捉

如评论中已经提到的,按照以下说明进行音频捕捉:如何使用ffmpeg从linux USB捕获设备同时捕获音频和视频
我们从这里开始:

./ffmpeg -f alsa -i hw:0 -f video4linux2 -i /dev/video0

更多细节在FFmpeg文档中有解释。

步骤2:分割

./ffmpeg -f alsa -i hw:0 -f video4linux2 -i /dev/video0 -t 0:10 -segment_time 00:00.040 -f segment out_%003d.mp4
  • -t 0:10 只录制10秒
  • -segment_time 00:00.040 每40毫秒分割一次
  • -f segment 使用分段格式
  • out_%03d.mp4 输出文件名模板(%03d 用于更好的格式化;001、002、003等)

这里是FFmpeg分段文档的链接


感谢您的详细解释。除了上述命令,我还需要添加什么来生成相应的aac音频文件,例如out_%3d.aac?如果我想要将视频格式转换为h264格式,我应该添加libx264还是只需命名为out_%3d.h264? - VijayR
FFmpeg会根据文件扩展名自动检测编解码器(因此.h264和.aac应该可以工作)。您还可以明确告诉FFmpeg使用特定的编解码器:“-c:v libx264”或“-c:a aac”。 - martinr92
似乎视频分段需要一个关键帧,因此您可以添加“-f 25 -g 1”来将视频编码为25 FPS(因为1000毫秒/40毫秒=25帧),并告诉FFmpeg使用每个帧作为关键帧(“-g 1”)。或者,您可以使用参数“-break_non_keyframes 1”告诉FFmpeg忽略此规则,或者尝试使用参数“-write_empty_segments 1”在没有从网络摄像头接收到数据的情况下也写入文件。执行期间的日志告诉我,在我的静态文件上进行了并行处理(检查“Opening 'xxx' for writing”)。 - martinr92
谢谢@martinr92。现在我能够并行生成音频和视频文件,但是当我在输出文件上使用ffplay时,它会为所有文件抛出以下不同的错误。音频错误检测到格式mpegts仅具有2分的低得分,可能发生误检测!无法检测到TS数据包大小,默认为非FEC / DVHS``sample-005.aac:找不到编解码器参数 检测到格式aac仅具有1分的低得分,可能发生误检测!从比特率估计持续时间,这可能不准确和视频错误frame-006.h264:处理输入= 0/0时发现无效数据。请帮助我。 - VijayR
似乎ffplay缺少音频/视频的元数据。因此,您需要一个存储元数据和音频/视频数据(如MP4)的容器。如果您将编解码器配置保留不变,只需将文件扩展名设置为.mp4而不是.h264.aac,则播放器也应该有元数据。 - martinr92
显示剩余6条评论

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