Flutter Flutter-pi视频播放器udp流

6vl6ewon  于 2023-05-30  发布在  Flutter
关注(0)|答案(1)|浏览(219)

我在Flutter-Pi上运行Flutter插件video_player的示例,用于Raspberry Pi 3B+

void initState() {
    super.initState();
    _controller = VideoPlayerController.network('https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4')..initialize().then((_) {setState(() {});});
}

而且很有效
打开文件 *.mp4

void initState() {
    super.initState();
    _controller = VideoPlayerController.asset('assets/big_bunny.mp4');
    _controller.addListener(() {
        setState(() {});
    });
    _controller.setLooping(true);
    _controller.initialize().then((_) => setState(() {}));
    _controller.play();}

作品也
但是,我需要打开RTP流(UDP)。
我是这样测试gstreamer的

gst-launch-1.0 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! avdec_h264 ! videoscale ! autovideosink sync=false

和Raspberry Pi显示来自流的相机的帧。所以,我想在RaspberryPi上的flutter应用程序中显示它。我想这样使用URI

String pipeline = "udp://<remote-ip>:5000 ! application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96 ! rtph264depay ! avdec_h264 ! videoscale ! autovideosink sync=false";

..

void initState() {
    super.initState();
    _controller = VideoPlayerController.network(pipeline)..initialize();
}

但是,我得到错误,没有显示任何内容

[gstreamer video_player] Could not fetch duration. (gst_element_query_duration)

RaspberryPi上的Gstreamer工作良好,但我无法在本地网络中显示flutter-pi udp流
flutter-pi现在使用gstreamer,但是我可以在gstreamer中打开像管道一样的udp流吗?

j1dl9f46

j1dl9f461#

我厌倦了在我的linux应用程序中使用gstreamer库。所以我决定使用Process来运行gstreamer代码

process = await Process.start('first gstreamer code ', [list of gstreamer items]);
    process.stdout.transform(utf8.decoder).listen((event) {
      stdout.writeln(event);
    });

然后你就可以像下面这样通过socket从RowDatagramSocket接收你的gstreamer视频:

socket = await RawDatagramSocket.bind(InternetAddress('127.0.0.1'),
        port); //* socket to listen to UDP link on entered port

当然,如果您将接收数据缓冲区作为数据报类型,则必须指定从套接字接收的图像缓冲区的开始和结束指针

subscription = socket.listen((event) {
      //& when socket is listening will try to collect buffer :
      if (event == RawSocketEvent.read) {
        Datagram? datagram =
            socket.receive(); //* receive data in datagram variable.

        var dating =
            datagram?.data; //*  initail dating from datagram data if not null.

.
.
.
for statement to check buffer pointers 
.
.
.
//& add image buffer list to stream controller.
controller.add('list of image buffer');

如果你的gstreamer代码是这样的:**“gst-launch-1.0 v4l2src device=/dev/video0!视频/x-raw,帧率=30/1!jpegenc!multipartmux!udpsink host=127.0.0.1 port=5000”表示图像格式为jpeg您的图像指针开始和结束为(ffd 8,ffd 9)表示您必须检查缓冲区中的ff(或255)然后d8(或216)**作为开始图像指针。
我想简单地说,这可能对你有帮助。
注意:我不知道如何才能做到这一点,为h264格式类型,如果任何人看到,并有想法可以帮助我们。

相关问题