关于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的支持应该是比较好的,可以先试试播放效果,如果有问题可以在讨论讨论。
012022-08-27
相似问题