关于rtsp

来源:9-4 ijkPlayer的集成与使用

demonCry

2022-08-26

是否默认支持rtsp 看了下日志和issue貌似应该是支持的 但是报错如下

W/IJKMEDIA( 6313): UDP timeout, retrying with TCP
E/IJKMEDIA( 6313): method PAUSE failed: 551 Option not supported

测试代码如下

import 'package:fijkplayer/fijkplayer.dart';
import 'package:flutter/material.dart';

class PlayerPage extends StatefulWidget {
  final String? url;

  const PlayerPage({Key? key, this.url}) : super(key: key);

  
  State<PlayerPage> createState() => _PlayerPageState();
}

class _PlayerPageState extends State<PlayerPage> {
  final FijkPlayer player = FijkPlayer();

  
  void initState() {
    super.initState();
    player.setDataSource(
     'rtsp://账号:密码@ip:port/h264/ch1/main/av_stream',
      autoPlay: true
    );
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text("Fijkplayer Example")),
        body: Container(
          alignment: Alignment.center,
          child: FijkView(
            player: player,
          ),
        ));
  }

  
  void dispose() {
    super.dispose();
    player.release();
  }
}

完整报错日志如下

Running Gradle task 'assembleDebug'...
√  Built build\app\outputs\flutter-apk\app-debug.apk.
Installing build\app\outputs\flutter-apk\app.apk...
Debug service listening on ws://127.0.0.1:1241/bxCZKElG7_0=/ws
Syncing files to device sdk gphone x86 arm...
D/J4A     ( 6313): J4ALoader: OK: 'android.os.Build$VERSION' loaded
D/J4A     ( 6313): J4ALoader: OK: 'android.os.Build' loaded
D/J4A     ( 6313): J4ALoader: OK: 'java.nio.Buffer' loaded
D/J4A     ( 6313): J4ALoader: OK: 'java.nio.ByteBuffer' loaded
D/J4A     ( 6313): J4ALoader: OK: 'java.util.ArrayList' loaded
I/J4A     ( 6313): API-Level: 30
D/J4A     ( 6313): J4ALoader: OK: 'android.media.AudioTrack' loaded
D/J4A     ( 6313): J4ALoader: OK: 'android.media.MediaCodec$BufferInfo' loaded
D/J4A     ( 6313): J4ALoader: OK: 'android.media.MediaCodec' loaded
D/J4A     ( 6313): J4ALoader: OK: 'android.media.MediaFormat' loaded
D/J4A     ( 6313): J4ALoader: OK: 'android.media.PlaybackParams' loaded
D/J4A     ( 6313): J4ALoader: OK: 'android.os.Bundle' loaded
D/J4A     ( 6313): J4ALoader: OK: 'tv.danmaku.ijk.media.player.misc.IMediaDataSource' loaded
D/J4A     ( 6313): J4ALoader: OK: 'tv.danmaku.ijk.media.player.misc.IAndroidIO' loaded
D/J4A     ( 6313): J4ALoader: OK: 'tv.danmaku.ijk.media.player.misc.MediaCodecSurface' loaded
D/J4A     ( 6313): J4ALoader: OK: 'tv.danmaku.ijk.media.player.IjkMediaPlayer' loaded
D/IJKMEDIA( 6313): ijkmediaplayer version : 
D/IJKMEDIA( 6313): IjkMediaPlayer_native_init
D/IJKMEDIA( 6313): IjkMediaPlayer_native_setup
I/IJKMEDIA( 6313): av_version_info: ff4.0--ijk0.8.8--20211030--926
I/IJKMEDIA( 6313): ijk_version_info: 
D/IJKMEDIA( 6313): ffpipeline_create_from_android()
D/IJKMEDIA( 6313): ijkmp_set_inject_opaque(0x29b6)
D/IJKMEDIA( 6313): ijkmp_set_inject_opaque()=void
D/IJKMEDIA( 6313): ijkmp_set_ijkio_inject_opaque(0x29b6)
D/IJKMEDIA( 6313): ijkmp_set_ijkio_inject_opaque()=void
D/IJKMEDIA( 6313): ijkmp_android_set_mediacodec_select_callback()
D/IJKMEDIA( 6313): ffpipeline_set_mediacodec_select_callback
D/IJKMEDIA( 6313): ijkmp_android_set_mediacodec_select_callback()=void
D/IJKMEDIA( 6313): IjkMediaPlayer_setOptionLong
D/IJKMEDIA( 6313): IjkMediaPlayer_setOptionLong
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.888600 [fijk] create player id:2
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.895904 [fijk] FijkPlayer{id:2} invoke setDataSource rtsp://账号:密码@ip:port/h264/ch1/main/av_stream
D/IJKMEDIA( 6313): IjkMediaPlayer_setDataSourceAndHeaders
V/IJKMEDIA( 6313): setDataSource: path rtsp://账号:密码@ip:port/h264/ch1/main/av_stream
D/IJKMEDIA( 6313): ijkmp_set_data_source(url="rtsp://账号:密码@ip:port/h264/ch1/main/av_stream")
D/IJKMEDIA( 6313): ijkmp_set_data_source(url="rtsp://账号:密码@ip:port/h264/ch1/main/av_stream")=0
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.924352 [fijk] FijkPlayer{id:2} state changed to FijkState.initialized <= FijkState.idle
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.929552 [fijk] FijkPlayer{id:2} invoke prepareAsync and start #1
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.931086 [fijk] FijkPlayer{id:2} setOption k:start-on-prepared, v:1
D/IJKMEDIA( 6313): IjkMediaPlayer_setOptionLong
D/IJKMEDIA( 6313): IjkMediaPlayer_prepareAsync
D/IJKMEDIA( 6313): ijkmp_prepare_async()
W/IJKMEDIA( 6313): remove 'timeout' option for rtmp.
I/IJKMEDIA( 6313): ===== versions =====
I/IJKMEDIA( 6313): ijkplayer    : 
I/IJKMEDIA( 6313): FFmpeg       : ff4.0--ijk0.8.8--20211030--926
I/IJKMEDIA( 6313): libavutil    : 56.14.100
I/IJKMEDIA( 6313): libavcodec   : 58.18.100
I/IJKMEDIA( 6313): libavformat  : 58.12.100
I/IJKMEDIA( 6313): libswscale   : 5.1.100
I/IJKMEDIA( 6313): libswresample: 3.1.100
I/IJKMEDIA( 6313): ===== options =====
I/IJKMEDIA( 6313): player-opts : enable-position-notify       = 1
I/IJKMEDIA( 6313): player-opts : start-on-prepared            = 1
I/IJKMEDIA( 6313): format-opts : ijkapplication               = -316185312
I/IJKMEDIA( 6313): format-opts : ijkiomanager                 = -423568816
I/IJKMEDIA( 6313): ===================
I/IJKMEDIA( 6313): SDL_RunThread: [6398] ff_msg_loop
D/IJKMEDIA( 6313): message_loop
D/IJKMEDIA( 6313): FFP_MSG_FLUSH:
D/IJKMEDIA( 6313): ijkmp_prepare_async()=0
I/IJKMEDIA( 6313): SDL_RunThread: [6399] ff_vout
I/IJKMEDIA( 6313): SDL_RunThread: [6400] ff_read
W/IJKMEDIA( 6313): remove 'timeout' option for rtmp.
I/IJKMEDIA( 6313): cur ipv4 c_ipaddr = 192.168.0.209
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.937122 [fijk] FijkPlayer{id:2} state changed to FijkState.asyncPreparing <= FijkState.initialized
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.939315 [fijk] FijkPlayer{id:2} invoke prepareAsync and start #1 -> done
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.940891 [fijk] FijkPlayer{id:2} state changed to FijkState.initialized <= FijkState.idle
I/flutter ( 6313): [inf] 2022-08-26 08:46:41.942063 [fijk] FijkPlayer{id:2} state changed to FijkState.asyncPreparing <= FijkState.initialized
I/IJKMEDIA( 6313): tcp did open uri = tcp://192.168.0.209:554?timeout=0, ip =  port = 0
W/IJKMEDIA( 6313): 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
W/IJKMEDIA( 6313): 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
E/IJKMEDIA( 6313): Option ijkapplication not found.
D/IJKMEDIA( 6313): FFP_MSG_OPEN_INPUT:
W/IJKMEDIA( 6313): UDP timeout, retrying with TCP
E/IJKMEDIA( 6313): method PAUSE failed: 551 Option not supported
E/IJKMEDIA( 6313): missing picture in access unit
W/IJKMEDIA( 6313): Could not find codec parameters for stream 0 (Video: hevc, none): unspecified size
W/IJKMEDIA( 6313): Consider increasing the value for the 'analyzeduration' and 'probesize' options
I/IJKMEDIA( 6313): max_frame_duration: 10.000
I/IJKMEDIA( 6313): Input #0, rtsp, from 'rtsp://账号:密码@ip:port/h264/ch1/main/av_stream':
I/IJKMEDIA( 6313):   Metadata:
I/IJKMEDIA( 6313):     title           : 
I/IJKMEDIA( 6313): Media Presentation
I/IJKMEDIA( 6313): 
I/IJKMEDIA( 6313):   Duration: 
I/IJKMEDIA( 6313): N/A
I/IJKMEDIA( 6313): , bitrate: 
I/IJKMEDIA( 6313): N/A
I/IJKMEDIA( 6313): 
I/IJKMEDIA( 6313):     Stream #0:0
I/IJKMEDIA( 6313): : Video: hevc, none
I/IJKMEDIA( 6313): , 
I/IJKMEDIA( 6313): 90k tbr, 
I/IJKMEDIA( 6313): 90k tbn, 
I/IJKMEDIA( 6313): 90k tbc
I/IJKMEDIA( 6313): 
D/IJKMEDIA( 6313): FFP_MSG_FIND_STREAM_INFO:
I/IJKMEDIA( 6313): VideoCodec: avcodec, hevc
W/IJKMEDIA( 6313): fps: 90000.000000 (normal)
D/IJKMEDIA( 6313): FFP_MSG_COMPONENT_OPEN:
I/IJKMEDIA( 6313): SDL_RunThread: [6410] ff_video_dec
D/IJKMEDIA( 6313): FFP_MSG_VIDEO_SIZE_CHANGED: 0, 0
D/IJKMEDIA( 6313): FFP_MSG_SAR_CHANGED: 0, 1
D/IJKMEDIA( 6313): ijkmp_get_msg: FFP_MSG_PREPARED
D/IJKMEDIA( 6313): FFP_MSG_PREPARED:
D/IJKMEDIA( 6313): FFP_MSG_VIDEO_ROTATION_CHANGED: 0
D/IJKMEDIA( 6313): FFP_MSG_BUFFERING_START:
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.162018 [fijk] FijkPlayer{id:2} prepared duration 0:00:00.000000
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.162471 [fijk] FijkPlayer{id:2} setupSurface
D/IJKMEDIA( 6313): IjkMediaPlayer_setVideoSurface
D/IJKMEDIA( 6313): ijkmp_set_android_surface(surface=0xffecfd28)
D/IJKMEDIA( 6313): ffpipeline_set_surface()
D/IJKMEDIA( 6313): ijkmp_set_android_surface(surface=0xffecfd28)=void
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.164356 [fijk] FijkPlayer{id:2} rotate degree 0
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.167086 [fijk] FijkPlayer{id:2} state changed to FijkState.prepared <= FijkState.asyncPreparing
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.168371 [fijk] FijkPlayer{id:2} setupSurface
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.169926 [fijk] FijkPlayer{id:2} state changed to FijkState.started <= FijkState.prepared
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.170836 [fijk] FijkPlayer{id:2} setupSurface
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.173181 [fijk] view setup, vid:1
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.174649 [fijk] view setup, vid:1
I/flutter ( 6313): [inf] 2022-08-26 08:46:52.175582 [fijk] view setup, vid:1
W/IJKMEDIA( 6313): UDP timeout, retrying with TCP
E/IJKMEDIA( 6313): method PAUSE failed: 551 Option not supported

桑桑能帮忙看下吗… 另外请问怎么解决rtsp延迟问题, 看了下issue 貌似这问题蛮普遍的… 项目要求需要在100ms以内…

写回答

1回答

马超老师

2022-08-26

你的rtsp是基于TCP实现的吗?从日志上看起来是ffmeg解析rtsp失败了。对于ffmeg,需要加上

-rtsp_transport tcp

这个指令切换rtsp的transport设置。


这个ffmeg的指令对应fijkPlayer可以通过以下接口设置:

await fijkPlayer.setOption(FijkOption.formatCategory, "rtsp_transport", "tcp");

设置完成之后再启动播放即可。


关于延时问题,ijkPlayer对rtsp的支持应该是比较好的,可以先试试播放效果,如果有问题可以在讨论讨论。

0
1
demonCry
好的 O.o!
2022-08-27
共1条回复

基于Flutter 3.x 实战跨平台仿抖音App混合开发

以短视频APP为例,快速上手原生/Flutter 混合开发

481 学习 · 120 问题

查看课程