# Record from an online audio stream

**URL:** <https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385>\
**Category:** Signal and Image Processing\
**Tags:** question\
**Created:** [April 11, 2020, 11:09am UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385 "2020-04-11T11:09:16Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Martijn-R](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martijn-r/32/10335_2.png) [@Martijn-R](https://discourse.julialang.org/u/Martijn-R)\
**Post date:** [April 11, 2020, 11:09am UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/1 "2020-04-11T11:09:16Z")

</div>

I would like to record a few seconds of audio from an online .mp3 or .aac stream, for example from [http://ais.absoluteradio.co.uk/absoluteclassicrock.mp3](http://ais.absoluteradio.co.uk/absoluteclassicrock.mp3).

I tried several ways: from within a terminal window, with R and with Julia. None was successful so far. I guess the main issue is the fact that online streams do not have and ‘end’.

Perhaps someone here can help me out, as I am not too familiar with the Julia Audio packages. Any help is welcome, thanks in advance!

---

<div class="post-metadata">

**Author:** ![apieum](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/apieum/32/2928_2.png) [@apieum](https://discourse.julialang.org/u/apieum)\
**Post date:** [April 11, 2020, 3:02pm UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/2 "2020-04-11T15:02:20Z")

</div>

With Kaldi I’ve discovered pyaudio, I think it can do what you want:  
[https://stackoverflow.com/questions/32480393/pyaudio-recording-audio-from-streaming-python](https://stackoverflow.com/questions/32480393/pyaudio-recording-audio-from-streaming-python)

Le sam. 11 avr. 2020 à 13:14, Martijn via JuliaLang [julialang@discoursemail.com](mailto:julialang@discoursemail.com) a écrit :

---

<div class="post-metadata">

**Author:** ![baggepinnen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baggepinnen/32/693_2.png) [@baggepinnen](https://discourse.julialang.org/u/baggepinnen)\
**Post date:** [April 12, 2020, 2:26am UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/3 "2020-04-12T02:26:11Z")

</div>

Not sure if this helps, but you may check out

> **[GitHub - JuliaAudio/LibSndFile.jl: Julia Interface to libsndfile](https://github.com/JuliaAudio/LibSndFile.jl)**
>
> Julia Interface to libsndfile. Contribute to JuliaAudio/LibSndFile.jl development by creating an account on GitHub.

> **[GitHub - JuliaAudio/PortAudio.jl: PortAudio wrapper for the Julia programming...](https://github.com/JuliaAudio/PortAudio.jl)**
>
> PortAudio wrapper for the Julia programming language, compatible with the JuliaAudio family of packages - GitHub - JuliaAudio/PortAudio.jl: PortAudio wrapper for the Julia programming language, com...

@ssfrr might know more about streaming audio capture in Julia

---

<div class="post-metadata">

**Author:** ![Martijn-R](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martijn-r/32/10335_2.png) [@Martijn-R](https://discourse.julialang.org/u/Martijn-R)\
**Post date:** [April 12, 2020, 11:17pm UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/4 "2020-04-12T23:17:30Z")

</div>

Thanks @apieum and @baggepinnen,

I looked into PortAudio.jl and I can now sample from an analog input like my mic. Works very well.

Now I need to grab a few seconds of data from an online audio stream, i.e. already digitized. Unfortunately, MP3.jl doesn’t support reading from a stream as far as I know…

Thanks again.

---

<div class="post-metadata">

**Author:** ![apieum](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/apieum/32/2928_2.png) [@apieum](https://discourse.julialang.org/u/apieum)\
**Post date:** [April 13, 2020, 8:55am UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/5 "2020-04-13T08:55:16Z")

</div>

Have you tried with sockets to grab few seconds of data like pyaudio example ?  
This example was for julia 0.6, but it may still work: [How to read from socket in non-blocking mode - #6 by Keno](https://discourse.julialang.org/t/how-to-read-from-socket-in-non-blocking-mode/4710/6)  
Instead of `while !eof(socket)`  
You can use size of received data…

---

<div class="post-metadata">

**Author:** ![Martijn-R](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martijn-r/32/10335_2.png) [@Martijn-R](https://discourse.julialang.org/u/Martijn-R)\
**Post date:** [April 13, 2020, 10:41pm UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/6 "2020-04-13T22:41:45Z")

</div>

Hi @apieum,

Thanks for the link. I will try to do what was done in the pyaudio example, yes.

I also tried the code below using HTTP.jl, but is doesn’t read any bytes:

```julia
using HTTP
HTTP.open( "GET", "http://ais.absoluteradio.co.uk/absoluteclassicrock.mp3") do io

     cycles, totbytes = 0, 0
     while cycles < 100 

         bytes = readavailable( io)
         nbytes = length( bytes)

         cycles += 1; totbytes += nbytes

         println( "Cycles: $cycles; bytes read: $totbytes")
         if nbytes > 0
             println( bytes)
         end

     end

end

```

---

<div class="post-metadata">

**Author:** ![apieum](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/apieum/32/2928_2.png) [@apieum](https://discourse.julialang.org/u/apieum)\
**Post date:** [April 14, 2020, 3:26pm UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/8 "2020-04-14T15:26:00Z")

</div>

This is working fine:

```julia
using HTTP
HTTP.open("GET", "http://ais.absoluteradio.co.uk/absoluteclassicrock.mp3") do http
    n = Ref(0)
    r = startread(http)
    while !eof(http) && n[] < 1000
        bytes = read(http, 100)
        println("GET data: $bytes")
        n[]+=length(bytes)
    end
    @show n
end

```

---

<div class="post-metadata">

**Author:** ![Martijn-R](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martijn-r/32/10335_2.png) [@Martijn-R](https://discourse.julialang.org/u/Martijn-R)\
**Post date:** [April 14, 2020, 11:09pm UTC](https://discourse.julialang.org/t/record-from-an-online-audio-stream/37385/9 "2020-04-14T23:09:18Z")

</div>

Hi @apieum,

That is indeed working and looks very good 👍

This will help me forward. Merci beaucoupe pour votre aide!
