本文討論 Podcast 於行動裝置播放的關鍵挑戰:媒體格式相容性、章節分段機制、中斷事件管理,以及開源工具鏈的整合應用。
# 任意格式 → AMR (單聲道, 8kHz)
mencoder input.mp3 -of rawaudio -oac lavc -lavcopts acodec=amr_nb -o output.amr
# 分段:每段 50 秒
mencoder input.amr -ss 0 -endpos 50 -o part1.amr
mencoder input.amr -ss 50 -endpos 50 -o part2.amr
...
MEncoder 自動處理各段標頭,確保獨立可播放,伺服器無需即時運算。
// 狀態機
enum State { PLAYING, PAUSED, BUFFERING, ERROR }
void handleIncomingCall() {
if (state == PLAYING) {
player.stop(); // 暫停播放執行緒
downloader.suspend(); // 暫停下載執行緒
savedPosition = getCurrentChapterAndTime();
state = PAUSED;
}
}
void handleResume() {
if (state == PAUSED) {
seekTo(savedPosition); // 定位到章節+時間
player.start();
downloader.resume();
state = PLAYING;
}
}
預先 realize()/prefetch() 兩個 Player,播放完第一個收到 END_OF_MEDIA 立即啟動第二個,實現無縫切換。缺點:切換瞬間可能有「卡啪」雜訊,需靜音淡入淡出處理。
實務上,預處理 + 靜態 CDN 為最穩健架構;即時轉碼僅作備援或特殊需求。