使用ffmpeg将低延迟RTSP视频流到android

使用ffmpeg将低延迟RTSP视频流到android,android,video,ffmpeg,stream,rtsp,Android,Video,Ffmpeg,Stream,Rtsp,我正在尝试用KitKat将在线摄像头视频从Ubuntu12.04 PC传输到android设备。到目前为止,我已经编写了ffserver配置文件来接收ffm提要并通过rtsp协议进行广播。我可以通过ffplay在同一局域网的另一台计算机上观看流 如何在android设备上观看流?以下代码在使用vlc对网络摄像头图像进行流式传输时效果良好,但在使用ffmpeg时效果不佳: public class MainActivity extends Activity implements MediaPlay

我正在尝试用KitKat将在线摄像头视频从Ubuntu12.04 PC传输到android设备。到目前为止,我已经编写了ffserver配置文件来接收ffm提要并通过rtsp协议进行广播。我可以通过ffplay在同一局域网的另一台计算机上观看流

如何在android设备上观看流?以下代码在使用vlc对网络摄像头图像进行流式传输时效果良好,但在使用ffmpeg时效果不佳:

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener,
        SurfaceHolder.Callback {

    final static String RTSP_URL = "rtsp://192.168.1.54:4424/test.sdp";

    private MediaPlayer _mediaPlayer;
    private SurfaceHolder _surfaceHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set up a full-screen black window.
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getWindow();
        window.setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.setBackgroundDrawableResource(android.R.color.black);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_main);

        // Configure the view that renders live video.
        SurfaceView videoView =
                (SurfaceView) findViewById(R.id.videoView); //where R.id.videoView is a simple SurfaceView element in the layout xml file
        _surfaceHolder = videoView.getHolder();
        _surfaceHolder.addCallback(this);
        _surfaceHolder.setFixedSize(320, 240);
    }
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        _mediaPlayer = new MediaPlayer();
        _mediaPlayer.setDisplay(_surfaceHolder);
        Context context = getApplicationContext();
        Uri source = Uri.parse(RTSP_URL);
        try {
            // Specify the IP camera's URL and auth headers.
            _mediaPlayer.setDataSource(context, source);

            // Begin the process of setting up a video stream.
            _mediaPlayer.setOnPreparedListener(this);
            _mediaPlayer.prepareAsync();
        }
        catch (Exception e) {}
    }
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        _mediaPlayer.start();
    }
}
我的ffserver.config文件:

HTTPPort 8090
RTSPBindAddress 0.0.0.0
RTSPPort 4424
MaxBandwidth 10000
CustomLog -

<Feed feed1.ffm>
        File /tmp/feed1.ffm
        FileMaxSize 20M
        ACL allow 127.0.0.1
</Feed>
<Stream test1.sdp>
    Feed feed1.ffm
    Format rtp  
    VideoCodec libx264
    VideoSize 640x480
    AVOptionVideo flags +global_header
    AVOptionVideo me_range 16
    AVOptionVideo qdiff 4
    AVOptionVideo qmin 10
    AVOptionVideo qmax 51
    Noaudio
    ACL allow localhost
        ACL allow 192.168.0.0 192.168.255.255
</Stream>
HTTPPort 8090
RTSPBindAddress 0.0.0.0
RTSPPort 4424
最大带宽10000
自定义日志-
文件/tmp/feed1.ffm
FileMaxSize 20M
ACL允许127.0.0.1
饲料1.ffm
格式rtp
视频编解码器libx264
视频大小640x480
AVOptionVideo标志+全局_标题
AVOptionVideo me_系列16
AVOptionVideo qdiff 4
AVOptionVideo qmin 10
AVOptionVideo qmax 51
诺奥迪奥
ACL允许本地主机
ACL允许192.168.0.0 192.168.255.255

我使用以下命令启动流:
ffmpeg-f v4l2-I/dev/video0-c:v libx264-b:v 600khttp://localhost:8090/feed1.ffm

此错误很可能是由VLC和FFmpeg的不同编码参数引起的-VLC可以使用Android能够支持的编码参数,但FFmpeg可以使用不受支持的参数(最可能的AVC配置文件和级别)。尝试通过FFmpeg命令行选项和ffserver.config强制基线或主配置文件和YUV 4:2:0像素格式。

可能使用Wireshark检查RTSP级别发生的情况-连接是否打开,是否找到磁道?如果未找到磁道,则问题最有可能出现在ffserver,否则,如果数据推送到那里可能是Android无法处理的格式问题。我检查了Android支持的格式,并且使用了受支持的格式。我还确定连接已由ffserver打开并注册。控制台输出:
Mon-Oct 20 17:04:53 2014 192.168.1.55---[描述]”rtsp://192.168.1.54:4424/test.sdp RTSP/1.0“200 72和Android Studio中的logcat显示以下错误MediaPlayer﹕ 错误(1,-2147483648),未知(描述)您提到的帖子包含此
07-18 13:47:14.245:W/QCvdec(68):解析错误不支持的配置文件或级别
-您也有吗?libx264可能使用不支持的压缩参数,而vlc可能使用支持的压缩参数。不,我没有。我只有
D/MediaPlayer﹕ 无法在客户端打开文件,正在尝试使用MediaPlayer的服务器端﹕ 信息/警告(701,0)E/MediaPlayer﹕ 错误(1,-2147483648)