[Icecast-dev] Webm files written without duration in header

Roger H├ągensen rh_icecast at skuldwyrm.no
Thu May 2 10:03:41 UTC 2019


On 2019-05-01 11:58, Sytze Visser wrote:> I am streaming live with webm 
with ffmpeg to icecast 2.4.2. After the
 > stream ends, I am unable to determine the duration of the file using
 > ffprobe or mediainfo. Not sure but it seems that this has to do with
 > headers?
 >
 > Should icecast be writing the duration into the header or should this
 > somehow be passed from ffmpeg?
Do you mean the stream you sent to icecast or the stream listeners get 
from icecast?

If it's the user stream then no, as a listener may drop packets and any 
length would be incorrect, in this case it is the listeners player that 
should track duration played (received) and add this to the file header 
if the player allows archiving of live streams. For livestreams I think 
Icecast sets a length of -1 (but it could be 0, or no length at all).

If you use a stream capture tool then I'm sure there exists one that 
will write the duration header to a file. Have you tried using ffmpeg to 
capture the stream? Look at the manual, you should be able to make it 
write a duration to the header (if possible/supported by the file format)

 > The requirement is really to determine the duration of the streamed
 > event (i.e. not radio).
If you are using ffmpeg as the stream encoder then you should log the 
duration either prior to ffmpeg getting the audio or after ffmpeg 
encoding. There is no way for ffmpeg to magically add a length 
(duration) to the header (which may have been streamed an hour ago).

If you only want to track duration before streaming it "out", then 
encode and store the stream locally, then when it ends run a script to 
add/fix the header to have a duration then stream the file to icecast, 
this would mean the liveness of the stream would be delayed by the 
duration of it.

But I doubt you want to do this (why stream live otherwise right?)

I can't recall if you can get ffmpeg to trigger a script or executable 
when it quits or not, but you could (be it Windows or Linux) easily make 
a script that you call instead of ffmpeg directly, in the script you log 
the time before calling ffmepg and again after ffmpeg quits.
If you log as a datestamp you can simply subtract the start value from 
the end value to get duration. Do note that this may not match the 
actual duration of the archived stream (even if you archive it straight 
from ffmpeg), it could be off by a second for example.

You should also consider how to handle things in case ffmpeg crashes or 
looses the connection to icecast (something sure to happen if using 
public networks instead of a local LAN).

If a script you can "easily" restart ffmpeg and you can log the start 
and end time (you could maybe even detect a ffmpeg crash or quit and log 
a message).

I note you said "streamed event", are you using some form of broadcast 
software? In that case that should have it's own log for events, or you 
can set it to trigger a script at the start and end of events.


Regards,
Roger.

-- 
Unless specified otherwise, anything I write publicly is considered 
Public Domain (CC0). My opinions are my own unless specified otherwise.
Roger H├ągensen,
Freelancer, Norway.


More information about the Icecast-dev mailing list