如何加入网路摄影机FLV

时间:2020-03-05 18:54:44  来源:igfitidea点击:

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

那应该很容易,对吧? ffmpeg常见问题解答中甚至有完整的代码示例。

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

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:

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

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

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正确解码和编码flv?

因此,到目前为止,我发现加入flv的唯一方法是使用ffmpeg在flv和avi之间来回移动,并使用mencoder来加入avis:

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执行此操作?

任何帮助将不胜感激。

解决方案

回答

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

回答

不知道这是否会真正起作用,但是请尝试使用以下命令:

cat yourVideos/*.flv >> big.flv

这可能会损坏元信息,因此在执行该命令后,请使用" flvtool"(红宝石脚本,可以在Google上找到它)对其进行修复。

回答

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

我将尽快发布它,与此同时任何有兴趣的人都可以与我联系。

回答

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

它是。

六个月后,三个宝石之后,这是发布的产品。

我仍然会对此进行一些工作,但是它可以工作。