I am trying to use IJK Player (for flutter, FIJK player) to play an RTSP stream. However, I keep getting errors. Here's a simple example:
import 'package:fijkplayer/fijkplayer.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final FijkPlayer player = FijkPlayer();
@override
void initState() {
super.initState();
player.setDataSource('rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4', autoPlay: true);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Fijkplayer Example")),
body: Container(
alignment: Alignment.center,
child: FijkView(
player: player,
),
));
}
@override
void dispose() {
super.dispose();
player.release();
}
}
Here are the logs:
Syncing files to device SM G950F...
D/J4A (18689): J4ALoader: OK: 'android.os.Build$VERSION' loaded
D/J4A (18689): J4ALoader: OK: 'android.os.Build' loaded
D/J4A (18689): J4ALoader: OK: 'java.nio.Buffer' loaded
D/J4A (18689): J4ALoader: OK: 'java.nio.ByteBuffer' loaded
D/J4A (18689): J4ALoader: OK: 'java.util.ArrayList' loaded
I/J4A (18689): API-Level: 28
D/J4A (18689): J4ALoader: OK: 'android.media.AudioTrack' loaded
D/J4A (18689): J4ALoader: OK: 'android.media.MediaCodec$BufferInfo' loaded
D/J4A (18689): J4ALoader: OK: 'android.media.MediaCodec' loaded
D/J4A (18689): J4ALoader: OK: 'android.media.MediaFormat' loaded
D/J4A (18689): J4ALoader: OK: 'android.media.PlaybackParams' loaded
D/J4A (18689): J4ALoader: OK: 'android.os.Bundle' loaded
D/J4A (18689): J4ALoader: OK: 'tv.danmaku.ijk.media.player.misc.IMediaDataSource' loaded
D/J4A (18689): J4ALoader: OK: 'tv.danmaku.ijk.media.player.misc.IAndroidIO' loaded
D/J4A (18689): J4ALoader: OK: 'tv.danmaku.ijk.media.player.misc.MediaCodecSurface' loaded
D/J4A (18689): J4ALoader: OK: 'tv.danmaku.ijk.media.player.IjkMediaPlayer' loaded
D/IJKMEDIA(18689): ijkmediaplayer version :
D/IJKMEDIA(18689): IjkMediaPlayer_native_init
D/IJKMEDIA(18689): IjkMediaPlayer_native_setup
I/IJKMEDIA(18689): av_version_info: ff4.0--ijk0.8.8--20211030--926
I/IJKMEDIA(18689): ijk_version_info:
D/IJKMEDIA(18689): ffpipeline_create_from_android()
D/IJKMEDIA(18689): ijkmp_set_inject_opaque(0x28d6)
D/IJKMEDIA(18689): ijkmp_set_inject_opaque()=void
D/IJKMEDIA(18689): ijkmp_set_ijkio_inject_opaque(0x28d6)
D/IJKMEDIA(18689): ijkmp_set_ijkio_inject_opaque()=void
D/IJKMEDIA(18689): ijkmp_android_set_mediacodec_select_callback()
D/IJKMEDIA(18689): ffpipeline_set_mediacodec_select_callback
D/IJKMEDIA(18689): ijkmp_android_set_mediacodec_select_callback()=void
D/IJKMEDIA(18689): IjkMediaPlayer_setOptionLong
D/IJKMEDIA(18689): IjkMediaPlayer_setOptionLong
D/vndksupport(18689): Loading /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl.so from current namespace instead of sphal namespace.
I/flutter (18689): [inf] 2023-06-12 10:57:56.440863 [fijk] create player id:2
I/flutter (18689): [inf] 2023-06-12 10:57:56.455582 [fijk] FijkPlayer{id:2} invoke setDataSource rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4
D/ViewRootImpl@ac59723[MainActivity](18689): Relayout returned: old=[0,0][1080,2220] new=[0,0][1080,2220] result=0x3 surface={valid=true 546134716416} changed=false
D/IJKMEDIA(18689): IjkMediaPlayer_setDataSourceAndHeaders
V/IJKMEDIA(18689): setDataSource: path rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4
D/IJKMEDIA(18689): ijkmp_set_data_source(url="rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4")
D/IJKMEDIA(18689): ijkmp_set_data_source(url="rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4")=0
I/flutter (18689): [inf] 2023-06-12 10:57:56.489175 [fijk] FijkPlayer{id:2} state changed to FijkState.initialized <= FijkState.idle
I/flutter (18689): [inf] 2023-06-12 10:57:56.500278 [fijk] FijkPlayer{id:2} invoke prepareAsync and start #1
I/flutter (18689): [inf] 2023-06-12 10:57:56.501402 [fijk] FijkPlayer{id:2} setOption k:start-on-prepared, v:1
D/IJKMEDIA(18689): IjkMediaPlayer_setOptionLong
D/IJKMEDIA(18689): IjkMediaPlayer_prepareAsync
D/IJKMEDIA(18689): ijkmp_prepare_async()
W/IJKMEDIA(18689): remove 'timeout' option for rtmp.
I/IJKMEDIA(18689): ===== versions =====
I/IJKMEDIA(18689): ijkplayer :
I/IJKMEDIA(18689): SDL_RunThread: [18893] ff_msg_loop
I/IJKMEDIA(18689): FFmpeg : ff4.0--ijk0.8.8--20211030--926
I/IJKMEDIA(18689): libavutil : 56.14.100
D/IJKMEDIA(18689): message_loop
I/IJKMEDIA(18689): libavcodec : 58.18.100
I/IJKMEDIA(18689): libavformat : 58.12.100
I/IJKMEDIA(18689): libswscale : 5.1.100
I/IJKMEDIA(18689): libswresample: 3.1.100
I/IJKMEDIA(18689): ===== options =====
I/IJKMEDIA(18689): player-opts : enable-position-notify = 1
I/IJKMEDIA(18689): player-opts : start-on-prepared = 1
I/IJKMEDIA(18689): format-opts : ijkapplication = 546139559776
I/IJKMEDIA(18689): format-opts : ijkiomanager = 546134369280
I/IJKMEDIA(18689): ===================
D/IJKMEDIA(18689): FFP_MSG_FLUSH:
I/IJKMEDIA(18689): SDL_RunThread: [18894] ff_vout
D/IJKMEDIA(18689): ijkmp_prepare_async()=0
I/IJKMEDIA(18689): SDL_RunThread: [18895] ff_read
W/IJKMEDIA(18689): remove 'timeout' option for rtmp.
I/flutter (18689): [inf] 2023-06-12 10:57:56.532332 [fijk] FijkPlayer{id:2} state changed to FijkState.asyncPreparing <= FijkState.initialized
I/flutter (18689): [inf] 2023-06-12 10:57:56.533073 [fijk] FijkPlayer{id:2} invoke prepareAsync and start #1 -> done
I/flutter (18689): [inf] 2023-06-12 10:57:56.534148 [fijk] FijkPlayer{id:2} state changed to FijkState.initialized <= FijkState.idle
I/flutter (18689): [inf] 2023-06-12 10:57:56.534974 [fijk] FijkPlayer{id:2} state changed to FijkState.asyncPreparing <= FijkState.initialized
I/IJKMEDIA(18689): cur ipv4 c_ipaddr = 3.87.10.134
E/IJKMEDIA(18689): Connection to tcp://wowzaec2demo.streamlock.net:554?timeout=0 failed: Connection refused
E/IJKMEDIA(18689): rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4: Connection refused
I/IJKMEDIA(18689): SDL_JNI_DetachThreadEnv: [18895]
D/IJKMEDIA(18689): FFP_MSG_ERROR: -111
E/tv.danmaku.ijk.media.player.IjkMediaPlayer(18689): Error (-111,0,Connection refused)
I/flutter (18689): [err] 2023-06-12 10:57:56.749146 [fijk] FijkPlayer{id:2} errorListener: FijkException(-111, Connection refused)
I/flutter (18689): [inf] 2023-06-12 10:57:56.750916 [fijk] FijkPlayer{id:2} state changed to FijkState.error <= FijkState.asyncPreparing
I/flutter (18689): FijkState.error
I can play this RTSP stream easily on VLC (both on mobile and on the Desktop). Am I missing something?
Note: this snippet uses a public available RTSP stream, I've also tried hosting a server on my machine and got the same result (error).