Hello,
I’m using Wowza 3.5 and JWPlayer 6 and I’m trying to specify start and duration for on demand video (rtmp).
For that :
- I’m using an override for play method on a class who extends ModuleBase :
[PHP]
public void play(IClient client, RequestFunction function, AMFDataList params) throws MalformedURLException {
URL url = new URL(client.getPageUrl());
Map<String,String> urlParameters = getQueryMap(url.getQuery());
//Calcul de l’extrait au besoin.
double start = Double.parseDouble(urlParameters.get(“tcin”));
double duration = Double.parseDouble(urlParameters.get(“tcout”)) - start;
String streamName = params.getString(PARAM1);
IMediaStream stream =getStream(client, function);
//On réaffecte la durée du stream.
AMFDataList customDataList = new AMFDataList();
customDataList.add(“play”);
customDataList.add(0.0);
customDataList.add(“null”);
customDataList.add(streamName);
customDataList.add(new AMFDataItem(start)); // start value in milliseconds
customDataList.add(new AMFDataItem(duration)); //duration (-1 means play to the end). Value in milliseconds.
customDataList.add(new AMFDataItem(true)); //reset
invokePrevious(this, client, function, customDataList);
//Stockage de la durée de l’extrait dans les propriétés du stream pour l’extraire ensuite dans la classe MyMediaReaderMP4InjectMetadata
stream.getProperties().put(“overrideDuration”, duration/1000);
}
[/PHP]
- I’m using an override for getMetadata method on a class who extends MediaReaderH264 (and set its className in MediasReader.xml) :
[PHP]
public List getMetadata(){
List ret = super.getMetadata();
WMSLogger getLogger = WMSLoggerFactory.getLogger(null);
// Here the calculated duration stored by above is extracted.
// Note that the default duration is used if there is no duration property in the stream, so simple video streaming will work as usual
double overrideDuration = this.stream.getProperties().getPropertyDouble(“overrideDuration”, (double) this.duration / 1000); // Value in seconds.
getLogger.info("CIMUMediaReaderMP4InjectMetadata_overrideDuration: " + overrideDuration);
while(true){
if (ret == null)
break;
if (ret.size() <= 0)
break;
ByteBuffer packet = ret.get(0);
AMFDataList myMetadata = new AMFDataList(packet);
AMFDataMixedArray dataObj = (AMFDataMixedArray)myMetadata.get(1);
dataObj.put(“duration”, new AMFDataItem(overrideDuration)); // duration in seconds.
byte[] data = myMetadata.serialize();
ByteBuffer newPacket = ByteBuffer.wrap(data);
ret.set(0, newPacket);
break;
}
return ret;
}
[/PHP]
It’s approximately working, but i’m encountering a strange behavior :
I’m trying to extract 5 seconds from video @ 10seconds from beginning
=> I’m setting start value to 10000
=> I’m setting duration value to 5000
=> I’m setting overrideDuration value to 5000
From webInterface, when I play video, its duration is longer than 5 seconds (approximately 7 seconds) but value on JWPlayer is 5
=> JWPlayer slider is out of 0 - 5duration @ end of video
Screen :
Video are really longer than 5 seconds but duration was set to 5000 in play method.
Any ideas for that ?
Thanks for reading
Epoks