My solution was to add the delay to the autoaudiosink. A nifty feature, cryptically called ts-offset:
$ gst-launch-1.0 souphttpsrc location=http://server:10000/ ! queue \
max-size-bytes=1000000000 max-size-buffers=0 max-size-time=0 ! \
decodebin ! autoaudiosink ts-offset=500000000
min-threshold-* weren't working for me.
The delay works. Disabling synchronisation also worked:
$ gst-launch-1.0 souphttpsrc location=http://server:10000/ ! \
decodebin ! autoaudiosink sync=false
For music, like what I am using it for, the synchronisation didn't really matter, except that it's nice having the next song come on sooner than later when changing tracks. So I still preferred the half second delay.
When disabling synchronisation, typically, the stream slowly goes out of sync. For a live stream, whose data is being generated in real time, the stream synchronisation can be maintained by asking the queue to dump extra data:
gst-launch-1.0 souphttpsrc location=http://server:10000/ ! \
queue max-size-bytes=65536 max-size-buffers=0 max-size-time=0 \
leaky=downstream ! decodebin ! autoaudiosink sync=false
This keeps the stream synchronised to within 64KiB of the time the data was first made available on the server. This ended up being my preferred solution, since I was streaming data that was being generated in real time by the sound card of a computer on the same wifi network. This is for live streams only. This will not work if the stream's data has been predetermined, in which case the entire stream will be downloaded as quickly as possible, resulting in the whole thing being played more or less in fast forward.