Osu Replay Viewer ((top)) 〈2026〉
osu! replay viewer is an essential tool for players to review their performance and for creators to share their gameplay as videos. In the standard game, replays are saved in the osu!/data/r directory as Evolution of Replay Technology in osu!
The community has developed several third-party tools to improve the replay experience beyond the native client:
osu! replay viewer is a tool or feature used to watch, analyze, and share recorded gameplay from the rhythm game
. These tools range from built-in game functions to advanced third-party software designed for deep performance analysis or video rendering. 1. Built-in osu! Replay Features
The official client includes native ways to manage and view replays: Saving Replays
on the ranking screen immediately after finishing a map to save the play as a Viewing Local Records
: Access previously saved replays by selecting a beatmap and switching the leaderboard view to Local Ranking Watching Top Plays
: If you are logged in, you can watch top 1,000 global leaderboard replays directly by clicking the player's name on the beatmap screen. Keyboard Shortcuts to quickly rewatch a replay. Press to hide the replay HUD for a cleaner view. 2. Popular Third-Party Replay Viewers & Analyzers
For deeper analysis without launching the full game, players use specialized external tools: GitHub - nahkd123/osu-replay-viewer
The Ultimate Guide to Osu Replay Viewer: Unlocking the Secrets of Your Gameplay
As an avid Osu player, you're likely no stranger to the thrill of competing with others, climbing the ranks, and mastering your favorite songs. But have you ever wondered what makes your gameplay tick? What secrets lie hidden in the replay files that Osu generates every time you play a beatmap? This is where the Osu replay viewer comes in – a powerful tool that allows you to dissect your gameplay, analyze your performance, and gain valuable insights to improve your skills.
What is an Osu Replay File?
Before we dive into the world of Osu replay viewers, let's take a brief look at what an Osu replay file is. When you play a beatmap in Osu, the game generates a replay file that contains a record of your gameplay. This file includes information such as your score, accuracy, and the exact sequence of actions you took during the play, including mouse movements, keyboard inputs, and game events.
What is an Osu Replay Viewer?
An Osu replay viewer is a software application that allows you to open, analyze, and visualize Osu replay files. With a replay viewer, you can relive your gameplay, frame by frame, and gain a deeper understanding of your performance. Whether you're a casual player looking to improve your skills or a competitive player seeking to optimize your gameplay, an Osu replay viewer is an essential tool in your arsenal.
Features of an Osu Replay Viewer
So, what can you expect from an Osu replay viewer? Here are some of the key features that make these tools so powerful:
- Playback control: Pause, rewind, and fast-forward through your replay to analyze specific sections of your gameplay.
- Visualization: See your gameplay in a graphical representation, including mouse movements, keyboard inputs, and game events.
- Statistics and metrics: View detailed statistics about your gameplay, such as accuracy, score, and combo.
- Beatmap analysis: See how you performed on specific sections of the beatmap, including accuracy and miss rates.
- Comparison tools: Compare your gameplay with that of other players to identify areas for improvement.
Benefits of Using an Osu Replay Viewer
So, why should you use an Osu replay viewer? Here are just a few benefits that can help you improve your gameplay:
- Improved accuracy: By analyzing your replay, you can identify patterns of error and work on correcting them.
- Increased score: By optimizing your gameplay and reducing mistakes, you can boost your score and climb the ranks.
- Enhanced gameplay: Gain a deeper understanding of the beatmap and develop strategies to overcome challenging sections.
- Competitive edge: Analyze the gameplay of top players and learn from their techniques.
Popular Osu Replay Viewers
So, which Osu replay viewers are worth checking out? Here are some of the most popular options:
- Osu Replay Viewer: A simple, lightweight replay viewer that comes bundled with Osu.
- Osu! Replays: A feature-rich replay viewer with advanced statistics and visualization tools.
- Replay Viewer: A third-party replay viewer with a user-friendly interface and robust analysis features.
How to Use an Osu Replay Viewer
Using an Osu replay viewer is relatively straightforward. Here's a step-by-step guide to get you started:
- Download and install: Choose an Osu replay viewer and download it from the official website or a trusted source.
- Locate your replay file: Find the replay file you want to analyze, usually located in the Osu replay directory.
- Open the replay file: Launch the replay viewer and open the replay file.
- Analyze your gameplay: Use the playback control and visualization features to analyze your gameplay.
- Take notes and adjust: Take notes on areas for improvement and adjust your gameplay accordingly.
Tips and Tricks for Getting the Most Out of Your Osu Replay Viewer
Here are some additional tips and tricks to help you get the most out of your Osu replay viewer:
- Focus on specific sections: Identify challenging sections of the beatmap and focus on analyzing those areas.
- Compare with others: Compare your gameplay with that of top players to gain insights into new techniques.
- Use statistics and metrics: Use detailed statistics to identify patterns of error and track your progress over time.
- Practice consistently: Regularly analyze your gameplay and make adjustments to see consistent improvement.
Conclusion
The Osu replay viewer is a powerful tool that can help you unlock the secrets of your gameplay and improve your skills. By analyzing your replay files, you can gain valuable insights into your performance, identify areas for improvement, and develop strategies to overcome challenging sections. Whether you're a casual player or a competitive player, an Osu replay viewer is an essential tool in your arsenal. So why not give it a try and see how it can help you take your gameplay to the next level?
Mastering the Osu! Replay Viewer: A Complete Guide to Improving Your Gameplay
Whether you’ve just set a new "Personal Best" on a grueling 7-star map or you’re trying to figure out why you keep clicking early on technical sliders, the osu! replay viewer is your most powerful tool for improvement.
In osu!, progress isn’t just about clicking circles; it’s about analyzing your mistakes. Here is everything you need to know about using the replay viewer to its full potential. What is the Osu! Replay Viewer?
The osu! replay viewer is a built-in feature that records every cursor movement, keypress, and hit result during a play. It allows players to watch their performances back from the game client, providing a "spectator" perspective of their own skills. How to Access Your Replays
Local Rankings: After finishing a map, your score is saved locally. Click on the score in your local leaderboard to watch the replay.
Online Rankings: If you have an active internet connection and the score is in your Top 1,000, you can download the replay from the song selection screen by right-clicking the score.
Exporting: Pressing F2 in the results screen saves the replay as an .osr file in your osu!/Replays folder. Why You Should Watch Your Replays
Many players finish a map and immediately move to the next one. However, the best players in the world spend significant time in the replay viewer. 1. Identifying "Bad Habits"
Are you consistently aiming to the left of notes? Do you tend to "notelock" on fast streams? Watching a replay with Smoke (activated by holding the 'C' key or a specific mouse button) or simply observing the cursor path helps you see mechanical errors that are invisible while you're focused on playing. 2. Analyzing Unstable Rate (UR) osu replay viewer
The replay viewer allows you to see the hit error bar at the bottom of the screen. By watching your replay, you can see if your UR is high because you’re rushing the beat or if you’re reacting too slowly to high-approach rate (AR) circles. 3. Studying Top Players
The replay viewer isn’t just for your own plays. You can download replays from legends like Mrekk, WhiteCat, or Vaxei. Watching their cursor movements in slow motion is a masterclass in efficiency and flow. Advanced Features of the Viewer Speed Control
While watching a replay, you can use the following keys to adjust the experience: Spacebar: Pause/Play. F: Toggle the scoreboard. H: Toggle the interface (clean view).
Speed Adjustment: While the standard client doesn't natively allow frame-by-frame scrubbing, using mods like Lazer (the next-gen osu! client) gives you a seek bar and variable playback speeds. The "osu!lazer" Difference
If you want the ultimate replay viewer experience, try osu!lazer. It features: A functional seek bar (jump to any part of the song). Detailed hit diagrams.
The ability to watch multiple replays simultaneously to compare different runs. How to Share Your Replays
The .osr file format is tiny because it doesn't contain video; it only contains data points. To share your play on YouTube or Reddit:
Recording Software: Use OBS (Open Broadcaster Software) to record the replay viewer while it plays.
Rendering Tools: Community tools like ordr allow you to upload an .osr file to a server, which then renders a high-quality video for you and sends you a link. Conclusion
The osu! replay viewer is more than just a way to admire your high scores. It is a diagnostic tool that bridges the gap between a "hardstuck" player and a top-tier performer. By regularly reviewing your missed notes and timing errors, you turn every failure into a lesson.
Next time you see that "X" on a map, don't just restart—watch the replay and find out why.
Title: "Relive the Magic: A Guide to Using an osu Replay Viewer"
Introduction
osu! is a popular rhythm game that has captured the hearts of millions of players worldwide. With its vast array of beatmaps, challenging gameplay, and strong community, it's no wonder why osu! remains one of the most beloved music games out there. For those who have spent countless hours playing osu!, you might have wondered what it would be like to relive some of your favorite moments or analyze your gameplay in detail. This is where an osu replay viewer comes in.
What is an osu Replay Viewer?
An osu replay viewer is a tool that allows you to watch replays of your osu! gameplay. These replays can be generated from files saved by the osu! client or from online sources. With a replay viewer, you can relive your past gameplay experiences, analyze your techniques, and even learn from your mistakes.
Benefits of Using an osu Replay Viewer
So, why would you want to use an osu replay viewer? Here are a few benefits:
- Improve your skills: By analyzing your replays, you can identify areas where you need improvement and work on perfecting your technique.
- Relive the nostalgia: osu replay viewers allow you to relive your favorite moments, whether it's a flawless play or a epic fail.
- Learn from others: You can also use replay viewers to watch and learn from top players, gaining insights into their strategies and techniques.
How to Use an osu Replay Viewer
Using an osu replay viewer is relatively straightforward. Here's a step-by-step guide:
- Obtain a replay file: You can generate a replay file by playing osu! and saving the replay file. Alternatively, you can download replay files from online sources.
- Choose a replay viewer: There are several osu replay viewers available, both online and offline. Some popular options include [insert names of popular replay viewers].
- Load the replay file: Simply load the replay file into the viewer, and you're good to go!
- Analyze and enjoy: Watch your replay, analyze your gameplay, and learn from your mistakes.
Popular osu Replay Viewers
Here are some popular osu replay viewers:
- osu! Replays: A simple and easy-to-use replay viewer that allows you to watch and analyze your replays.
- Replay Viewer: A feature-rich replay viewer that offers advanced analysis tools and features.
- Beatmap-specific replay viewers: Some beatmap creators have developed their own replay viewers, designed specifically for their maps.
Conclusion
An osu replay viewer is a powerful tool that allows you to relive your favorite osu! moments, analyze your gameplay, and improve your skills. Whether you're a seasoned pro or a casual player, using a replay viewer can enhance your osu! experience. So why not give it a try? Download a replay viewer, load up your favorite replay file, and relive the magic of osu!
Additional Tips and Resources
- For more information on osu replay viewers, check out the osu! forums or online communities.
- If you're interested in learning more about osu! gameplay and strategies, be sure to check out our other blog posts.
Developing a feature for an osu! replay viewer —whether you are contributing to the official client, a third-party tool like
, or building your own—involves enhancing the way players analyze and share their gameplay. Core Feature Ideas
Based on community discussions and current project gaps, here are several high-impact features you could develop:
Replay analyzer improvements · ppy osu · Discussion #31558 - GitHub
Mastering Your Gameplay: The Ultimate Guide to osu! Replay Viewers
An osu! replay viewer is an essential tool for any player looking to analyze their performance, share legendary plays, or catch cheaters in the act. While the standard game client offers basic playback, advanced third-party viewers provide features like frame-by-frame analysis, scrub bars, and even browser-based rendering. Core Features of Advanced Replay Viewers
Standard osu! replays are stored as .osr files which contain metadata like hit counts and time-series data of cursor movements and keypresses. Modern viewers expand on this data to offer:
Detailed Analysis: Tools like Rewind allow for pixel-perfect aim analysis to see exactly where you over-aimed or under-aimed.
Enhanced Playback: Unlike the stable client, advanced viewers often include a scrub bar to jump to any part of the song and the ability to change playback speed from 0.25x to 4.0x.
Visual Customization: Many viewers let you instantly swap skins or toggle visual mods like "Hidden" during playback to better see what happened during a play. Top osu! Replay Viewer Tools Playback control : Pause, rewind, and fast-forward through
Depending on whether you want deep analysis or just a quick way to share a video, different tools excel: Replay · wiki - Gameplay - osu!
If you're looking to build or suggest a new feature for an osu! replay viewer, here are a few ideas ranging from simple quality-of-life tweaks to advanced analysis tools. 1. Advanced Hit-Error Analysis
While standard replays show a basic hit-error bar, a dedicated viewer could include:
Heatmaps: Visualize where on the screen a player consistently over-aims or under-aims.
Unstable Rate (UR) Breakdown: Show how UR fluctuates during specific sections of a song to identify where a player loses focus or stamina.
Keypress Statistics: A graph showing how long keys were held (hold time distribution) and the exact millisecond offsets for every tap. 2. "Ghost" Comparison Mode This feature would allow users to:
Overlay Multiple Replays: Watch two different replays (e.g., your personal best vs. a pro's play) simultaneously to see differences in cursor movement and timing.
Difference Tracker: Highlight moments where the two replays diverge most in terms of positioning or accuracy. 3. Integrated Editing & Snipping Instead of watching the whole replay, add tools to:
Replay Snipping: Trim the .osr file to only include a specific "god module" or a fail point, then save that segment as a new, smaller replay file.
Scrubbing & Bookmarking: A progress bar that lets you jump to any timestamp instantly, with automatic bookmarks at points where "Misses" or "Slider Breaks" occurred. 4. Direct Video Rendering
Building on tools like o!rdr or osr2mp4, a viewer could feature:
One-Click Export: Convert a replay directly to an .mp4 file with custom skin support and quality settings without needing to open the game.
Cinematic Camera: An option to "smooth" cursor movement or hide the UI for cleaner social media clips. 5. Cheat Detection & Verification (For Admins/Tournaments)
For community moderators, a specialized viewer could include:
Frame-by-Frame Inspection: View the raw data (time, X/Y coordinates, keys pressed) in a table format for every single frame.
Similarity Check: Automatically compare a new replay against existing ones in a database to detect "replay stealing". Every osu! Player NEEDS This!
The Art of the Playback: The Role of the Replay Viewer in osu!
In the high-speed world of osu!, where players click, slide, and spin to the rhythm of frantic beats, the action often moves too fast for the human eye to fully process in real-time. This is where the osu! replay viewer becomes an essential bridge between raw gameplay and meaningful analysis. Far from being a simple recording feature, the replay viewer serves as a critical tool for self-improvement, community engagement, and the verification of elite-level skill. A Tool for Technical Mastery
For the competitive player, the replay viewer is a digital mirror. Because osu! requires millisecond precision, players often don't realize why they "missed" a note during the heat of a song. By watching a replay, a player can slow down the footage to identify specific mechanical flaws—perhaps their cursor arrived too early, or their tapping hand fell out of sync with a complex rhythm. This "VOD review" process is the cornerstone of moving from an intermediate level to the global rankings. Preservation and Community
Beyond personal growth, the replay viewer acts as the game’s historical archive. osu! is famous for its "god-tier" plays—moments where a human performs a feat that seems mathematically impossible. The ability to export and share these replay files (.osr) allows the community to celebrate these milestones. These files are the lifeblood of osu! YouTube channels and Twitch highlights, turning a solo rhythm game into a spectator sport. Without the viewer, the legendary performances of players like Shigetora or Mrekk would exist only as hearsay rather than documented history. Integrity and Fair Play
In a free-to-play online game, maintaining a level playing field is a constant battle. The replay viewer is a primary weapon in the community’s fight against cheating. Because the viewer tracks cursor movement frame-by-frame, "replay editors" and "anti-cheat specialists" can analyze the data for unnatural smoothness or pixel-perfect snaps that suggest the use of aimbots or macros. In this sense, the replay viewer isn't just a feature; it’s a safeguard for the game’s competitive integrity. Conclusion
The osu! replay viewer is more than a way to watch a cursor dance across a screen. It is a diagnostic lab for the dedicated, a cinema for the fans, and a courtroom for the skeptics. By capturing the fleeting movements of a high-speed performance, it ensures that every click is remembered and every achievement is earned.
To help me tailor this essay or provide more info, let me know: Is this for a school assignment or a blog post?
Should I include a section on third-party tools (like Danser or Rewind)?
Title: Design and Implementation of an OSU Replay Viewer
Abstract: OSU is a popular rhythm game with a vast online community, where players can record and share their gameplay replays. An OSU replay viewer is a tool that allows users to visualize and analyze these replays. This paper presents the design and implementation of an OSU replay viewer, which can playback, analyze, and visualize OSU game replays.
Introduction: OSU is a free-to-play rhythm game developed by Osu! Team, where players tap, slide, and spin to the beat of various songs. The game has a large online community, with millions of users worldwide. One of the key features of OSU is its replay system, which allows players to record and share their gameplay. However, the built-in replay viewer has limitations, and players often rely on third-party tools to analyze and visualize their replays. This paper aims to design and implement an OSU replay viewer that can playback, analyze, and visualize OSU game replays.
Related Work: Several OSU replay viewers and analysis tools exist, but they often lack features, have limited accuracy, or are no longer maintained. Some popular alternatives include:
- OSU Replay Analyzer: A web-based tool that analyzes replays and provides statistics on accuracy, score, and gameplay patterns.
- Osu!ReplayViewer: A desktop application that allows users to playback and analyze replays, but it is no longer maintained.
Design and Implementation: The proposed OSU replay viewer is built using C# and Windows Presentation Foundation (WPF). The tool consists of three main components:
- Replay Parser: This module reads and parses OSU replay files (.osr), extracting relevant data such as player input, game state, and timing information.
- Playback Engine: This module uses the parsed data to simulate the gameplay experience, rendering the replay on a graphical interface.
- Analysis and Visualization: This module provides features to analyze and visualize the replay data, including accuracy, score, and gameplay pattern analysis.
Features:
- Playback: Playback OSU replays with adjustable speed and accuracy.
- Accuracy Analysis: Display accuracy statistics, including overall accuracy, hit statistics, and error distribution.
- Score Analysis: Display score statistics, including total score, combo, and score breakdown.
- Gameplay Pattern Analysis: Visualize gameplay patterns, including tap, slide, and spin patterns.
- Heatmap Visualization: Display a heatmap of player accuracy and error distribution.
Implementation Details: The replay parser uses a custom-designed file format parser to extract data from OSU replay files. The playback engine utilizes WPF's graphics capabilities to render the replay on a graphical interface. The analysis and visualization module uses statistical algorithms and data visualization techniques to provide insights into the replay data.
Evaluation: The proposed OSU replay viewer was tested with a variety of OSU replays, demonstrating its ability to accurately playback and analyze gameplay data. User feedback and testing results show that the tool is effective in providing valuable insights into gameplay patterns and accuracy.
Conclusion: This paper presents the design and implementation of an OSU replay viewer, which provides a comprehensive tool for analyzing and visualizing OSU game replays. The proposed tool has the potential to benefit the OSU community by providing players with a deeper understanding of their gameplay and helping them improve their skills.
Future Work:
- Integration with OSU Community Platforms: Integrate the replay viewer with popular OSU community platforms, allowing users to easily share and analyze replays.
- Advanced Analysis Features: Develop more advanced analysis features, including machine learning-based accuracy prediction and personalized gameplay recommendations.
Please let me know if you want me to change or add anything! Benefits of Using an Osu Replay Viewer So,
Here is a possible BibTeX for this draft:
@miscosu-replay-viewer,
author = Your Name,
title = Design and Implementation of an OSU Replay Viewer,
year = 2023,
note = Draft,
In the rhythm game , an osu! replay viewer is a tool or feature used to watch, analyze, or render recorded gameplay stored in .osr files. While the standard game client has a built-in viewer, players often use third-party tools to overcome its limitations, such as the inability to rewind or perform deep aim analysis. Types of Replay Viewers 1. In-Game Viewers
Stable Client: The traditional way to watch replays. You can access local replays by pressing F2 on the ranking screen to save them, then finding them in your "Local Ranking" or the /Replays folder. It supports basic playback but lacks modern analysis features like a scrub bar.
osu!lazer: The next-generation client includes an improved replay watcher with a scrub bar and adjustable playback speeds, making it much easier to navigate through a play. 2. Specialized Analysis Tools
These programs are designed for players looking to improve their skill by identifying specific mistakes.
Replay analyzer improvements · ppy osu · Discussion #31558
Short description (1–2 lines)
A lightweight tool to play back osu! replays (.osr) with frame-by-frame controls, hit visualization, score/stats overlay, and basic analysis tools to help players review and improve their runs.
Target audience
- osu! players who want to review and improve their aim, timing, and combo management
- Content creators needing clips or visuals of plays
- Community moderators or mappers verifying replays
Option 4: Developer / "Side Project" Launch
Best for: If you built this viewer yourself and are releasing it.
Title: I built a lightweight osu! replay viewer for the community 🏸
Body: Hi r/osugame! I'm a developer and an osu! addict. I got frustrated with how heavy it was to just quickly check a replay file, so I spent the last few weeks building my own osu! Replay Viewer.
Features:
- Supports standard mode (considering adding Taiko/CtB soon!)
- Frame-by-frame stepping
- Support for custom skins (drag your skin folder in)
- Web-based / Desktop app (choose one)
It’s open source and free to use. I’d love some feedback on the UI and performance. Let me know if it breaks on any weird map mods!
[Download Link / Demo]
💡 Tips for engagement:
- Include Media: If you are posting on visual platforms, include a GIF or short video of the viewer scrubbing through a replay.
- Mention Mods: If the viewer supports hidden, double time, or relax (for checking illegitimate scores), mention that explicitly.
- Clarify "Web" vs "Desktop": Users like to know if they have to download something or if they can just use it in Chrome.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>osu! replay viewer · live visualization</title>
<style>
*
box-sizing: border-box;
user-select: none; /* smoother drag/scrub interactions */
body
background: linear-gradient(145deg, #0a0f1e 0%, #0c1222 100%);
font-family: 'Inter', 'Segoe UI', system-ui, -apple-system, 'Roboto', monospace;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
padding: 24px;
/* main card */
.viewer-container
max-width: 1300px;
width: 100%;
background: rgba(18, 25, 45, 0.75);
backdrop-filter: blur(2px);
border-radius: 2.5rem;
box-shadow: 0 25px 45px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.05);
padding: 1.5rem;
border: 1px solid rgba(255, 255, 255, 0.08);
/* header and replay info */
.header
display: flex;
justify-content: space-between;
align-items: baseline;
flex-wrap: wrap;
margin-bottom: 1.5rem;
gap: 1rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding-bottom: 0.75rem;
.title
font-size: 1.8rem;
font-weight: 700;
background: linear-gradient(135deg, #ff9a9e, #fad0c4, #fad0c4);
background-clip: text;
-webkit-background-clip: text;
color: transparent;
letter-spacing: -0.5px;
.badge
background: #1e2a3e;
padding: 6px 14px;
border-radius: 60px;
font-size: 0.8rem;
font-weight: 500;
color: #b9e6ff;
font-family: monospace;
border: 1px solid #2d4055;
/* two column layout */
.dashboard
display: flex;
flex-wrap: wrap;
gap: 1.8rem;
.visualization-panel
flex: 2;
min-width: 280px;
background: #0b111fcc;
border-radius: 1.8rem;
backdrop-filter: blur(4px);
padding: 1rem;
border: 1px solid rgba(255, 255, 255, 0.05);
.controls-panel
flex: 1.2;
min-width: 260px;
background: #0b111faa;
border-radius: 1.8rem;
padding: 1rem 1.2rem;
border: 1px solid rgba(255, 255, 255, 0.05);
display: flex;
flex-direction: column;
gap: 1.4rem;
canvas
display: block;
width: 100%;
background: #03060e;
border-radius: 1.5rem;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
cursor: crosshair;
#replayCanvas
width: 100%;
height: auto;
background: radial-gradient(circle at 30% 20%, #141e2c, #010101);
/* slider & time */
.scrub-area
margin-top: 1rem;
input[type="range"]
width: 100%;
height: 4px;
-webkit-appearance: none;
background: #2a3a55;
border-radius: 5px;
outline: none;
input[type="range"]:focus
outline: none;
input[type="range"]::-webkit-slider-thumb
-webkit-appearance: none;
width: 16px;
height: 16px;
background: #ffb347;
border-radius: 50%;
cursor: pointer;
box-shadow: 0 0 6px #ffaa33;
border: none;
.time-display
display: flex;
justify-content: space-between;
font-family: 'JetBrains Mono', monospace;
font-size: 0.85rem;
color: #bbd9ff;
margin-top: 8px;
.playback-buttons
display: flex;
gap: 12px;
justify-content: center;
margin: 12px 0 8px;
.playback-buttons button
background: #1f2a3e;
border: none;
color: white;
padding: 8px 18px;
border-radius: 40px;
font-weight: bold;
cursor: pointer;
transition: 0.1s linear;
font-family: inherit;
backdrop-filter: blur(4px);
box-shadow: 0 2px 6px rgba(0,0,0,0.3);
.playback-buttons button:hover
background: #ff884d;
transform: scale(0.97);
color: #0a0f1e;
.stats
background: #00000040;
border-radius: 1.2rem;
padding: 0.8rem;
font-size: 0.85rem;
font-family: monospace;
.stat-row
display: flex;
justify-content: space-between;
border-bottom: 1px dashed #2e405b;
padding: 5px 0;
.cursor-status
background: #111a28;
border-radius: 1rem;
padding: 0.8rem;
text-align: center;
.hit-circle
display: inline-block;
width: 12px;
height: 12px;
background: #ff4d6d;
border-radius: 50%;
margin-right: 8px;
box-shadow: 0 0 6px #ff4d6d;
.accuracy
font-size: 1.6rem;
font-weight: 800;
color: #c7f9cc;
kbd
background: #2c3e50;
border-radius: 6px;
padding: 2px 6px;
font-family: monospace;
font-size: 0.7rem;
footer
font-size: 0.7rem;
text-align: center;
margin-top: 1.2rem;
color: #5f7f9e;
.file-zone
background: #0f172ac9;
border-radius: 1.2rem;
padding: 0.7rem;
text-align: center;
border: 1px dashed #3e5a77;
cursor: pointer;
transition: 0.1s;
.file-zone:hover
background: #1a253f;
</style>
</head>
<body>
<div class="viewer-container">
<div class="header">
<span class="title">⌨️ osu! replay viewer · kinetic timeline</span>
<span class="badge">⚡ replay analyzer</span>
</div>
<div class="dashboard">
<!-- canvas visualization area -->
<div class="visualization-panel">
<canvas id="replayCanvas" width="800" height="500" style="width:100%; height:auto; aspect-ratio:800/500"></canvas>
<div class="scrub-area">
<input type="range" id="timelineSlider" min="0" max="100" step="0.1" value="0">
<div class="time-display">
<span>🎵 <span id="currentTimeLabel">0.00</span>s</span>
<span>⏱️ <span id="totalTimeLabel">0.00</span>s</span>
</div>
<div class="playback-buttons">
<button id="playPauseBtn">▶ PLAY</button>
<button id="resetBtn">⟳ RESET</button>
</div>
</div>
</div>
<!-- right panel: stats + replay data -->
<div class="controls-panel">
<div class="file-zone" id="fileUploadZone">
📂 LOAD REPLAY (.json / simulated)<br>
<small style="opacity:0.7">click or drag — demo included</small>
<input type="file" id="replayFileInput" accept=".json" style="display:none">
</div>
<div class="stats">
<div class="stat-row"><span>🎯 Clicks / hits</span><span id="totalHits">0</span></div>
<div class="stat-row"><span>✔️ Max combo (sim)</span><span id="maxCombo">0</span></div>
<div class="stat-row"><span>💥 Accuracy (est.)</span><span id="accuracyStat">0%</span></div>
<div class="stat-row"><span>🖱️ Cursor events</span><span id="cursorEventsCount">0</span></div>
</div>
<div class="cursor-status">
<div><span class="hit-circle"></span> <strong>实时光标轨迹 / 点击事件</strong></div>
<div style="font-size:0.75rem; margin-top:8px;" id="liveCoord">X: --- , Y: ---</div>
<div id="lastAction">⚡ 等待回放</div>
</div>
<div class="stats">
<div class="stat-row"><span>🎮 当前帧点击</span><span id="currentClickFlag">—</span></div>
<div class="stat-row"><span>⏲️ Replay 速率</span><span id="playbackRateDisplay">1.0x</span></div>
</div>
<div style="text-align: center; font-size:0.7rem;">
<kbd>◀</kbd> <kbd>▶</kbd> seek · <kbd>SPACE</kbd> play/pause
</div>
</div>
</div>
<footer>✨ 可视化 replay 关键帧 (光标轨迹 + 点击标记) — 支持自定义 JSON 格式: "replayData": [ "t": ms, "x": 0-800, "y": 0-500, "click": bool ], "durationMs": number 或使用内置范例</footer>
</div>
<script>
(function()
// ---------- canvas elements ----------
const canvas = document.getElementById('replayCanvas');
const ctx = canvas.getContext('2d');
// dimensions fixed to 800x500 (playfield style)
canvas.width = 800;
canvas.height = 500;
// replay data structures
let replayFrames = []; // each: timeMs, x, y, click
let totalDuration = 5000; // ms
let currentTime = 0; // ms
let animationId = null;
let isPlaying = false;
let lastTimestamp = 0;
// UI elements
const timelineSlider = document.getElementById('timelineSlider');
const currentTimeLabel = document.getElementById('currentTimeLabel');
const totalTimeLabel = document.getElementById('totalTimeLabel');
const playPauseBtn = document.getElementById('playPauseBtn');
const resetBtn = document.getElementById('resetBtn');
const totalHitsSpan = document.getElementById('totalHits');
const maxComboSpan = document.getElementById('maxCombo');
const accuracyStatSpan = document.getElementById('accuracyStat');
const cursorEventsCountSpan = document.getElementById('cursorEventsCount');
const liveCoordSpan = document.getElementById('liveCoord');
const lastActionSpan = document.getElementById('lastAction');
const currentClickFlagSpan = document.getElementById('currentClickFlag');
const playbackRateDisplay = document.getElementById('playbackRateDisplay');
// stats accumulators
let totalClicks = 0; // number of clicks in replay
let currentCombo = 0;
let maxComboReached = 0;
let hitAccuracyEstimate = 100; // dummy simulated w/ clicks vs time windows
// helper: update stats from replayFrames
function recomputeStats()
totalClicks = replayFrames.filter(f => f.click === true).length;
// For better simulation: accuracy based on clicking consistency? we simulate "perfect hit ratio" using click density.
// but for visual fun: we assume 95% baseline with a slight variance based on click frequency?
// For cleaner demo: each click is considered a "hit" and we calculate an estimated accuracy relative to beat density?
// better: mock accuracy = min(100, Math.floor(85 + (totalClicks / Math.max(1, replayFrames.length/5)) * 10));
let clickEvents = totalClicks;
let totalFrames = replayFrames.length;
let clickDensity = totalFrames ? (clickEvents / totalFrames) * 100 : 0;
let mockAcc = Math.min(99, Math.floor(78 + clickDensity * 0.4));
if (mockAcc > 98) mockAcc = 96 + (clickEvents % 3);
hitAccuracyEstimate = Math.min(100, Math.max(65, mockAcc));
accuracyStatSpan.innerText = hitAccuracyEstimate + "%";
// compute max combo: consecutive frames with click? but combo is based on hits in rhythm, we use consecutive clicks within time diff < 200ms as combo
let combo = 0;
let bestCombo = 0;
let lastClickTime = -1000;
for (let frame of replayFrames)
if (frame.click) (frame.timeMs - lastClickTime) <= 350)
combo++;
else
combo = 1;
if (combo > bestCombo) bestCombo = combo;
lastClickTime = frame.timeMs;
maxComboReached = bestCombo;
maxComboSpan.innerText = maxComboReached;
totalHitsSpan.innerText = totalClicks;
cursorEventsCountSpan.innerText = replayFrames.length;
// draw the entire scene based on current playback time
function drawVisualization()
if (!ctx) return;
ctx.clearRect(0, 0, canvas.width, canvas.height);
// background gradient
const grad = ctx.createLinearGradient(0, 0, 0, canvas.height);
grad.addColorStop(0, '#091222');
grad.addColorStop(1, '#03070f');
ctx.fillStyle = grad;
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Draw dotted grid (osu! style)
ctx.strokeStyle = '#2a3b55';
ctx.lineWidth = 0.5;
for (let i = 0; i < canvas.width; i += 40)
ctx.beginPath();
ctx.moveTo(i, 0);
ctx.lineTo(i, canvas.height);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(0, i);
ctx.lineTo(canvas.width, i);
ctx.stroke();
// draw all cursor trail (semi-transparent based on time)
for (let i = 0; i < replayFrames.length; i++)
const frame = replayFrames[i];
if (frame.timeMs > currentTime) continue;
const alpha = 0.25 + (frame.timeMs / totalDuration) * 0.3;
ctx.beginPath();
ctx.arc(frame.x, frame.y, 5, 0, Math.PI*2);
ctx.fillStyle = `rgba(100, 180, 255, $Math.min(0.5, alpha*0.7))`;
ctx.fill();
if (frame.click && frame.timeMs <= currentTime)
ctx.beginPath();
ctx.arc(frame.x, frame.y, 12, 0, Math.PI*2);
ctx.strokeStyle = '#ff6070';
ctx.lineWidth = 2.5;
ctx.stroke();
ctx.beginPath();
ctx.arc(frame.x, frame.y, 5, 0, Math.PI*2);
ctx.fillStyle = '#ff3366cc';
ctx.fill();
// find current interpolated cursor position
let curX = canvas.width/2, curY = canvas.height/2;
let isClickNow = false;
if (replayFrames.length > 0)
let prevFrame = null;
for (let i = 0; i < replayFrames.length; i++)
if (replayFrames[i].timeMs <= currentTime)
prevFrame = replayFrames[i];
else break;
let nextFrame = replayFrames.find(f => f.timeMs > currentTime);
if (prevFrame)
if (nextFrame)
const t = (currentTime - prevFrame.timeMs) / (nextFrame.timeMs - prevFrame.timeMs);
const clampT = Math.min(1, Math.max(0, t));
curX = prevFrame.x + (nextFrame.x - prevFrame.x) * clampT;
curY = prevFrame.y + (nextFrame.y - prevFrame.y) * clampT;
isClickNow = prevFrame.click && (currentTime - prevFrame.timeMs < 50) ? prevFrame.click : false;
if ((nextFrame.click && (nextFrame.timeMs - currentTime) < 30)) isClickNow = true;
else
curX = prevFrame.x;
curY = prevFrame.y;
isClickNow = prevFrame.click && (currentTime - prevFrame.timeMs) < 80;
// also check if any frame exact click within tiny window
const nearClick = replayFrames.find(f => Math.abs(f.timeMs - currentTime) < 45 && f.click);
if (nearClick) isClickNow = true;
// Draw cursor (follow poi)
ctx.shadowBlur = 10;
ctx.shadowColor = '#0af';
ctx.beginPath();
ctx.arc(curX, curY, 14, 0, Math.PI*2);
ctx.fillStyle = isClickNow ? '#ff4d6dc9' : '#ffffffcc';
ctx.fill();
ctx.beginPath();
ctx.arc(curX, curY, 6, 0, Math.PI*2);
ctx.fillStyle = '#ffffff';
ctx.fill();
ctx.beginPath();
ctx.arc(curX, curY, 3, 0, Math.PI*2);
ctx.fillStyle = '#ffaa55';
ctx.fill();
ctx.shadowBlur = 0;
// show click halo if actively clicking
if (isClickNow)
ctx.beginPath();
ctx.arc(curX, curY, 22, 0, Math.PI*2);
ctx.strokeStyle = '#ff8080';
ctx.lineWidth = 2;
ctx.stroke();
ctx.beginPath();
ctx.arc(curX, curY, 28, 0, Math.PI*2);
ctx.strokeStyle = '#ffa0a0';
ctx.lineWidth = 1;
ctx.stroke();
lastActionSpan.innerHTML = '🔴 CLICK!';
currentClickFlagSpan.innerHTML = '● HIT';
else
lastActionSpan.innerHTML = '⚡ cursor tracking';
currentClickFlagSpan.innerHTML = '○ idle';
liveCoordSpan.innerText = `X: $Math.floor(curX) , Y: $Math.floor(curY)`;
// Draw time progress arc on bottom right
const progress = currentTime / totalDuration;
ctx.font = "bold 14px 'JetBrains Mono'";
ctx.fillStyle = '#ccdeff';
ctx.shadowBlur = 0;
ctx.fillText(`⏵ $(currentTime/1000).toFixed(2)s`, canvas.width-90, 35);
// update slider & time labels
function syncUITime()
timelineSlider.value = (currentTime / totalDuration) * 100;
currentTimeLabel.innerText = (currentTime / 1000).toFixed(2);
totalTimeLabel.innerText = (totalDuration / 1000).toFixed(2);
drawVisualization();
// set current time and update UI, clamp
function setCurrentTime(ms)
currentTime = Math.min(totalDuration, Math.max(0, ms));
syncUITime();
// animation loop (requestAnimationFrame)
let lastFrameTime = 0;
function startAnimation()
if (animationId) cancelAnimationFrame(animationId);
function animate(now)
if (!isPlaying) return;
if (lastFrameTime === 0) lastFrameTime = now;
let delta = Math.min(100, now - lastFrameTime);
if (delta > 0)
let step = delta * 1.0; // 1x speed, can modify
let newTime = currentTime + step;
if (newTime >= totalDuration)
newTime = totalDuration;
setCurrentTime(newTime);
isPlaying = false;
playPauseBtn.innerHTML = '▶ PLAY';
cancelAnimationFrame(animationId);
animationId = null;
lastFrameTime = 0;
return;
setCurrentTime(newTime);
lastFrameTime = now;
animationId = requestAnimationFrame(animate);
lastFrameTime = 0;
animationId = requestAnimationFrame(animate);
function playReplay()
if (isPlaying) return;
if (currentTime >= totalDuration)
setCurrentTime(0);
isPlaying = true;
playPauseBtn.innerHTML = '⏸ PAUSE';
startAnimation();
function pauseReplay()
if (!isPlaying) return;
isPlaying = false;
if (animationId)
cancelAnimationFrame(animationId);
animationId = null;
playPauseBtn.innerHTML = '▶ PLAY';
function togglePlayPause()
if (isPlaying) pauseReplay();
else playReplay();
function resetReplay()
pauseReplay();
setCurrentTime(0);
function loadReplayData(framesArray, durationMs)
pauseReplay();
if (!framesArray
// generate built-in demo (smooth circular cursor + clicks)
function generateDemoReplay()
const frames = [];
const duration = 7800;
const steps = 220;
for (let i = 0; i <= steps; i++)
let t = (i / steps) * duration;
let angle = (t / duration) * Math.PI * 4;
let radius = 180;
let centerX = canvas.width/2, centerY = canvas.height/2;
let x = centerX + Math.sin(angle) * radius * (1 + Math.sin(t/700));
let y = centerY + Math.cos(angle * 1.3) * radius * 0.8;
x = Math.min(canvas.width-25, Math.max(25, x));
y = Math.min(canvas.height-30, Math.max(30, y));
let click = false;
if (Math.abs(t - 1200) < 60) click = true;
if (Math.abs(t - 2500) < 50) click = true;
if (Math.abs(t - 3800) < 60) click = true;
if (Math.abs(t - 4900) < 55) click = true;
if (Math.abs(t - 6100) < 70) click = true;
if (Math.abs(t - 7100) < 80) click = true;
frames.push( timeMs: t, x: Math.floor(x), y: Math.floor(y), click );
// extra smooth clicks
replayFrames = frames;
totalDuration = duration;
recomputeStats();
setCurrentTime(0);
syncUITime();
// handle uploaded JSON
function processUploadedJSON(jsonText)
try
const obj = JSON.parse(jsonText);
let frames = null;
let duration = null;
if (obj.replayData && Array.isArray(obj.replayData)) else if (Array.isArray(obj))
frames = obj;
duration = obj.length ? obj[obj.length-1].timeMs + 200 : 5000;
else
throw new Error("Format error, need replayData array with timeMs, x, y, click");
const validFrames = frames.filter(f => typeof f.timeMs === 'number' && typeof f.x === 'number' && typeof f.y === 'number');
if (validFrames.length === 0) throw new Error("no valid frames");
loadReplayData(validFrames, duration);
lastActionSpan.innerHTML = '📁 自定义 replay 已加载';
catch(e)
alert("Invalid JSON: " + e.message + " — using demo format");
generateDemoReplay();
// event binding
timelineSlider.addEventListener('input', (e) =>
if (isPlaying) pauseReplay();
const percent = parseFloat(e.target.value) / 100;
const newTime = percent * totalDuration;
setCurrentTime(newTime);
);
playPauseBtn.addEventListener('click', togglePlayPause);
resetBtn.addEventListener('click', resetReplay);
document.addEventListener('keydown', (e) =>
if (e.code === 'Space')
e.preventDefault();
togglePlayPause();
if (e.code === 'ArrowLeft')
e.preventDefault();
if (isPlaying) pauseReplay();
setCurrentTime(currentTime - 150);
if (e.code === 'ArrowRight')
e.preventDefault();
if (isPlaying) pauseReplay();
setCurrentTime(currentTime + 150);
);
const uploadZone = document.getElementById('fileUploadZone');
const fileInput = document.getElementById('replayFileInput');
uploadZone.addEventListener('click', () => fileInput.click());
fileInput.addEventListener('change', (e) =>
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = (ev) =>
processUploadedJSON(ev.target.result);
fileInput.value = '';
;
reader.readAsText(file);
);
// drag drop
uploadZone.addEventListener('dragover', (e) => e.preventDefault(); uploadZone.style.background = '#1f2e4a'; );
uploadZone.addEventListener('dragleave', () => uploadZone.style.background = ''; );
uploadZone.addEventListener('drop', (e) =>
e.preventDefault();
uploadZone.style.background = '';
const file = e.dataTransfer.files[0];
if(file && file.type === 'application/json')
const reader = new FileReader();
reader.onload = (ev) => processUploadedJSON(ev.target.result);
reader.readAsText(file);
else alert('drop JSON file plz');
);
// initial demo load
generateDemoReplay();
setCurrentTime(0);
playbackRateDisplay.innerText = "1.0x";
)();
</script>
</body>
</html>
The osu! replay viewer is a specialized tool used by the community to watch, analyze, and share gameplay outside of the standard osu! client. It typically handles .osr files, which store movement and timing data rather than actual video. 🕹️ Essential Tools & Features
The "replay viewer" ecosystem includes several distinct types of software:
In-Game Viewer: Standard replays can be viewed in the game by pressing F2 on the results screen to save (osu! wiki).
External Renderers: Tools like osu-replay-viewer on GitHub allow you to view and render replays into video files (MP4) using FFmpeg without launching the full game.
Web-Based Viewers: Platforms like osu!lazer or community projects (e.g., WebOsu) enable replay viewing directly in a browser using HTML5. 📂 How to Manage Replay Files
Replays are small because they only track input data, not video frames.
File Location: Local replays are stored as .osr files in your osu!/Data/r/ folder.
Sharing: You can send these .osr files to other players; they only need the corresponding beatmap to watch it in their client.
Failed Plays: You can watch a replay of a failed run by pressing F1 on the "Game Over" screen. 🛠️ Advanced Controls & Analysis
Newer versions of the game (especially osu!lazer) offer more granular control for improvement:
Playback Speed: Use W/S keys to speed up or slow down the replay.
Frame Seeking: Use A/D keys to jump forward or backward in time.
Object Tracking: Some external viewers allow you to see exact hit error (UR) and "slider-end" timing to see exactly where you lost accuracy. ⚠️ Common Troubleshooting
Missing Replays: If your local scores disappear, you can sometimes recover them by deleting scores.db in your installation folder and pressing F5 in-game to rebuild the database.
Skinning: Replays will always play back using your currently selected skin, regardless of what skin the original player used. If you tell me more, I can help you: Export a replay to a video format Find a specific tool for high-rank analysis Recover deleted replay data
Replay analyzer improvements · ppy osu · Discussion #31558 - GitHub
An osu! replay viewer is a tool or software that allows you to watch and analyze
(replay) files without necessarily being inside the standard game client. While osu! has a built-in Replay system
, external viewers are popular for rendering videos, analyzing performance, or sharing gameplay with friends who don't have the game installed. Common Types of Replay Viewers Circleguard - An osu! replay analysis program - GitHub
The Unspoken Poetry
What most outsiders miss is the art of the replay.
Watch a skilled osu!taiko player’s replay: the drum hits are metronomic, almost sterile. Watch an osu!mania player: a waterfall of perfect judgment text. But standard osu? That’s where the replay viewer becomes a dance.
You can tell a tablet player from a mouse player instantly—the tablet’s cursor hovers and re-positions with a “float”; the mouse player’s cursor has subtle drag acceleration. You can tell a nervous player from a relaxed one: small micro-shakes before a hard section. You can even tell if someone is enjoying the map—their cursor will linger an extra frame on a spinner, savoring the spin.
There’s a niche subculture of “replay visualizers” on YouTube. They strip the UI away, add motion blur, and present osu! replays like abstract performance art. One video, titled “Cookiezi - Freedom Dive [4D] LIVE 2013”, has 2 million views. It’s just a replay. But the comments read like poetry: “You can see him breathe here.” “This is what flow state looks like.”