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
설정을 사용하여 복사 할 수 있지만 mjpeg
Logitech HD920이 두 가지를 모두 지원하더라도 복사할 수 없습니다. h264
복사 옵션매우CPU 사용률을 줄입니다.
추신. 이전 버전의 복사본이 손상될 수 있으므로 최신 버전을 사용하세요.