Determine the $Number of segments of a DASH Media from MPD file - php

How can I determine the $Number of segments of a DASH media if the MPD file doesn't have any segment URL's lists?
It only has a segment template tag, so I don't know how many segments the media associated to this MPD has.
Hereafter the MPD file:
<?xml version="1.0" encoding="UTF-8" ?>
<MPD profiles="urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" availabilityStartTime="2017-09-24T02:32:58Z" minimumUpdatePeriod="PT2.0S" minBufferTime="PT1S" timeShiftBufferDepth="PT2M" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd">
<Period start="PT0S">
<AdaptationSet mimeType="video/mp4" startWithSAP="1" segmentAlignment="true">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" />
<ContentProtection schemeIdUri="urn:uuid:5E629AF5-38DA-4063-8977-97FFBD9902D4">
<mas:MarlinContentIds xmlns:mas="marlin:mas:1-0:services:schemas:mpd" >
<mas:MarlinContentId>urn:marlin:kid:48e495a75aefaa2f22a8c15f8c564afa</mas:MarlinContentId>
</mas:MarlinContentIds>
</ContentProtection>
<SegmentTemplate timescale="10000000" presentationTimeOffset="311133404" duration="20000000" startNumber="1" media="$RepresentationID$_Segment-$Number$.m4v" initialization="$RepresentationID$_init.m4i" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_0_1600000" bandwidth="1600000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_1_2600000" bandwidth="2600000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_2_3900000" bandwidth="3900000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_3_4800000" bandwidth="4800000" />
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="ita" segmentAlignment="true">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" />
<ContentProtection schemeIdUri="urn:uuid:5E629AF5-38DA-4063-8977-97FFBD9902D4">
<mas:MarlinContentIds xmlns:mas="marlin:mas:1-0:services:schemas:mpd" >
<mas:MarlinContentId>urn:marlin:kid:48e495a75aefaa2f22a8c15f8c564afa
</mas:MarlinContentId>
</mas:MarlinContentIds>
</ContentProtection>
<SegmentTemplate timescale="10000000" presentationTimeOffset="311133404" duration="20000000" startNumber="1" media="$RepresentationID$_Segment-$Number$.m4a" initialization="$RepresentationID$_init.m4i" />
<Representation audioSamplingRate="48000" codecs="mp4a.40.5" id="Stream_4_96000" bandwidth="96000" />
</AdaptationSet>
</Period>
</MPD>
I have difficult to understand how the next segment $Number is calculated.

For live manifests, you have to calculate the approximate segment number based on the start time of the event, i.e. calculate the elapsed duration (time since the beginning of the event) till now (wall clock time - start time). Divide that by the fixed duration of each segment.
Because the startNumber=1, we can get the most recent segment number by calculating startNumber + (elapsedDur/segmentDur).
IMHO, this is nice way of keeping small manifest size. But this expects the DASH client to have its clock synchronized. Otherwise you will end up requesting segment numbers that do not exist (either too early or late). You will also run into a lot of 404s if the segments are not advertised yet.

Related

How to parse XML's <media:text type="html"> with PHP

I would be happy if there was someone who can tell me how to decode the following string from XML to PHP:
<media:text type="html">
<p>
<a href="foo.com">
<img src="foo.com/foo.jpg" align="left" alt="Foo title" title="Foo title" border="0" />
</a>
</p>
</media:text>
which is part of the following item:
<item>
<title>Foo title</title>
<description>Foo Description</description>
<link>foo.com</link>
<pubDate>Tue, 02 Feb 2021 18:23:51 EST</pubDate>
<media:content url="foo.com/foo.jpg" />
**<media:text type="html">
<p>
<a href="foo.com">
<img src="foo.com/foo.jpg" align="left" alt="Foo title" title="Foo title" border="0" />
</a>
</p>
</media:text>**
</item>
With the code portion
$ content = $ xml-> channel-> item [$ i] -> children ('media', True) -> content-> attributes ();
I can only value content but I can't extract
<media: text type = "html">
Thanks to those who can help me!
You can use the SimpleXMLElement function to parse your XML, you will receive an array which will be easily parsed.
See https://www.php.net/manual/fr/simplexml.examples-basic.php.

SimpleXMLElement Can't Find Node Attribute

