ffmpeg를 사용하여 웹캠에서 네트워크로 비디오를 스트리밍하는 방법은 무엇입니까?

ffmpeg를 사용하여 웹캠에서 네트워크로 비디오를 스트리밍하는 방법은 무엇입니까?

Logitech C920 웹캠에서 h264 비디오를 스트리밍하려고 합니다. 나는 다음과 같이 ffserver.conf를 사용하고 있습니다.

Port 8099

NoDaemon

BindAddress 0.0.0.0


RTSPPort 5004
RTSPBindAddress 0.0.0.0

MaxClients 10

MaxBandwidth 10000

CustomLog -


<Feed feed1.ffm>
        File /tmp/feed1.ffm
        FileMaxSize 20M
</Feed>

<Stream viewport1>
        Feed feed1.ffm
        Format rtp
        VideoCodec libx264
        VideoFrameRate 15
        VideoBufferSize 40
        VideoBitRate 3000
        VideoQMin 1
        VideoQMax 31
        VideoSize 640x480
        PreRoll 0
        NoAudio
        Strict -1
</Stream>

<Stream stat.html>
        Format status
</Stream>

<Redirect index.html>
        URL http://ffmpeg.sourceforge.net/
</Redirect>

나는 다음과 같이 ffmpeg를 시작합니다 :

./ffmpeg -f video4linux2 -s 640x480 -r 15 -re -i /dev/video0 -an -vcodec libx264  -bf 5  http://localhost:8099/feed1.ffm

그러나 출력에는 다음이 있습니다.

[video4linux2,v4l2 @ 0xc0b5e0] Estimating duration from bitrate, this may be inaccurate
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 2930.711051, bitrate: 73728 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 73728 kb/s, 15 tbr, 1000k tbn, 15 tbc
[libx264 @ 0xc183f0] using cpu capabilities: ARMv6 NEON
[libx264 @ 0xc183f0] VBV buffer size cannot be smaller than one frame, using 400 kbit
[libx264 @ 0xc183f0] profile High 4:2:2, level 2.2, 4:2:2 8-bit
[libx264 @ 0xc183f0] 264 - core 120 r2151 a3f4407 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=0 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=5 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=1 weightp=2 keyint=50 keyint_min=5 scenecut=0 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=3000 ratetol=1.0 qcomp=0.50 qpmin=10 qpmax=51 qpstep=4 vbv_maxrate=6000 vbv_bufsize=400 nal_hrd=none ip_ratio=1.40 aq=1:1.00
Output #0, ffm, to 'http://localhost:8099/feed1.ffm':
  Metadata:
    creation_time   : now
    encoder         : Lavf54.44.100
    Stream #0:0: Video: h264, yuv422p, 640x480, q=10-51, 3000 kb/s, 1000k tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo -> libx264)
Press [q] to stop, [?] for help
[libx264 @ 0xc183f0] VBV buffer size cannot be smaller than one frame, using 400 kbit
frame=   12 fps=0.0 q=0.0 size=       4kB time=00:00:00.00 bitrate=   0.0kbits/sframe=   22 fps= 20 q=0.0 size=       4kB time=00:00:00.00 bitrate=   0.0kbits/sframe=   30 fps= 19 q=0.0 size=       4kB time=00:00:00.00 bitrate=   0.0kbits/sframe=   38 fps= 18 q=0.0 size=       4kB time=00:00:00.00 bitrate=   0.0kbits/s

트랜스코딩 없이 비디오를 직접 스트리밍하는 방법에 대한 제안 사항이 있습니까?

답변1

실제로 저는 ffmpeg를 사용하여 h264 비디오를 스트리밍하는 데 성공했습니다. ffmpeg 사용자 목록, 특히 이 패치의 작성자인 Carl Eugen Hoyos의 도움을 받아 이 작업을 수행할 수 있었습니다.

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c 
index cd6aeb2..c3f813d 100644 
--- a/libavdevice/v4l2.c 
+++ b/libavdevice/v4l2.c 
@@ -150,6 +150,7 @@ static struct fmt_map fmt_conversion_table[] = { 
 { AV_PIX_FMT_NV12, AV_CODEC_ID_RAWVIDEO, V4L2_PIX_FMT_NV12 }, 
 { AV_PIX_FMT_NONE, AV_CODEC_ID_MJPEG, V4L2_PIX_FMT_MJPEG }, 
 { AV_PIX_FMT_NONE, AV_CODEC_ID_MJPEG, V4L2_PIX_FMT_JPEG }, 
+ { AV_PIX_FMT_NONE, AV_CODEC_ID_H264, V4L2_PIX_FMT_H264 }, 
 #ifdef V4L2_PIX_FMT_CPIA1 
 { AV_PIX_FMT_NONE, AV_CODEC_ID_CPIA, V4L2_PIX_FMT_CPIA1 }, 
 #endif

내가 사용한 실제 명령은 다음과 같습니다.

./ffmpeg -f video4linux2 -s 640x480 -r 15 -vcodec h264 -i /dev/video0 -an http://localhost:8099/feed1.ffm

하지만 트랜스코딩을 없앨 수 없어서 대신 vlc를 사용했습니다(작동했습니다).

답변2

출력 스트림에서 복사 옵션을 사용해 보십시오 -codec copy.

./ffmpeg -f video4linux2 -s 640x480 -r 15 -vcodec h264 -i /dev/video0 -codec copy -an http://localhost:8099/feed1.ffm

결과가 엇갈릴 수 있습니다. vcodec설정을 사용하여 복사 할 수 있지만 mjpegLogitech HD920이 두 가지를 모두 지원하더라도 복사할 수 없습니다. h264복사 옵션매우CPU 사용률을 줄입니다.

추신. 이전 버전의 복사본이 손상될 수 있으므로 최신 버전을 사용하세요.

관련 정보