当前位置: 首页 > 知识库问答 >
问题:

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

通令
2023-03-14

我正在尝试使用KitKat将实时网络摄像头视频从Ubuntu 12.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>

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

共有1个答案

姬温文
2023-03-14

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

 类似资料:
  • 我正在使用FFMPeg(版本FFMPeg-20170330-ad7aff0-win64-static)将RTSP转换为。m3u8。 命令是: ffmpeg-rtsp_传输tcp-i{rtsp}-c:v libx264-crf 35-预设超快-maxrate 3M-bufsize 300k-r 10-g 20-movflags faststart-tune zerolatency-hls_时间1-h

  • 我正在寻找一些关于如何使用标记以相对低的延迟(~2s)流直播视频流的建议。我也看到过一些其他类似的问题,比如这个和这个,但都没有真正充分地回答我的问题。第一种是在内容消费者不在现场的假设下工作的。第二个似乎也做出了这样的假设。 我正在寻找技术,库或任何建议真正实现这一点。我已经尝试使用nginx-RTMP从视频设备接收流,然后使用HLS将其发送到浏览器。然而,我所能达到的最低延迟是4s。我还没来得

  • 我想使用Flink流媒体以低延迟处理市场数据( 我有一组计算,每个都订阅三个流:缓慢移动的参数数据、股票价格和汇率。 例如。 Params(缓慢滴答:每天一次或两次): 资源(每秒多次滴答声): fx(每秒多次滴答声): 每当任何股票、外汇汇率或参数数据发生变化时,我都想立即计算结果并将其输出为新流。这在逻辑上可以表示为连接: 例如选择价格=(params.strike-asset.spot)*f

  • 有个透明视频 text.mov 和一个背景图 bg.jpg(将作为视频背景),合并之后视频的质量明显降低,设置了帧率、码流、编码方式都不行,有没有解决过类似问题的,悬赏千元求解,谢谢诸位!!!

  • 当我使用ffmpeg从wmv转换到mp4时,我的音频质量很差。我的ffmpeg命令如下: 有人能建议我如何在不降低任何质量的情况下转换视频吗?

  • 音频和视频都能在第一次正确播放,在音频播放完成时视频循环(因为它更短)。唯一的问题是音频循环不工作,一旦音频第一次完成,流就停止了。 以下是日志: ffmpeg version 4.3.1版权所有(c)2000-2020 ffmpeg开发人员 使用Apple clang version 12.0.0(clang-1200.0.32.27) 配置构建:--prefix=/usr/local/cell