One entry of the feed:-
<entry>
<id>tag:blogger.com,1999:blog-8729980629780635785.post-7267854162055446813</id>
<published>2015-08-12T10:51:00.000-04:00</published>
<updated>2015-08-12T10:51:07.914-04:00</updated>
<category scheme="http://www.blogger.com/atom/ns#" term="Cancer Prevention" />
<category scheme="http://www.blogger.com/atom/ns#" term="Cervical Cancer" />
<category scheme="http://www.blogger.com/atom/ns#" term="curcumin" />
<category scheme="http://www.blogger.com/atom/ns#" term="HPV" />
<category scheme="http://www.blogger.com/atom/ns#" term="Mouth Cancer" />
<category scheme="http://www.blogger.com/atom/ns#" term="STD" />
<category scheme="http://www.blogger.com/atom/ns#" term="Throat Cancer" />
<category scheme="http://www.blogger.com/atom/ns#" term="Tonsil Cancer" />
<category scheme="http://www.blogger.com/atom/ns#" term="turmeric" />
<title type="text">Curcumin May Prevent HPV-Related Cancers</title>
<content type="html"><h2>Maylin Rodriguez-Paez RN</h2><a href="http://3.bp.blogspot.com/-dPF4cftq7l8/VctX0J56YyI/AAAAAAAAEXo/yHPgb0E_Ha8/s1600/trun.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="167" src="http://3.bp.blogspot.com/-dPF4cftq7l8/VctX0J56YyI/AAAAAAAAEXo/yHPgb0E_Ha8/s1600/trun.jpg" width="320" /></a>HPV is the most common sexually transmitted disease in the United States. It infects at least fourteen million annually and most are unware of their infection status.<sup>1</sup><br /><br />For the most part, HPV does not cause any harm to the infected individual. However, in a minority of cases, HPV can lead to the development of mouth, throat, tonsil, and <a href="http://blog.lifeextension.com/2014/04/mushroom-extract-treat-cervical-cancer.html" target="_blank">cervical cancers</a>.<br /><br />Interestingly, a new study shows curcumin may offer help in combating the HPV virus and preventing HPV-induced cancers. The results were published in the online journal, <i>Ecancermedicalscience</i>. <br /><br /><h3>Curcumin Silences Cancer-Causing Genes </h3>Previous studies show curcumin combats multiple types of <a href="http://www.lifeextension.com//Magazine/2011/3/How-Curcumin-Protects-Against-Cancer/Page-01" target="_blank">cancers</a>. Benefits have been seen for cancers of the breast, prostate, pancreas, and colon.<br /><br />For the current study, oral cancer cells infected with the HPV virus were cultivated along with curcumin extract. According to the results of the study, curcumin suppressed the activity of transcription factors (proteins that control the activity of genes) needed for the cancer cells to develop.<sup>2</sup><br /><br />One transcription factor in particular, NF-kB, is known for being involved in cancer development. Curcumin was also shown to silence cancer-promoting genes (oncogenes) and caused HPV infected cells to undergo apoptosis (cell- suicide).<sup>2</sup><br /><br />HPV-related cancers (especially those developing in the throat and mouth) are growing within the United States. Prior research shows curcumin helps to clear the HPV virus from cervical tissue.<sup>3</sup><br /><br />Despite the results of this current study, more research is needed to confirm curcumin’s benefits against HPV-related cancers. <br /><br /><h3>How to Get More Curcumin in Your System</h3>Curcumin is an antioxidant found in the herb turmeric. It gives turmeric its characteristic yellow color.&nbsp; <br /><br />While adding turmeric to food is an excellent idea, it’s actually not the best way to obtain curcumin in your diet. Unfortunately, curcumin is poorly absorbed into the bloodstream.<br /><br />Fortunately, supplementing with a curcumin extract offers a way to increase curcumin levels in the blood. Look for preparations that contain <a href="http://www.lifeextension.com//Magazine/2014/2/Bio-Enhanced-TURMERIC-Compounds-Block-Multiple-Inflammatory-Pathways/Page-01" target="_blank">phospholipids </a>for optimal absorption. <br /><br /><h2>References:</h2><ol><li>Available at: <a href="http://www.cdc.gov/std/hpv/stdfact-hpv.htm">http://www.cdc.gov/std/hpv/stdfact-hpv.htm</a>. Accessed May 4<sup>th</sup>, 2015.&nbsp;</li><li><i>Ecancermedicalscience</i>. 2015 Apr 23;9:525.&nbsp;</li><li><i>Asian Pac J Cancer Prev</i>. 2013;14(10):5753-9.</li></ol><img src="http://feeds.feedburner.com/~r/LifeExtensionBlog/~4/BhZ_UDkx0gc" height="1" width="1" alt=""/></content>
<link rel="replies" type="application/atom+xml" href="http://blog.lifeextension.com/feeds/7267854162055446813/comments/default" title="Post Comments" />
<link rel="replies" type="text/html" href="http://blog.lifeextension.com/2015/08/curcumin-may-prevent-hpv-related-cancers.html#comment-form" title="0 Comments" />
<link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8729980629780635785/posts/default/7267854162055446813" />
<link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8729980629780635785/posts/default/7267854162055446813" />
<link rel="alternate" type="text/html" href="http://blog.lifeextension.com/2015/08/curcumin-may-prevent-hpv-related-cancers.html" title="Curcumin May Prevent HPV-Related Cancers" />
<author>
<name>LifeExtension</name>
<uri>http://www.blogger.com/profile/00252359139805937161</uri>
<email>noreply#blogger.com</email>
<gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" />
</author>
<media:thumbnail
xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-dPF4cftq7l8/VctX0J56YyI/AAAAAAAAEXo/yHPgb0E_Ha8/s72-c/trun.jpg" height="72" width="72" />
<thr:total>0</thr:total>
</entry>
Code:-
<?php
$url = 'http://feeds.feedburner.com/LifeExtensionBlog';
$XmlObject = new SimpleXmlElement( file_get_contents($url) );
foreach($XmlObject->entry as $entry) {
$content = (string) $entry->content[0];
$post_title = (string) $entry->title[0];
$tmp = $entry->xpath('media:thumbnail/#url');
var_dump($tmp);
$image_url = (string) $tmp;
echo 'THE IMAGE:' . $image_url . "<br><hr><br>";
echo $post_title . "<br>";
echo $content . "<br>";
}
Output:-
Warning: SimpleXMLElement::xpath(): Undefined namespace prefix in C:\wamp\www\test-4.php on line 20
Title and the content prints fine.

