docs: Convert AAC-STREAMING.md to org-mode format
- Replace AAC-STREAMING.md with AAC-STREAMING.org - Use proper org-mode syntax with headers, code blocks, and emphasis - Update status to 'COMPLETED - Production Ready' - Maintain all technical content and documentation structure - Follow org-mode conventions for better integration with Emacs workflow
This commit is contained in:
parent
88762d3bfc
commit
41d0e3ffc2
146
AAC-STREAMING.md
146
AAC-STREAMING.md
|
|
@ -1,146 +0,0 @@
|
||||||
# AAC Streaming Support
|
|
||||||
|
|
||||||
This branch adds AAC (Advanced Audio Coding) streaming support to Asteroid Radio, providing better audio quality at lower bitrates.
|
|
||||||
|
|
||||||
## Features Added
|
|
||||||
|
|
||||||
### 🎵 **Multiple Stream Formats**
|
|
||||||
- **AAC 96kbps** - High quality, efficient compression (recommended)
|
|
||||||
- **MP3 128kbps** - Standard quality, maximum compatibility
|
|
||||||
- **MP3 64kbps** - Low bandwidth option
|
|
||||||
|
|
||||||
### 🌐 **Web Interface Updates**
|
|
||||||
- **Stream quality selector** on both front page and player page
|
|
||||||
- **Dynamic stream switching** without page reload
|
|
||||||
- **AAC set as default** (recommended option)
|
|
||||||
|
|
||||||
### ⚙️ **Technical Implementation**
|
|
||||||
|
|
||||||
- **Liquidsoap real-time transcoding** from MP3 files to AAC
|
|
||||||
- **FDK-AAC encoder** via `%fdkaac()` function
|
|
||||||
- **Existing Docker image** `savonet/liquidsoap:792d8bf` already includes AAC support
|
|
||||||
|
|
||||||
## Stream URLs
|
|
||||||
|
|
||||||
When running, the following streams will be available:
|
|
||||||
|
|
||||||
```
|
|
||||||
High Quality AAC: http://localhost:8000/asteroid.aac
|
|
||||||
High Quality MP3: http://localhost:8000/asteroid.mp3
|
|
||||||
Low Quality MP3: http://localhost:8000/asteroid-low.mp3
|
|
||||||
```
|
|
||||||
|
|
||||||
## Benefits of AAC
|
|
||||||
|
|
||||||
### **Quality Comparison**
|
|
||||||
- 96kbps AAC ≈ 128kbps MP3 quality
|
|
||||||
- Better handling of complex audio (orchestral, electronic)
|
|
||||||
- More transparent compression (fewer artifacts)
|
|
||||||
|
|
||||||
### **Bandwidth Savings**
|
|
||||||
- **25% less bandwidth** than equivalent MP3 quality
|
|
||||||
- 96kbps AAC = 43.2 MB/hour per user (vs 57.6 MB/hour for 128kbps MP3)
|
|
||||||
- Significant cost savings for streaming infrastructure
|
|
||||||
|
|
||||||
### **Modern Standard**
|
|
||||||
- Used by Apple Music, YouTube, most streaming services
|
|
||||||
- Better mobile device support
|
|
||||||
- Future-proof codec choice
|
|
||||||
|
|
||||||
## Browser Support
|
|
||||||
|
|
||||||
AAC streaming is supported by all modern browsers:
|
|
||||||
- ✅ Chrome/Edge (native support)
|
|
||||||
- ✅ Firefox (native support)
|
|
||||||
- ✅ Safari (native support)
|
|
||||||
- ✅ Mobile browsers (iOS/Android)
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### **Liquidsoap Configuration**
|
|
||||||
The updated `asteroid-radio-docker.liq` now includes:
|
|
||||||
|
|
||||||
```liquidsoap
|
|
||||||
# AAC High Quality Stream (96kbps)
|
|
||||||
output.icecast(
|
|
||||||
%fdkaac(bitrate=96),
|
|
||||||
host="icecast",
|
|
||||||
port=8000,
|
|
||||||
password="H1tn31EhsyLrfRmo",
|
|
||||||
mount="asteroid.aac",
|
|
||||||
name="Asteroid Radio (AAC)",
|
|
||||||
description="Music for Hackers - High efficiency AAC stream",
|
|
||||||
genre="Electronic/Alternative",
|
|
||||||
url="http://localhost:8080/asteroid/",
|
|
||||||
public=true,
|
|
||||||
radio
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
### **Docker Configuration**
|
|
||||||
|
|
||||||
- Uses existing `savonet/liquidsoap:792d8bf` image (Liquidsoap 2.4.1+git)
|
|
||||||
- FDK-AAC encoder already included and supported
|
|
||||||
- No Docker image changes required
|
|
||||||
- Maintains full backward compatibility with existing MP3 streams
|
|
||||||
|
|
||||||
### **Web Interface Updates**
|
|
||||||
- Added stream quality selector with JavaScript switching
|
|
||||||
- Maintains playback state when changing quality
|
|
||||||
- AAC set as default recommended option
|
|
||||||
|
|
||||||
## CPU Impact
|
|
||||||
|
|
||||||
Real-time transcoding adds minimal CPU overhead:
|
|
||||||
- **MP3 encoding**: ~10% CPU per stream
|
|
||||||
- **AAC encoding**: ~15% CPU per stream
|
|
||||||
- **Total impact**: ~25% CPU for all three streams on Hetzner CPX21
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
To test the AAC streaming:
|
|
||||||
|
|
||||||
1. **Build and start containers:**
|
|
||||||
```bash
|
|
||||||
cd docker
|
|
||||||
docker compose build
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Verify streams are available:**
|
|
||||||
```bash
|
|
||||||
curl -I http://localhost:8000/asteroid.aac
|
|
||||||
curl -I http://localhost:8000/asteroid.mp3
|
|
||||||
curl -I http://localhost:8000/asteroid-low.mp3
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Test web interface:**
|
|
||||||
- Visit http://localhost:8080/asteroid/
|
|
||||||
- Try different quality options in the dropdown
|
|
||||||
- Verify smooth switching between formats
|
|
||||||
|
|
||||||
## Future Enhancements
|
|
||||||
|
|
||||||
- **Adaptive bitrate streaming** based on connection speed
|
|
||||||
- **FLAC streaming** for audiophile users (premium feature)
|
|
||||||
- **Opus codec support** for even better efficiency
|
|
||||||
- **User preference storage** for stream quality
|
|
||||||
|
|
||||||
## Bandwidth Calculations
|
|
||||||
|
|
||||||
### **Phase 0 MVP with AAC (10 concurrent users):**
|
|
||||||
```
|
|
||||||
AAC Primary (96kbps): 10 users × 43.2 MB/hour = 432 MB/hour
|
|
||||||
Daily: 432 MB × 24h = 10.4 GB/day
|
|
||||||
Monthly: ~312 GB/month (vs 414 GB with MP3 only)
|
|
||||||
|
|
||||||
Savings: 25% reduction in bandwidth costs
|
|
||||||
```
|
|
||||||
|
|
||||||
This makes the AAC implementation particularly valuable for the cost-conscious MVP approach outlined in the scaling roadmap.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Branch**: `feature/aac-streaming`
|
|
||||||
**Status**: Ready for testing
|
|
||||||
**Next**: Merge to main after validation
|
|
||||||
|
|
@ -0,0 +1,152 @@
|
||||||
|
#+TITLE: AAC Streaming Support
|
||||||
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
|
#+DATE: 2025-10-01
|
||||||
|
#+STARTUP: overview
|
||||||
|
|
||||||
|
* Overview
|
||||||
|
|
||||||
|
This branch adds AAC (Advanced Audio Coding) streaming support to Asteroid Radio, providing better audio quality at lower bitrates.
|
||||||
|
|
||||||
|
* Features Added
|
||||||
|
|
||||||
|
** 🎵 Multiple Stream Formats
|
||||||
|
- *AAC 96kbps* - High quality, efficient compression (recommended)
|
||||||
|
- *MP3 128kbps* - Standard quality, maximum compatibility
|
||||||
|
- *MP3 64kbps* - Low bandwidth option
|
||||||
|
|
||||||
|
** 🌐 Web Interface Updates
|
||||||
|
- *Stream quality selector* on both front page and player page
|
||||||
|
- *Dynamic stream switching* without page reload
|
||||||
|
- *AAC set as default* (recommended option)
|
||||||
|
|
||||||
|
** ⚙️ Technical Implementation
|
||||||
|
|
||||||
|
- *Liquidsoap real-time transcoding* from MP3 files to AAC
|
||||||
|
- *FDK-AAC encoder* via =%fdkaac()= function
|
||||||
|
- *Existing Docker image* =savonet/liquidsoap:792d8bf= already includes AAC support
|
||||||
|
|
||||||
|
* Stream URLs
|
||||||
|
|
||||||
|
When running, the following streams will be available:
|
||||||
|
|
||||||
|
#+BEGIN_EXAMPLE
|
||||||
|
High Quality AAC: http://localhost:8000/asteroid.aac
|
||||||
|
High Quality MP3: http://localhost:8000/asteroid.mp3
|
||||||
|
Low Quality MP3: http://localhost:8000/asteroid-low.mp3
|
||||||
|
#+END_EXAMPLE
|
||||||
|
|
||||||
|
* Benefits of AAC
|
||||||
|
|
||||||
|
** Quality Comparison
|
||||||
|
- 96kbps AAC ≈ 128kbps MP3 quality
|
||||||
|
- Better handling of complex audio (orchestral, electronic)
|
||||||
|
- More transparent compression (fewer artifacts)
|
||||||
|
|
||||||
|
** Bandwidth Savings
|
||||||
|
- *25% less bandwidth* than equivalent MP3 quality
|
||||||
|
- 96kbps AAC = 43.2 MB/hour per user (vs 57.6 MB/hour for 128kbps MP3)
|
||||||
|
- Significant cost savings for streaming infrastructure
|
||||||
|
|
||||||
|
** Modern Standard
|
||||||
|
- Used by Apple Music, YouTube, most streaming services
|
||||||
|
- Better mobile device support
|
||||||
|
- Future-proof codec choice
|
||||||
|
|
||||||
|
* Browser Support
|
||||||
|
|
||||||
|
AAC streaming is supported by all modern browsers:
|
||||||
|
- ✅ Chrome/Edge (native support)
|
||||||
|
- ✅ Firefox (native support)
|
||||||
|
- ✅ Safari (native support)
|
||||||
|
- ✅ Mobile browsers (iOS/Android)
|
||||||
|
|
||||||
|
* Technical Details
|
||||||
|
|
||||||
|
** Liquidsoap Configuration
|
||||||
|
|
||||||
|
The updated =asteroid-radio-docker.liq= now includes:
|
||||||
|
|
||||||
|
#+BEGIN_SRC liquidsoap
|
||||||
|
# AAC High Quality Stream (96kbps)
|
||||||
|
output.icecast(
|
||||||
|
%fdkaac(bitrate=96),
|
||||||
|
host="icecast",
|
||||||
|
port=8000,
|
||||||
|
password="H1tn31EhsyLrfRmo",
|
||||||
|
mount="asteroid.aac",
|
||||||
|
name="Asteroid Radio (AAC)",
|
||||||
|
description="Music for Hackers - High efficiency AAC stream",
|
||||||
|
genre="Electronic/Alternative",
|
||||||
|
url="http://localhost:8080/asteroid/",
|
||||||
|
public=true,
|
||||||
|
radio
|
||||||
|
)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** Docker Configuration
|
||||||
|
|
||||||
|
- Uses existing =savonet/liquidsoap:792d8bf= image (Liquidsoap 2.4.1+git)
|
||||||
|
- FDK-AAC encoder already included and supported
|
||||||
|
- No Docker image changes required
|
||||||
|
- Maintains full backward compatibility with existing MP3 streams
|
||||||
|
|
||||||
|
** Web Interface Updates
|
||||||
|
- Added stream quality selector with JavaScript switching
|
||||||
|
- Maintains playback state when changing quality
|
||||||
|
- AAC set as default recommended option
|
||||||
|
|
||||||
|
* CPU Impact
|
||||||
|
|
||||||
|
Real-time transcoding adds minimal CPU overhead:
|
||||||
|
- *MP3 encoding*: ~10% CPU per stream
|
||||||
|
- *AAC encoding*: ~15% CPU per stream
|
||||||
|
- *Total impact*: ~25% CPU for all three streams on Hetzner CPX21
|
||||||
|
|
||||||
|
* Testing
|
||||||
|
|
||||||
|
To test the AAC streaming:
|
||||||
|
|
||||||
|
** Build and start containers:
|
||||||
|
#+BEGIN_SRC bash
|
||||||
|
cd docker
|
||||||
|
docker compose build
|
||||||
|
docker compose up -d
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** Verify streams are available:
|
||||||
|
#+BEGIN_SRC bash
|
||||||
|
curl -I http://localhost:8000/asteroid.aac
|
||||||
|
curl -I http://localhost:8000/asteroid.mp3
|
||||||
|
curl -I http://localhost:8000/asteroid-low.mp3
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** Test web interface:
|
||||||
|
- Visit http://localhost:8080/asteroid/
|
||||||
|
- Try different quality options in the dropdown
|
||||||
|
- Verify smooth switching between formats
|
||||||
|
|
||||||
|
* Future Enhancements
|
||||||
|
|
||||||
|
- *Adaptive bitrate streaming* based on connection speed
|
||||||
|
- *FLAC streaming* for audiophile users (premium feature)
|
||||||
|
- *Opus codec support* for even better efficiency
|
||||||
|
- *User preference storage* for stream quality
|
||||||
|
|
||||||
|
* Bandwidth Calculations
|
||||||
|
|
||||||
|
** Phase 0 MVP with AAC (10 concurrent users):
|
||||||
|
#+BEGIN_EXAMPLE
|
||||||
|
AAC Primary (96kbps): 10 users × 43.2 MB/hour = 432 MB/hour
|
||||||
|
Daily: 432 MB × 24h = 10.4 GB/day
|
||||||
|
Monthly: ~312 GB/month (vs 414 GB with MP3 only)
|
||||||
|
|
||||||
|
Savings: 25% reduction in bandwidth costs
|
||||||
|
#+END_EXAMPLE
|
||||||
|
|
||||||
|
This makes the AAC implementation particularly valuable for the cost-conscious MVP approach outlined in the scaling roadmap.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Branch*: =feature/aac-streaming=
|
||||||
|
*Status*: COMPLETED - Production Ready
|
||||||
|
*Next*: Merge to main after validation
|
||||||
Loading…
Reference in New Issue