comment_list.inc': $pre .= $default_pre .= 'comment_list.inc.htm'; break; case 'message': $pre .= $default_pre .= 'message.htm'; break; case 'tag_list': $pre .= $default_pre .= 'tag_list.htm'; break; case 'tag': $pre .= $default_pre .= 'tag.htm'; break; case 'flag': $pre .= $default_pre .= 'flag.htm'; break; case 'my': $pre .= $default_pre .= 'my.htm'; break; case 'my_password': $pre .= $default_pre .= 'my_password.htm'; break; case 'my_bind': $pre .= $default_pre .= 'my_bind.htm'; break; case 'my_avatar': $pre .= $default_pre .= 'my_avatar.htm'; break; case 'home_article': $pre .= $default_pre .= 'home_article.htm'; break; case 'home_comment': $pre .= $default_pre .= 'home_comment.htm'; break; case 'user': $pre .= $default_pre .= 'user.htm'; break; case 'user_login': $pre .= $default_pre .= 'user_login.htm'; break; case 'user_create': $pre .= $default_pre .= 'user_create.htm'; break; case 'user_resetpw': $pre .= $default_pre .= 'user_resetpw.htm'; break; case 'user_resetpw_complete': $pre .= $default_pre .= 'user_resetpw_complete.htm'; break; case 'user_comment': $pre .= $default_pre .= 'user_comment.htm'; break; case 'single_page': $pre .= $default_pre .= 'single_page.htm'; break; case 'search': $pre .= $default_pre .= 'search.htm'; break; case 'operate_sticky': $pre .= $default_pre .= 'operate_sticky.htm'; break; case 'operate_close': $pre .= $default_pre .= 'operate_close.htm'; break; case 'operate_delete': $pre .= $default_pre .= 'operate_delete.htm'; break; case 'operate_move': $pre .= $default_pre .= 'operate_move.htm'; break; case '404': $pre .= $default_pre .= '404.htm'; break; case 'read_404': $pre .= $default_pre .= 'read_404.htm'; break; case 'list_404': $pre .= $default_pre .= 'list_404.htm'; break; default: $pre .= $default_pre .= theme_mode_pre(); break; } if ($config['theme']) { $conffile = APP_PATH . 'view/template/' . $config['theme'] . '/conf.json'; $json = is_file($conffile) ? xn_json_decode(file_get_contents($conffile)) : array(); } !empty($json['installed']) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . ($id ? $id . '_' : '') . $pre; (empty($path_file) || !is_file($path_file)) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . $pre; if (!empty($config['theme_child']) && is_array($config['theme_child'])) { foreach ($config['theme_child'] as $theme) { if (empty($theme) || is_array($theme)) continue; $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . ($id ? $id . '_' : '') . $pre; !is_file($path_file) and $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . $pre; } } !is_file($path_file) and $path_file = APP_PATH . ($dir ? 'plugin/' . $dir . '/view/htm/' : 'view/htm/') . $default_pre; return $path_file; } function theme_mode_pre($type = 0) { global $config; $mode = $config['setting']['website_mode']; $pre = ''; if (1 == $mode) { $pre .= 2 == $type ? 'portal_category.htm' : 'portal.htm'; } elseif (2 == $mode) { $pre .= 2 == $type ? 'flat_category.htm' : 'flat.htm'; } else { $pre .= 2 == $type ? 'index_category.htm' : 'index.htm'; } return $pre; } ?>just audio - Flutter Just_audio_backround how to reset buffer and use mediaItem isLive parameter correctly - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

just audio - Flutter Just_audio_backround how to reset buffer and use mediaItem isLive parameter correctly - Stack Overflow

programmeradmin1浏览0评论

I am creating a flutter live radio stream application with the just_audio and just_audio_background packages. But I have some issues with the background audio control and to reset the cache with the background controls so the user after a pause is listening the live audio not the buffered part.

I tried using the isLive parameter with mixed success.

First of all, the audio seeker bar is disabled with this parameter which is good, and I need that, but when the user stops the playback and wants to restart it won't work.

If I don't use this parameter, then the notification control uses the pause method, which won't delete the buffer, and the seekbar is active and messes up the playback if you scroll with it.

My initialization code:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // Initialize JustAudioBackground only once
  await JustAudioBackground.init(
    androidNotificationChannelId: 'com.ryanheise.bg_demo.channel.audio',
    androidNotificationChannelName: 'Audio playback',
    androidNotificationOngoing: true,
  );

This is in the HomeScreen widget:

class HomeScreen extends StatefulWidget {
  final Map<String, dynamic> jsonData;

  const HomeScreen({super.key, required this.jsonData});

  @override
  HomeScreenState createState() => HomeScreenState();
}

class HomeScreenState extends State<HomeScreen> {
  final AudioPlayer _player = AudioPlayer();
  late final MediaItem mediaItem;
  Timer? _metadataTimer;
  String? _currentTitle;

  final StreamController<String?> _titleStreamController = StreamController<String?>.broadcast();

  @override
  void initState() {
    super.initState();
    SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
      statusBarColor: Colors.black,
    ));

    mediaItem = MediaItem(
      id: widget.jsonData['streamURL'],
      album: "Koko",
      title: widget.jsonData['nowPlayingPlaceHolder'] ?? "Radio",
      artist: "Koko",
      artUri: Uri.parse(widget.jsonData['radioLogoURL']),
      isLive: true,
    );

    _initAudio();
    if (Platform.isIOS) {
      _startMetadataTimer();
    }
  }

['streamURL'] and the other parameters are fetched from an https link from a server.

I tried using the audio_service plugin, but I can't get it to work with this late mediaItem initialization way. So I can use the https json data.

Any help and tip would be appreciated.

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论