Xpath query in PHP to attribute from element with specific attribute value

I'm truly bending my head over something that should be way to simple. I have an XML feed with 25 entries in the root. I'm already iterating them as $entry in PHP.
Here is an example of one entry in the xml feed:
<entry>
<id>tag:blogger.com,1999:blog-7691515427771054332.post-4593968385603307594</id>
<published>2014-02-10T06:33:00.000-05:00</published>
<updated>2014-02-10T06:40:34.678-05:00</updated>
<category scheme="http://www.blogger.com/atom/ns#" term="Aurin" />
<category scheme="http://www.blogger.com/atom/ns#" term="fan art" />
<category scheme="http://www.blogger.com/atom/ns#" term="Fred-H" />
<category scheme="http://www.blogger.com/atom/ns#" term="spellslinger" />
<category scheme="http://www.blogger.com/atom/ns#" term="wildstar" />
<title type="text">Fan Art Showcase: She's gunnin' for trouble!</title>
<content type="html">Some random content</content>
<link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7691515427771054332/posts/default/4593968385603307594" />
<link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7691515427771054332/posts/default/4593968385603307594" />
<link rel="alternate" type="text/html" href="http://www.wildstarfans.net/2014/02/fan-art-showcase-shes-gunnin-for-trouble.html" title="Fan Art Showcase: She's gunnin' for trouble!" />
<author>
<name>Name Removed</name>
<uri>URL removed</uri>
<email>noreply#blogger.com</email>
<gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ow-dvUDbNxI/AAAAAAAAAAI/AAAAAAAABTY/MhrybgagMv0/s512-c/photo.jpg" />
</author>
<media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Ifp6awhDJuU/UWQEUl8nhUI/AAAAAAAABss/BSZ_YYM1U38/s72-c/fan-art-header.png" height="72" width="72" />
</entry>
I want to get the href of the third link with rel set to alternate. The alternate link isn't always the third one. I know how to do this through SimpleXML, but I want to get to know xpath for this, because through simpleXML it's more complicated and with this I hope I'm one step closer to understanding complex xpath queries.
The PHP I got that makes the most sense to me is:
$href = $entry->xpath('link[#rel="alternate"]/#href');
I tried multiple queries based on the information I found, but they all resulted in nothing. Here is a list of the queries I tried:
$href = $entry->xpath('link[#rel="alternate"]/#href/text()');
$href = $entry->xpath('link[#rel="alternate"]')->getAttributes()->href;
$href = $entry->xpath('*[#rel="alternate"]'); $href = $href['href'];
As it turns out from the chat conversation from my original question I had to register the namespace. In the end I used this website and the code turned out to be like this:
$feed = new DOMDocument();
$feed->load("http://www.wildstarfans.net/feeds/posts/default");
$xpath = new DOMXPath($feed);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
foreach ($xpath->evaluate('//atom:entry') as $entry) {
$href = $xpath->evaluate('string(atom:link[#rel="alternate"]/#href)', $entry);
}
Credits go to ThW and Wrikken. Wish I could give you guys SO points for this.
$href = $entry->xpath('link[#rel="alternate"]');
$href = (string) $href[0]->attributes()->href;

Flex - Retrieve and store variables from PHP

