我想流式传输无尽的直播视频数据,例如从我的Ubuntu机器的摄像头到Android客户端。因此,我使用ffmpeg(2.2.git)和ffserver(2.2.git)来编码H.264,包装成mp4,最后通过RTSP流。
我成功投放(发送,接收和播放)文件,例如ffmpeg配置如下:
ffmpeg -re -i input.mp4 \
-pix_fmt yuv420p \
-c:v libx264 -profile:v baseline -level 3.0 \
-c copy http://127.0.0.1:8888/feed1.ffm
但是,在(1),(2),(3)和其他文章的帮助下,我还没有成功投放 '无尽的网络摄像头数据 - 更不用说与Android兼容的任何内容了。我们的想法是使用支离破碎的mp4 。
当我尝试以下操作时:
ffmpeg -re -f v4l2 -video_size 1280x720 -i /dev/video0 \
-pix_fmt yuv420p \
-c:v libx264 -profile:v baseline -level 3.0 \
-f mp4 -movflags frag_keyframe+empty_moov \
-c copy http://127.0.0.1:8888/feed1.ffm
ffmpeg显示错误:
[NULL @ 0x26b3ce0] [Eval @ 0x7fffa0738a20] Undefined constant or missing '(' in 'baseline'
[NULL @ 0x26b3ce0] Unable to parse option value "baseline"
[NULL @ 0x26b3ce0] Error setting option profile to value baseline.
[mp4 @ 0x26b2f20] Using AVStream.codec.time_base as a timebase hint to the muxer is deprecated. Set AVStream.time_base instead.
[mp4 @ 0x26b2f20] Could not find tag for codec rawvideo in stream #0, codec not currently supported in container
存在以下细微差别:
ffmpeg \
-re -f v4l2 -i /dev/video0 \
-pix_fmt yuv420p \
-c:v libx264 \
-f mp4 -movflags frag_keyframe+empty_moov http://127.0.0.1:8888/feed2.ts
ffmpeg开始编码,但在约2秒后停止,输出如下:
[libx264 @ 0x2549aa0] frame= 0 QP=23.20 NAL=3 Slice:I Poc:0 I:1200 P:0 SKIP:0 size=15471 bytes
它让shell崩溃。
我还尝试了上述配置的多种变体。 V4l2工作正常。我认为,因为我可以录制来自网络摄像头的视频。
要播放网络摄像头数据,我该怎么做?
编辑:我使用H.264,H.264的基线配置文件和mp4的组合,因为我知道Android's compatibility。正如我所说,当与普通文件一起使用时,流式传输效果很好。
答案 0 :(得分:2)
尝试输出为Android的HLS,这是基本上碎片化的mp4切换成播放列表。
E.g。
ffmpeg -re -f v4l2 -video_size 1280x720 -i /dev/video0 -acodec libfdk_aac -b:a 64k -pix_fmt yuv420p -vcodec libx264 -x264opts level=41 -r 25 -profile:v baseline -b:v 1500k -maxrate 2000k -force_key_frames 50 -s 640×360 -map 0 -flags -global_header -f segment -segment_list index_1500.m3u8 -segment_time 10 -segment_format mpeg_ts -segment_list_type m3u8 segment%05d.ts
我没有机会测试这个,但它是从以前的代码片段复制的,所以应该工作。最近还有一些变化已经进入了我需要赶上的变化,并且你的一条错误消息有一个开放的bug。