首页 / 知识

关于 linux:如何加入网络摄像头 FLV

2023-04-15 15:36:00

关于 linux:如何加入网络摄像头 FLV

How to join webcam FLVs

我希望我的网站加入一些 FLV 文件中的网络摄像头记录(比如这个)。这需要在 Linux 上完成,无需用户输入。我该怎么做呢?为简单起见,我将使用相同的 flv 作为两个输入,希望得到一个连续两次播放相同内容的 flv。

这应该很容易吧? ffmpeg FAQ 中甚至还有完整的代码示例。

好吧,管道似乎给我带来了问题(在我运行 Leopard 的 mac 和 Ubuntu 8.04 上),所以让我们保持简单并使用普通文件。此外,如果我不指定 15 fps 的速率,视觉部分会播放得非常快。示例脚本因此变为:

1
2
3
4
5
6
7
ffmpeg -i input.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 \\
  -  temp.a  /dev/null
ffmpeg -i input.flv -an -f yuv4mpegpipe -  temp.v  /dev/null
cat temp.v temp.v  all.v
cat temp.a temp.a  all.a
ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \\
  -f yuv4mpegpipe -i all.v -sameq -y output.flv

好吧,使用它可以处理音频,但我只能在第一次获得视频。这似乎是我作为 input.flv 抛出的任何 flv 的情况,包括 red5 附带的电影预告片。

a) 为什么示例脚本没有像宣传的那样工作,特别是为什么我没有得到我期待的所有视频?

b) 为什么我必须指定帧率,而 Wimpy 播放器才能以正确的速度播放 flv?

我发现加入两个 flv 的唯一方法是使用 mencoder。问题是,mencoder 似乎没有加入 flvs:

1
2
mencoder input.flv input.flv -o output.flv -of lavf -oac copy \\
-ovc lavc -lavcopts vcodec=flv

我得到一个浮点异常...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
MEncoder 1.0rc2-4.0.1 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Xeon(R) CPU 5150 @ 2.66GHz (Family: 6, Model: 15, Stepping: 6)
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled for x86 CPU with extensions: MMX MMX2 SSE SSE2

success: format: 0 data: 0x0 - 0x45b2f
libavformat file format detected.
[flv @ 0x697160]Unsupported audio codec (6)
[flv @ 0x697160]Could not find codec parameters (Audio: 0x0006, 22050 Hz, mono)
[lavf] Video stream found, -vid 0
[lavf] Audio stream found, -aid 1
VIDEO: [FLV1] 240x180 0bpp 1000.000 fps 0.0 kbps ( 0.0 kbyte/s)
[V] filefmt:44 fourcc:0x31564C46 size:240x180 fps:1000.00 ftime:=0.0010
** MUXER_LAVF *****************************************************************
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate
INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffflv] vfm: ffmpeg (FFmpeg Flash video)
==========================================================================
audiocodec: framecopy (format=6 chans=1 rate=22050 bits=16 B/s=0 sample-0)
VDec: vo config request - 240 x 180 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is undefined - no prescaling applied.
videocodec: libavcodec (240x180 fourcc=31564c46 [FLV1])
VIDEO CODEC ID: 22
AUDIO CODEC ID: 10007, TAG: 0
Writing header...
[NULL @ 0x67d110]codec not compatible with flv
Floating point exception

c) mencoder 有没有办法正确解码和编码 flvs?

所以目前我发现加入flvs的唯一方法是使用ffmpeg在flv和avi之间来回切换,使用mencoder加入avis:

1
2
3
ffmpeg -i input.flv -vcodec rawvideo -acodec pcm_s16le -r 15 file.avi
mencoder -o output.avi -oac copy -ovc copy -noskip file.avi file.avi
ffmpeg -i output.avi output.flv

d) 必须有更好的方法来实现这一点……哪一个?

e) 但是,由于帧率的问题,只有具有恒定帧率的flv(就像我通过facebook记录的那样)才能正确转换为avis,但这不适用于我似乎是的flv录音(比如这个或这个)。有没有办法对这些 flv 进行此操作?

任何帮助将不胜感激。


我认为用 Ruby 重写它会是一个很好的学习练习。

原来如此。

六个月后,三颗ruby后,这是发布的产品。

我会继续努力,但它确实有效。


在将我的问题发布到 mencoder 的邮件列表后,尝试了其他方法,我求助于编写自己的工具!我从 flvtool 开始,在深入挖掘代码并编写了大约 40 行代码之后,它可以正常工作,并且质量没有损失(因为没有转码)。

我会尽快发布,有兴趣的可以联系我。


您会在这里遇到一个非常微妙的问题,因为大多数视频和音频格式(尤其是在普通容器中)都使用"全局标题",这意味着在文件的开头它们有一个指定压缩信息的标题(如宽度、高度等)为整个文件。连接两个流显然会失败,因为它现在将有两个标头而不是一个,并且复用器可能不喜欢这样。转换为 AVI 可能正在解决您的问题,因为 mencoder 具有连接 AVI 的代码——该代码正确处理标题问题。


不知道这是否真的有效,但尝试使用这个命令:

1
cat yourVideos/*.flv  big.flv

这可能会损坏元信息,因此在执行该命令后使用"flvtool"(您可以通过 google 找到它的 ruby?? 脚本)来修复它。


网络输入用户网站

最新内容

相关内容

猜你喜欢