代码之家  ›  专栏  ›  技术社区  ›  Marc-André Lafortune

如何加入网络摄像机FLV

  •  7
  • Marc-André Lafortune  · 技术社区  · 16 年前

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

    这应该很容易,对吧?甚至还有一个完整的代码示例 ffmpeg FAQ .

    好吧,管道似乎给我带来了问题(在我的Mac运行的Leopard和Ubuntu8.04上),所以让我们保持简单并使用普通文件。另外,如果我没有指定15 fps的速率,视觉部分将播放 extremely fast . 因此,示例脚本变为:

    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)为什么我必须指定一个帧速率,而懦弱的玩家可以以正确的速度播放flv?

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

    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不起作用(例如 this one this one )有没有办法也为这些飞行物做这个?

    任何帮助都将不胜感激。

    4 回复  |  直到 9 年前
        1
  •  4
  •   Marc-André Lafortune    15 年前

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

    是的。

    六个月后还有三颗宝石 here's the released product .

    我还是会在这方面做些工作,但它是有效的。

        2
  •  0
  •   Dark Shikari    16 年前

    这里会遇到一个非常微妙的问题,因为大多数视频和音频格式(特别是在普通容器中)都使用“全局头”,这意味着在文件的开头,它们只有一个头,用于指定整个文件的压缩信息(如宽度、高度等)。结论两个流显然会失败,因为它现在有两个头而不是一个,muxer可能不喜欢这样。在您的例子中,转换为avi可能解决了这个问题,因为mencoder有代码concat avis——该代码正确地处理了头问题。

        3
  •  0
  •   Eric Leschinski Mohammad Areeb Siddiqui    9 年前

    在mencoder的邮件列表上发布我的问题,尝试其他事情后,我求助于编写自己的工具!我从 flvtool 在对代码进行了一些挖掘并编写了大约40行代码之后,它就工作了,没有质量损失(因为没有转码)。

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

        4
  •  -2
  •   paranoio    16 年前

    不知道这是否有效,但尝试使用以下命令:

    cat yourVideos/*.flv >> big.flv
    

    这可能会损坏元信息,因此在执行该命令后,使用“flvtool”(Ruby脚本,您可以在Google中找到)来修复它。