This is the raw BXML that I'm sending, and I think it looks fine.
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<PlayAudio username="[REDACTED]" password="[REDACTED]">
https://voice.bandwidth.com/api/v2/accounts/[REDACTED]/calls/c-6a0d8e3e-a08bea47-fb75-40a0-a450-cd72e67c88c6/recordings/r-fbe17a78-e4e7ea0c-6692-446a-82a6-06e631a82877/media
</PlayAudio>
<Gather gatherUrl="http://abe582a0145b.ngrok.io/bandwidth/callback/redirect-to-voicemail-if-applicable" maxDigits="1">
<SpeakSentence>Would you like to re record? Press 1 if so, otherwise please hangup</SpeakSentence>
</Gather>
</Response>
Other important pieces of context:
I am able to access the media in chrome with the same username/password at that exact URL, so I know the media is accessible.
I'm using the recording_available_url hook, which bandwidth is triggering before I attempt to access the media.
Playing other media is fine (e.g. beep-01a.wav from this example works).
If I look up the metadata for the call I'm able to see: "Error processing media request".