使用ffmpeg实时将mp4从Linux流式传输到Android

时间:2014-07-01 11:30:08

标签: android linux ffmpeg streaming mp4

我想流式传输无尽的直播视频数据,例如从我的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。正如我所说,当与普通文件一起使用时,流式传输效果很好。

1 个答案:

答案 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。