Strream recorder is versioning files despite being set to 'append' mode

Hi all.

I’m having a problem recording a live stream. I want the recorder to append rather than version files when a new stream is received. Despite setting the ‘streamRecorderVersioningOption’ to ‘append’ this doesn’t seem to work.

This is is my application XML:

<?xml version="1.0" encoding="UTF-8"?>
<Root version="1">
	<Application>
		<Name>liverecord</Name>
		<AppType>Live</AppType>
		<Description></Description>
		<Connections>
			<AutoAccept>true</AutoAccept>
			<AllowDomains></AllowDomains>
		</Connections>
		<Streams>
			<StreamType>live-record</StreamType>
			<StorageDir>${com.wowza.wms.AppHome}/applications/liverecord</StorageDir>
			<LiveStreamPacketizers></LiveStreamPacketizers>
		</Streams>
		<Transcoder>
			<!-- To turn on transcoder set to: transcoder -->
			<LiveStreamTranscoder>transcoder</LiveStreamTranscoder>
			<!-- [templatename].xml or ${SourceStreamName}.xml -->
			<Templates>audioonly.xml</Templates>
			<ProfileDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/profiles</ProfileDir>
			<TemplateDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/templates</TemplateDir>
			<Properties>
			</Properties>
		</Transcoder>
		<SharedObjects>
			<StorageDir></StorageDir>
		</SharedObjects>
		<Client>
			<IdleFrequency>-1</IdleFrequency>
			<Access>
				<StreamReadAccess>*</StreamReadAccess>
				<StreamWriteAccess>*</StreamWriteAccess>
				<StreamAudioSampleAccess></StreamAudioSampleAccess>
				<StreamVideoSampleAccess></StreamVideoSampleAccess>
				<SharedObjectReadAccess>*</SharedObjectReadAccess>
				<SharedObjectWriteAccess>*</SharedObjectWriteAccess>
			</Access>
		</Client>
		<RTP>
			<!-- RTP/Authentication/Methods defined in Authentication.xml. Default setup includes; none, basic, digest -->
			<Authentication>
				<Method>digest</Method>
				<PlayMethod>block</PlayMethod>
			</Authentication>
			<!-- RTP/AVSyncMethod. Valid values are: senderreport, systemclock, rtptimecode -->
			<AVSyncMethod>senderreport</AVSyncMethod>
			<MaxRTCPWaitTime>12000</MaxRTCPWaitTime>
			<Properties>
			</Properties>
		</RTP>
		<LiveStreamPacketizer>
			<!-- Properties defined here will override any properties defined in conf/LiveStreamPacketizers.xml for any LiveStreamPacketizers loaded by this applications -->
			<Properties>
			</Properties>
		</LiveStreamPacketizer>
		<HTTPStreamer>
			<!-- Properties defined here will override any properties defined in conf/HTTPStreamers.xml for any HTTPStreamer loaded by this applications -->
			<Properties>
			</Properties>
		</HTTPStreamer>
		<MediaCaster>
			<RTP>
				<RTSP>
					<!-- udp, interleave -->
					<RTPTransportMode>interleave</RTPTransportMode>
				</RTSP>
			</RTP>
			<!-- Properties defined here will override any properties defined in conf/MediaCasters.xml for any MediaCasters loaded by this application -->
			<Properties>
			</Properties>
		</MediaCaster>
		<MediaReader>
			<Properties>
			</Properties>
		</MediaReader>
		<Modules>
			<Module>
				<Name>base</Name>
				<Description>Base</Description>
				<Class>com.wowza.wms.module.ModuleCore</Class>
			</Module>
			<Module>
				<Name>properties</Name>
				<Description>Properties</Description>
				<Class>com.wowza.wms.module.ModuleProperties</Class>
			</Module>
			<Module>
				<Name>logging</Name>
				<Description>Client Logging</Description>
				<Class>com.wowza.wms.module.ModuleClientLogging</Class>
			</Module>
			<Module>
				<Name>flvplayback</Name>
				<Description>FLVPlayback</Description>
				<Class>com.wowza.wms.module.ModuleFLVPlayback</Class>
			</Module>
			<Module>
				<Name>ModulePushPublish</Name>
				<Description>ModulePushPublish</Description>
				<Class>com.wowza.wms.pushpublish.module.ModulePushPublish</Class>
			</Module>
		</Modules>
		<Properties>
		</Properties>
		<TimedText>
			<Properties>
			</Properties>
			<VODTimedTextProviders></VODTimedTextProviders>
		</TimedText>
		<HTTPStreamers></HTTPStreamers>
		<StreamRecorder>
			<Properties>
				<Property>
					<Name>streamRecorderVersioningOption</Name>
					<Value>append</Value>
					<Type>String</Type>
				</Property>
			</Properties>
		</StreamRecorder>
	</Application>