EDIT - Looks like you cannot parse data from PHP without going through XML. Using JSON will be the best way. Source
I'm very new to Flex been using it for 2.5 days. My Flex application accesses a PHP script that calculates two numbers. The script works as it is but I want to retrieve multiple variables from the PHP script so I can have an answer for not only addition but also multiplcation etc...
I hope I have made some sense....
Flex:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
title="Adding Numbers">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
<s:HTTPService id="srvCalc" url="http://192.168.0.3/flex/flex-phpexample/calc.php"
resultFormat="text"
method="POST">
<s:request xmlns="">
<number1>{txtNumber1.text}</number1>
<number2>{txtNumber2.text}</number2>
</s:request>
</s:HTTPService>
</fx:Declarations>
<fx:Script>
<![CDATA[
private function btnCalc_Click(event:MouseEvent):void
{
srvCalc.send();
}
]]>
</fx:Script>
<s:VGroup width="400" horizontalCenter="0" verticalCenter="0">
<s:Label id="txtAnswer" text="{srvCalc.lastResult}" />
<s:Label text="First Number:" />
<s:TextInput id="txtNumber1"
width="100%"/>
<s:Label text="Second Number:"/>
<s:TextInput id="txtNumber2"
width="100%"/>
<s:Button id="btnCalc"
label="Calculate"
click="btnCalc_Click(event)"/>
</s:VGroup>
</s:View>
PHP:
<?php
$number1 = $_POST['number1'];
$number2 = $_POST['number2'];
print($number1 + $number2);
?>
The easiest method would be to have php return a JSON encoded block and then use http://flexjson.sourceforge.net/ to decode it in flex. There are some other methods you can use, but this is the easiest and most structured way.

Storing the content of an xml child node based on a parent node's attribute in php

I'm trying to display the biggest image url returned from an xml result. So far the largest returned is 400 high so I hardcoded 400 in. If possible I would like to select just the largest in case in the future I get results that don't have a 400 height image in them.
I've tried
$x = file_get_contents($url);
$xml = simplexml_load_string($x);
$imageURL=$xml->categories->category->items->product->images->image[#height='400']->sourceURL;
Which gives me "syntax error, unexpected '=', expecting ']'".
And I also tried:
$imageURL= $xml->xpath("/categories/category/items/producct/images/image[#height='400']/sourceURL");
But got a bad link.
Here is the XML:
<images>
<image available="true" height="100" width="100">
<sourceURL>
Someurl.com
</sourceURL>
</image>
<image available="true" height="200" width="200">
<sourceURL>
Someurl.com
</sourceURL>
</image>
<image available="true" height="300" width="300">
<sourceURL>
Someurl.com
</sourceURL>
</image>
<image available="true" height="400" width="400">
<sourceURL>
Someurl.com
</sourceURL>
</image>
<image available="true" height="399" width="400">
<sourceURL>
Someurl.com
</sourceURL>
</image>
</images>
Any ideas?
->image[#height='400'] is a direct PHP array reference. This'd be interpreted as supressing errors (#) on a defined() constant (height), and trying to set its value via an assignment ='400'.
For your xpath version, remember that an xpath query returns a DOMNodeList, not an actual DOMElement. To get the URLs you need from the query results, you have to ierate over the node list:
$nodes = $xpath->query(...) {
foreach($nodes as $node) {
$url = $node->nodeValue;
}
Below code might help...
$xmlSQLProcedures = new DOMXPath($xmlSQLProcedures);
$strProcedureName = $xmlSQLProcedures->query("//SQLProcedure[#ID='$sSQLProcedureID']")->item(0)->nodeValue;
$nodeParameters = $xmlSQLProcedures->query("//SQLProcedure[#ID='$sSQLProcedureID']/Parameters/Parameter");
$ParamCount = $nodeParameters->length-1;
for ($i=0;$i<=$ParamCount;$i++) {
echo $nodeParameters->item($i)->getAttribute("Name").'<br>';
}
<?xml version="1.0" encoding="UTF-8"?>
<SQLProcedures>
<!-- ********** FOR KEYWORD IN LOCAL LANGUAGE ************* -->
<SQLProcedure ID="001070001">
<Name>P_ManipulateKeywordsInLL</Name>
<Parameters>
<Parameter Name="LanguageId"/>
<Parameter Name="KeywordId"/>
<Parameter Name="KeywordInLL"/>
<Parameter Name="ActionFor"/>
<Parameter Name="KeywordInLLId"/>
<Parameter Name="Keyword"/>
<Parameter Name="KeywordList"/>
<Parameter Name="SessionId"/>
<Parameter Name="WarehouseId"/>
</Parameters>
</SQLProcedure>
</SQLProcedures>

Categories