如何join摄像头的FLV

我希望我的网站join一些在FLV文件中的摄像头录制(如这个)。 这需要在没有用户input的情况下在Linux上完成。 我该怎么做呢? 为了简单起见,我将使用与两个input相同的flv,以便获得连续两次播放相同内容的flv。

这应该很容易,对吗? 在ffmpeg FAQ中甚至有一个完整的代码示例。

那么,pipe道似乎给我的问题(在我的Mac上运行Leopard和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 

那么,使用这将适用于audio,但我只有第一次看到video。 这似乎是我投入input.flv的任何flv的情况,包括red5附带的电影玩笑。

a)为什么示例脚本不能像广告一样工作,特别是为什么我不能获得所有我期待的video?

b)为什么我必须指定一个帧率,而懦弱的玩家能够以正确的速度玩flv?

我发现join两辆车的唯一方法是使用mencoder。 问题是,mencoder似乎没有joinflvs:

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

我得到一个浮点exception…

 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是否有正确解码和编码的方法?

所以到目前为止,我发现joinflvs的唯一方法是使用ffmpeg在flv和avi之间来回切换,并使用mencoderjoinavis:

 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)由于framerate的问题,虽然,只有具有不断帧率的flvs(就像我通过facebooklogging的)会被正确地转换成avis,但是这对于我似乎正在logging的flvs来说是不行的(就像这样一个或这个 )。 有没有办法做到这一点,这些车呢?

任何帮助将非常感激。

我认为这将是一个很好的学习练习,重写它在Ruby中。

它是。

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

我仍然会努力工作,但它的工作原理。

你会遇到一个非常微妙的问题,因为大多数视频和音频格式(特别是在普通容器中)使用“全局标题”,这意味着在文件开始时它们具有指定压缩信息的单个标题(如宽度,高度等)为整个文件。 扼杀两个流显然会失败,因为它现在将有两个头,而不是一个和复用器可能不会这样。 转换为AVI可能是解决你的情况下的问题,因为mencoder有代码来连接AVI – 代码正确处理头问题。

在mencoder的邮件列表上发布我的问题后,尝试其他的东西,我诉诸写我自己的工具! 我从flvtool开始,经过一些挖掘代码并写了大约40行代码,它的工作原理没有质量损失(因为没有转码)。

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

不知道这是否会实际工作,但尝试使用此命令:

 cat yourVideos/*.flv >> big.flv 

这可能会损害元信息,所以执行该命令后,使用“flvtool”(红宝石脚本,你可以找到它与谷歌)来解决它。