</Root>

And this is the output I’m getting when restarting a ‘test’ stream a couple of times:

-rwxr--r-- 1 nobody nobody 1125544 Mar  4 12:39 test_aac_0.mp4
-rwxr--r-- 1 nobody nobody 1310054 Mar  4 12:39 test_0.mp4
-rwxr--r-- 1 nobody nobody 1619786 Mar  4 12:39 test_aac_1.mp4
-rwxr--r-- 1 nobody nobody 1882723 Mar  4 12:39 test_1.mp4
-rwxr--r-- 1 nobody nobody 1316703 Mar  4 12:40 test.mp4
-rwxr--r-- 1 nobody nobody 1089809 Mar  4 12:40 test_aac.mp4

I’m using Wowza Streaming Engine 4.0.1

Any idea what I’m doing wrong?

Thanks,

Henry

Also, I need to be able to change the name of the file that’s recorded from the default of the stream name. I’ll need to do this programmatically in an HTTP Provider I’m building. Can I do this in conjunction with a ‘live-record’ application, or do I have to use a ‘live’ application and handle the start/stop of the recording in code?

Hi there, this took some testing to figure out, but to append to the recorded file in Wowza 4.x thru the UI do the following:

1: Use a StreamType of “live”, leave “record all streams” unchecked.

2: In the Application Properties tab, under the “StreamRecorder Defaults” tab set the “streamRecorderVersioningOption” to “append” save and restart the application.

3: In the left side bar of the Engine Manger window, (with the live stream being published) choose “Incoming Streams” and select the incoming stream to record

4:Click on the red “record” button(circle) to see the recording options, click on the “Segmentation” tab to confirm that “Segmentation Option” is set to none, and “Versioning Option” is set to “Append to existing file”. Click record.

Salvadore

Henry, I will keep looking into this and let you know what I find out as soon as I have something for you.

Salvadore

I have not had a chance to set this up but I think it might be the solution for you:

How to start and stop live stream recordings programmatically (LiveStreamRecordAutoRecord example)

Salvadore

Okay Henry, I thought I had tried all these different options earlier today, but I must have missed this combination:

This configuration will achieve appending to existing file

A) You need a StreamType of “live-record”

B) You need to set the “streamRecordVersioningOption” to “append”

C) You need to add these properties to the Application/Streams Properties section in Application.xml like you described above.

<Property>
   <Name>versionFile</Name>
   <Value>false</Value>
   <Type>Boolean</Type>
</Property>
<Property>
  <Name>appendFile</Name>
  <Value>true</Value>
  <Type>Boolean</Type>
</Property> 

This may actually be a bug so I will submit a bug report to the support team and see what they make of this.

Salvadore

Henry, my last post outlines a working configuration for what you want to do.

Is this still not what you are trying to achieve?

Salvadore

Henry, I am glad you got this working, and sorry for the confusion. I will edit the post with the working configuration to be clear that it does work.

Thanks

Salvadore

Hi Salvadore.

Thanks for the investigation!

Alas this isn’t viable in our workflow though – I can’t manually start recording each stream. The streams need to be recorded automatically by the application, i.e. as soon as the application receives a stream. This is why I picked ‘live-record’.

Is this not possible in version 4.0.1?

Thanks,

Henry

Hi Salvadore.

Whilst I can do this programmatically, I’d rather not unless I really have to. We have a number of applications that make use of live-record on the assumption that append rather than versioning is supported. We typically use this when recording streams and wish to pause mid way through the record – in this case, we need to pick up where we left off in the same file.

This was possible in 3.6.4, the following config accomplished this:

                <Streams>
                        <StreamType>live-record</StreamType>
                        <StorageDir>${com.wowza.wms.AppHome}/applications/vodrecord</StorageDir>
                        <Properties>
                                <Property>
                                        <Name>versionFile</Name>
                                        <Value>false</Value>
                                        <Type>Boolean</Type>
                                </Property>
                                <Property>
                                        <Name>appendFile</Name>
                                        <Value>true</Value>
                                        <Type>Boolean</Type>
                                </Property>
                        </Properties>
                </Streams>

The fact that this is not achievable in 4.0.1 sounds more like a bug than a design decision. Could you confirm if this is the case please?

One other thing, please ignore my above comment about changing the name of the recorded file, I no longer need to do this. I just need an application that will record (and append) any stream sent to it.

Thanks,

Henry

Hi Salvadore.

Thanks for this.

Could you keep me in the loop as to the outcome please? We won’t be able to release our application until we have some resolution on this.

Thanks,

Henry

Hi Salvadore.

Sorry, I misunderstood your response! I thought you meant you tried those settings and they didn’t work. I’ve just tried them myself, i.e. the combination of the versionFile, appendFile and streamRecordVersioningOption properties, and that does indeed work.

Thanks for this!

Henry