Phonon::MediaObject 在 `setCurrentSource(QIODevice*)` 時,會立即讀取設備數據以解析媒體格式、時長、編碼參數。若此時緩衝區為空或數據不完整(如僅有 MP3 幀頭),解析失敗,後續 `play()` 無聲無息。
| 方案 | 核心思路 | 優點 | 缺點 |
|---|---|---|---|
| 本地 HTTP 服務 + 範圍請求 | 嵌入 QtWebApp / Mongoose 微型 HTTP Server,客戶端 `setCurrentSource(QUrl("https://localhost:port/xxx.mp3"))` | 完美支持斷點續傳、拖動進度條;複用成熟 HTTP 協議 | 需處理端口衝突、跨平台編譯 |
| QMediaPlayer (Qt Multimedia) | 替換 Phonon,`setMedia(QMediaContent, QIODevice*)` 支持流式播放(Qt 5.6+) | 原生支持、無額外依賴 | 部分舊版本對 MP3 解碼器授權受限 |
| FFmpeg + SDL / OpenAL 自研 | 解碼線程填環形緩衝區,播放線程消費 | 完全可控、支持任意格式 | 開發量大、需處理音視頻同步 |
// 伪代碼
QTcpServer server;
server.listen(QHostAddress::LocalHost, 0);
connect(&server, &QTcpServer::newConnection, [&](){
QTcpSocket *client = server.nextPendingConnection();
connect(client, &QTcpSocket::readyRead, [&](){
// 解析 HTTP Range 頭,從文件對應偏移讀取並回應 206 Partial Content
});
});
// 客戶端
mediaObject.setCurrentSource(QUrl("https://127.0.0.1:port/123.mp3"));
mediaObject.play();
Phonon + QBuffer 走不通是架構使然。本地 HTTP Server 方案開發量最小、兼容性最好、支持求愛操作,是工程落地的首選。