
Recherche avancée
Médias (3)
-
Exemple de boutons d’action pour une collection collaborative
27 février 2013, par
Mis à jour : Mars 2013
Langue : français
Type : Image
-
Exemple de boutons d’action pour une collection personnelle
27 février 2013, par
Mis à jour : Février 2013
Langue : English
Type : Image
-
Collections - Formulaire de création rapide
19 février 2013, par
Mis à jour : Février 2013
Langue : français
Type : Image
Autres articles (45)
-
Multilang : améliorer l’interface pour les blocs multilingues
18 février 2011, parMultilang est un plugin supplémentaire qui n’est pas activé par défaut lors de l’initialisation de MediaSPIP.
Après son activation, une préconfiguration est mise en place automatiquement par MediaSPIP init permettant à la nouvelle fonctionnalité d’être automatiquement opérationnelle. Il n’est donc pas obligatoire de passer par une étape de configuration pour cela. -
Script d’installation automatique de MediaSPIP
25 avril 2011, parAfin de palier aux difficultés d’installation dues principalement aux dépendances logicielles coté serveur, un script d’installation "tout en un" en bash a été créé afin de faciliter cette étape sur un serveur doté d’une distribution Linux compatible.
Vous devez bénéficier d’un accès SSH à votre serveur et d’un compte "root" afin de l’utiliser, ce qui permettra d’installer les dépendances. Contactez votre hébergeur si vous ne disposez pas de cela.
La documentation de l’utilisation du script d’installation (...) -
Librairies et logiciels spécifiques aux médias
10 décembre 2010, parPour un fonctionnement correct et optimal, plusieurs choses sont à prendre en considération.
Il est important, après avoir installé apache2, mysql et php5, d’installer d’autres logiciels nécessaires dont les installations sont décrites dans les liens afférants. Un ensemble de librairies multimedias (x264, libtheora, libvpx) utilisées pour l’encodage et le décodage des vidéos et sons afin de supporter le plus grand nombre de fichiers possibles. Cf. : ce tutoriel ; FFMpeg avec le maximum de décodeurs et (...)
Sur d’autres sites (4822)
-
ffmpeg-mp4box-mpeg dash plays only few segments
30 octobre 2015, par IdrisNeed help in debugging the segment dash files
The input was an MP4 with these details. This was recorded from a video camera, the output from the camera was mkv and we converted into MP4 after editing the audio via adobe
- Size : 7.51 GB Frame rate : 25 frames/ second
- Data rate : 25326kbps
- Total bitrate : 25525kbps
Converted this to another mp4 with this command
ffmpeg -i "input.mp4" -s 1280x720 -c:v libx264 -b:v 750k -bf 2 -g 75 -sc_threshold 0 -an video_1280x720_750k.mp4
ffmpeg -i "input.mp4" -c:a aac -strict experimental -b:a 96k -ar 32000 -vn audio_96k.mp4The output video has
- fps : 25
- Data rate : 761kbps
- bitrate : 761kbps
Then, created the segmented dash through MP4Box
MP4Box -dash 10000 -frag 10000 -rap -segment-name video_0_1280000\segment_ video_1280x720_750k.mp4
MP4Box -dash 3000 -frag 10000 -rap -segment-name audio_0_96000\segment_ audio_96k.mp4The MPD generated was validated online and its perfect
UPDATE ! Included the MPD file
<?xml version="1.0"?>
<mpd xmlns="urn:mpeg:dash:schema:mpd:2011" minbuffertime="PT1.500S" type="static" mediapresentationduration="PT0H2M0.000S" maxsegmentduration="PT0H0M10.000S" profiles="urn:mpeg:dash:profile:full:2011">
<programinformation moreinformationurl="http://gpac.sourceforge.net">
</programinformation>
<period duration="PT0H2M0.000S">
<adaptationset segmentalignment="true" lang="eng">
<representation mimetype="audio/mp4" codecs="mp4a.40.2" audiosamplingrate="32000" startwithsap="1" bandwidth="98434">
<audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
<segmentlist timescale="32000" duration="319999">
<initialization sourceurl="audio_0_96000/segment_init.mp4"></initialization>
<segmenturl media="audio_0_96000/segment_1.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_2.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_3.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_4.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_5.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_6.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_7.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_8.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_9.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_10.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_11.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_12.m4s"></segmenturl>
<segmenturl media="audio_0_96000/segment_13.m4s"></segmenturl>
</segmentlist>
</representation>
</adaptationset>
<adaptationset segmentalignment="true" maxwidth="1280" maxheight="720" maxframerate="25" par="16:9" lang="eng">
<representation mimetype="video/mp4" codecs="avc3.64001f" width="1280" height="720" framerate="25" sar="1:1" startwithsap="1" bandwidth="764668">
<segmentlist timescale="12800" duration="125866">
<initialization sourceurl="video_0_1280000/segment_init.mp4"></initialization>
<segmenturl media="video_0_1280000/segment_1.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_2.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_3.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_4.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_5.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_6.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_7.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_8.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_9.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_10.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_11.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_12.m4s"></segmenturl>
<segmenturl media="video_0_1280000/segment_13.m4s"></segmenturl>
</segmentlist>
</representation>
</adaptationset>
</period>
</mpd>Played the video through dashjs.. I believe it just plays the initial segment and errors out as MEDIA_ERR_DECODE..MEDIA_ERR_SRC_NOT_SUPPORTED.. or some message which says start not found..
Through chrome debugging I see that atleast 4 segments are correctly loading.. I am not sure whats going on..
Any help in debugging the issue is really appreciated. I really can’t understand if this is a problem with the file or ffmpeg or mp4box or chrome.
Output from chrome debugging tool
[dash.js 1.5.1] new MediaPlayer instance has been created
dash.all.js:11 Playback initiated!
dash.all.js:11 Parsing complete: ( xml2json: 5ms, objectiron: 10ms, total: 0.015s)
dash.all.js:11 Manifest has been refreshed at Mon Oct 26 2015 10:19:22 GMT-0400 (Eastern Daylight Time)[1445869162092]
dash.all.js:11 SegmentTimeline detected using calculated Live Edge Time
dash.all.js:11 MediaSource is open!
dash.all.js:11 [object Event]
dash.all.js:11 Duration successfully set to: 120
dash.all.js:11 Added 0 inline events
dash.all.js:11 video codec: video/mp4;codecs="avc3.64001f"
dash.all.js:11 [video] stop
dash.all.js:11 audio codec: audio/mp4;codecs="mp4a.40.2"
dash.all.js:11 [audio] stop
dash.all.js:11 No text data.
dash.all.js:11 No fragmentedText data.
dash.all.js:11 No muxed data.
dash.all.js:11 [video] start
dash.all.js:11 [video] Getting the request for time: 0
dash.all.js:11 [video] Index for time 0 is 0
dash.all.js:11 [video] SegmentList: 0 / 120
dash.all.js:11 [audio] start
dash.all.js:11 [audio] Getting the request for time: 0
dash.all.js:11 [audio] Index for time 0 is 0
dash.all.js:11 [audio] SegmentList: 0 / 120
dash.all.js:11 [video] Getting the request for time: 9.83328125
dash.all.js:11 [video] Index for time 9.83328125 is 0
dash.all.js:11 [video] SegmentList: 0 / 120
dash.all.js:11 [video] SegmentList: 9.83328125 / 120
dash.all.js:11 [audio] Getting the request for time: 9.99996875
dash.all.js:11 [audio] Index for time 9.99996875 is 0
dash.all.js:11 [audio] SegmentList: 0 / 120
dash.all.js:11 [audio] SegmentList: 9.99996875 / 120
dash.all.js:11 loaded audio:Media Segment:0 (200, 20ms, 6ms)
dash.all.js:11 loaded video:Media Segment:0 (200, 153ms, 43ms)
dash.all.js:11 loaded video:Initialization Segment:NaN (200, 0ms, 32ms)
dash.all.js:11 [video] Initialization finished loading
dash.all.js:11 loaded audio:Initialization Segment:NaN (200, 0ms, 34ms)
dash.all.js:11 [audio] Initialization finished loading
dash.all.js:11 [video] Getting the request for time: 19.6665625
dash.all.js:11 [video] Index for time 19.6665625 is 1
dash.all.js:11 [video] SegmentList: 9.83328125 / 120
dash.all.js:11 [video] SegmentList: 19.6665625 / 120
dash.all.js:11 [audio] Getting the request for time: 19.9999375
dash.all.js:11 [audio] Index for time 19.9999375 is 1
dash.all.js:11 [audio] SegmentList: 9.99996875 / 120
dash.all.js:11 [audio] SegmentList: 19.9999375 / 120
dash.all.js:11 [video] Stalling Buffer
dash.all.js:11 [video] Waiting for more buffer before starting playback.
dash.all.js:11 [video] Getting the request for time: 0
dash.all.js:11 [video] Index for time 0 is 0
dash.all.js:11 [audio] Stalling Buffer
dash.all.js:11 [audio] Waiting for more buffer before starting playback.
dash.all.js:11 [audio] Getting the request for time: 0
dash.all.js:11 [audio] Index for time 0 is 0
dash.all.js:11 <video> loadedmetadata
dash.all.js:11 Starting playback at offset: 0
dash.all.js:11 [video] Getting the request for time: 29.499843750000004
dash.all.js:11 [video] Index for time 29.499843750000004 is 2
dash.all.js:11 [video] SegmentList: 19.6665625 / 120
dash.all.js:11 [video] SegmentList: 29.499843750000004 / 120
dash.all.js:11 [video] Got enough buffer to start.
dash.all.js:11 [video] seek: 0
dash.all.js:11 [audio] Getting the request for time: 29.999906250000002
dash.all.js:11 [audio] Index for time 29.999906250000002 is 2
dash.all.js:11 [audio] SegmentList: 19.9999375 / 120
dash.all.js:11 [audio] SegmentList: 29.999906250000002 / 120
dash.all.js:11 [audio] Got enough buffer to start.
dash.all.js:11 [audio] seek: 0
dash.all.js:11 loaded audio:Media Segment:9.99996875 (200, 67ms, 24ms)
dash.all.js:11 loaded video:Media Segment:9.83328125 (200, 71ms, 31ms)
dash.all.js:11 [audio] Buffered Range: 0.032 - 9.984
dash.all.js:11 [audio] Getting the request for time: 0
dash.all.js:11 [audio] Index for time 0 is 0
dash.all.js:11 Start Event Controller
dash.all.js:11 [audio] Buffered Range: 0.032 - 19.999968
dash.all.js:11 [audio] Getting the request for time: 0
dash.all.js:11 [audio] Index for time 0 is 0
dash.all.js:11 <video> play
dash.all.js:11 [video] start
dash.all.js:11 [video] Getting the request for time: 0
dash.all.js:11 [video] Index for time 0 is 0
dash.all.js:11 [video] SegmentList: 0 / 120
dash.all.js:11 [video] SegmentList: 9.83328125 / 120
dash.all.js:11 [video] SegmentList: 19.6665625 / 120
dash.all.js:11 [audio] start
dash.all.js:11 <video> playing
dash.all.js:11 [video] Buffered Range: 0 - 9
dash.all.js:11 [video] Getting the request for time: 0
dash.all.js:11 [video] Index for time 0 is 0
dash.all.js:11 Do seek: 0.032
dash.all.js:11 <video> seek
dash.all.js:11 [video] Getting the request for time: 29.499843750000004
dash.all.js:11 [video] Index for time 29.499843750000004 is 2
dash.all.js:11 [video] SegmentList: 19.6665625 / 120
dash.all.js:11 [video] SegmentList: 29.499843750000004 / 120
dash.all.js:11 [video] seek: 0.032
dash.all.js:11 [audio] seek: 0.032
dash.all.js:11 [video] Getting the request for time: 9
dash.all.js:11 [video] Index for time 9 is 0
dash.all.js:11 [video] SegmentList: 0 / 120
dash.all.js:11 [video] SegmentList: 9.83328125 / 120
dash.all.js:11 [video] SegmentList: 19.6665625 / 120
dash.all.js:11 [video] SegmentList: 29.499843750000004 / 120
dash.all.js:11 [video] Buffered Range: 0 - 18
dash.all.js:11 [video] Getting the request for time: 0
dash.all.js:11 [video] Index for time 0 is 0
dash.all.js:11 loaded video:Media Segment:19.6665625 (200, 42ms, 33ms)
dash.all.js:11 <video> seeked
dash.all.js:11 Start Event Controller
dash.all.js:11 <video> playing
dash.all.js:11 [video] Buffered Range: 0 - 28
dash.all.js:11 [video] Getting the request for time: 0
dash.all.js:11 [video] Index for time 0 is 0
dash.all.js:11 [audio] Getting the request for time: 19.999968
dash.all.js:11 [audio] Index for time 19.999968 is 1
dash.all.js:11 [audio] SegmentList: 9.99996875 / 120
dash.all.js:11 [audio] SegmentList: 19.9999375 / 120
dash.all.js:11 [audio] Getting the request for time: 29.999906250000002
dash.all.js:11 [audio] Index for time 29.999906250000002 is 2
dash.all.js:11 [audio] SegmentList: 19.9999375 / 120
dash.all.js:11 [audio] SegmentList: 29.999906250000002 / 120
dash.all.js:11 loaded audio:Media Segment:19.9999375 (200, 102ms, 2ms)
dash.all.js:11 [audio] Buffered Range: 0.032 - 29.983968
dash.all.js:11 [audio] Getting the request for time: 0
dash.all.js:11 [audio] Index for time 0 is 0
dash.all.js:11 loaded audio:Media Segment:29.999906250000002 (200, 26ms, 2ms)
dash.all.js:11 [audio] Buffered Range: 0.032 - 39.999968
dash.all.js:11 [audio] Getting the request for time: 0
dash.all.js:11 [audio] Index for time 0 is 0
dash.all.js:11 loaded video:Media Segment:29.499843750000004 (200, 47ms, 7ms)
dash.all.js:11 Video Element Error: MEDIA_ERR_DECODE
dash.all.js:11 [video] stop
dash.all.js:11 [audio] stop
dash.all.js:11 Video Element Error: MEDIA_ERR_SRC_NOT_SUPPORTED
dash.all.js:11 <video> play
</video></video></video></video></video></video></video> -
Decrypting fragmented mpeg-dash using ffmpeg
6 octobre 2022, par Sayem Prodhan AnantaI have an mpeg-dash which I want to decrypt. I have the CENC decryption key. But I am unable to get it working. The dash uses segment template. Here is the dash


<?xml version="1.0" ?>
<mpd mediapresentationduration="PT1H55M53.987S" minbuffertime="PT6.00S" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" xmlns="urn:mpeg:dash:schema:mpd:2011">
 
 <period>
 
 <adaptationset maxheight="720" maxwidth="1280" mimetype="video/mp4" segmentalignment="true" startwithsap="1">
 <accessibility schemeiduri="urn:scte:dash:cc:cea-608:2015" value="eng"></accessibility>
 <viewpoint schemeiduri="urn:mpeg:dash:role:2011" value="vp2"></viewpoint>
 
 <contentprotection schemeiduri="urn:mpeg:dash:mp4protection:2011" value="cenc"></contentprotection>
 
 <contentprotection schemeiduri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
 pAIAAAEAAQCaAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AOABoAFcAMwBQAEsAeABPAEkAYwB1AGsAVwBWAHgASwBaAHgAMgA3AEMAZwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBBAGQARgAvAFEAcwBzAHEATQBhAEEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAC4AcwBlAHIAdgBpAGMAZQAuAGUAeABwAHIAZQBzAHMAcABsAGEAeQAuAGMAbwBtAC8AcABsAGEAeQByAGUAYQBkAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==
 </contentprotection>
 
 <contentprotection schemeiduri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
 AAAAQ3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACMIARIQPLcV8k6syyGkWVxKZx27ChoKaW50ZXJ0cnVzdCIBKg==
 </contentprotection>
 <segmenttemplate duration="6000" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/seg-$Number$.m4s" startnumber="1" timescale="1000"></segmenttemplate>
 <representation bandwidth="634478" codecs="avc1.4D401F" framerate="2997/100" height="288" scantype="progressive" width="512"></representation>
 <representation bandwidth="789637" codecs="avc1.4D401F" framerate="2997/100" height="360" scantype="progressive" width="640"></representation>
 <representation bandwidth="1562569" codecs="avc1.4D401F" framerate="2997/100" height="432" scantype="progressive" width="768"></representation>
 <representation bandwidth="2124583" codecs="avc1.4D401F" framerate="2997/100" height="720" scantype="progressive" width="1280"></representation>
 </adaptationset>
 
 <adaptationset lang="en" mimetype="audio/mp4" segmentalignment="true" startwithsap="1">
 
 <contentprotection schemeiduri="urn:mpeg:dash:mp4protection:2011" value="cenc"></contentprotection>
 
 <contentprotection schemeiduri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
 pAIAAAEAAQCaAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AOABoAFcAMwBQAEsAeABPAEkAYwB1AGsAVwBWAHgASwBaAHgAMgA3AEMAZwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBBAGQARgAvAFEAcwBzAHEATQBhAEEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcAByAC4AcwBlAHIAdgBpAGMAZQAuAGUAeABwAHIAZQBzAHMAcABsAGEAeQAuAGMAbwBtAC8AcABsAGEAeQByAGUAYQBkAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==
 </contentprotection>
 
 <contentprotection schemeiduri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
 AAAAQ3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACMIARIQPLcV8k6syyGkWVxKZx27ChoKaW50ZXJ0cnVzdCIBKg==
 </contentprotection>
 <segmenttemplate duration="6000" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/seg-$Number$.m4s" startnumber="1" timescale="1000"></segmenttemplate>
 <representation audiosamplingrate="48000" bandwidth="136225" codecs="mp4a.40.2">
 <audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
 </representation>
 </adaptationset>
 </period>
</mpd>



I have produced an mp4 file by combining all the segments like this


init.mp4+seg-1.m4s+seg-2.m4s+....+seg-1159.m4s



But I end up with following error


ffmpeg version N-99631-g9018257751-anan5a-2020-10-19 Copyright (c) 2000-2020 the FFmpeg developers
 built with gcc 8 (Debian 8.3.0-6)
 configuration: --extra-version=anan5a-2020-10-19 --enable-gpl --enable-version3 --disable-shared --enable-static --enable-small --enable-avisynth --enable-chromaprint --enable-frei0r --enable-gmp --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-librtmp --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtesseract --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libxml2 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-openal --enable-opencl --enable-opengl --enable-libdrm --enable-nonfree --enable-libfdk-aac --enable-libbluray --enable-libzimg --enable-libsvtav1
 libavutil 56. 60.100 / 56. 60.100
 libavcodec 58.111.101 / 58.111.101
 libavformat 58. 62.100 / 58. 62.100
 libavdevice 58. 11.102 / 58. 11.102
 libavfilter 7. 87.100 / 7. 87.100
 libswscale 5. 8.100 / 5. 8.100
 libswresample 3. 8.100 / 3. 8.100
 libpostproc 55. 8.100 / 55. 8.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x557789b49300] Incorrect number of samples in encryption info
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x557789b49300] Could not find codec parameters for stream 0 (Video: h264 (avc1 / 0x31637661), none, 512x288, 616 kb/s): unspecified pixel format
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../videos/enc.0a7bd4e9ec72b6e0-5549.mkv':
 Metadata:
 major_brand : isom
 minor_version : 512
 compatible_brands: isomiso2avc1mp41iso5iso6
 Duration: 01:55:47.95, bitrate: 625 kb/s
 Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), none, 512x288, 616 kb/s, SAR 1:1 DAR 16:9, 29.97 fps, 11988 tbr, 11988 tbn, 23976 tbc (default)
 Metadata:
 handler_name : Bento4 Video Handler
 Side data:
 unknown side data type 24 (779 bytes)
Output #0, matroska, to '../videos/dec.0a7bd4e9ec72b6e0-5549.mkv':
 Metadata:
 major_brand : isom
 minor_version : 512
 compatible_brands: isomiso2avc1mp41iso5iso6
 encoder : Lavf58.62.100
 Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), none, 512x288 [SAR 1:1 DAR 16:9], q=2-31, 616 kb/s, 29.97 fps, 11988 tbr, 1k tbn, 11988 tbc (default)
 Metadata:
 handler_name : Bento4 Video Handler
 Side data:
 unknown side data type 24 (779 bytes)
Stream mapping:
 Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x557789b49300] Incorrect number of samples in encryption info
../videos/enc.0a7bd4e9ec72b6e0-5549.mkv: Invalid data found when processing input
frame= 0 fps=0.0 q=-1.0 Lsize= 1kB time=00:00:00.00 bitrate=N/A speed= 0x 
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown



How can I achieve the decryption without error ??


-
Working on images asynchronously
To get my quota on buzzwords for the day we are going to look at using ZeroMQ and Imagick to create a simple asynchronous image processing system. Why asynchronous ? First of all, separating the image handling from a interactive PHP scripts allows us to scale the image processing separately from the web heads. For example we could do the image processing on separate servers, which have SSDs attached and more memory. In this example making the images available to all worker nodes is left to the reader.
Secondly, separating the image processing from a web script can provide more responsive experience to the user. This doesn’t necessarily mean faster, but let’s say in a multiple image upload scenario this method allows the user to do something else on the site while we process the images in the background. This can be beneficial especially in cases where users upload hundreds of images at a time. To achieve a simple distributed image processing infrastructure we are going to use ZeroMQ for communicating between different components and Imagick to work on the images.
The first part we are going to create is a simple “Worker” -process skeleton. Naturally for a live environment you would like to have more error handling and possibly use pcntl for process control, but for the sake of brewity the example is barebones :
-
< ?php
-
-
define (’THUMBNAIL_ADDR’, ’tcp ://127.0.0.1:5000’) ;
-
define (’COLLECTOR_ADDR’, ’tcp ://127.0.0.1:5001’) ;
-
-
class Worker {
-
-
private $in ;
-
private $out ;
-
-
public function __construct ($in_addr, $out_addr)
-
{
-
$context = new ZMQContext () ;
-
-
$this->in = new ZMQSocket ($context, ZMQ: :SOCKET_PULL) ;
-
$this->in->bind ($in_addr) ;
-
-
$this->out = new ZMQSocket ($context, ZMQ: :SOCKET_PUSH) ;
-
$this->out->connect ($out_addr) ;
-
}
-
-
public function work () {
-
while ($command = $this->in->recvMulti ()) {
-
if (isset ($this->commands [$command [0]])) {
-
echo "Received work" . PHP_EOL ;
-
-
$callback = $this->commands [$command [0]] ;
-
-
array_shift ($command) ;
-
$response = call_user_func_array ($callback, $command) ;
-
-
if (is_array ($response))
-
$this->out->sendMulti ($response) ;
-
else
-
$this->out->send ($response) ;
-
}
-
else {
-
error_log ("There is no registered worker for $command [0]") ;
-
}
-
}
-
}
-
-
public function register ($command, $callback)
-
{
-
$this->commands [$command] = $callback ;
-
}
-
}
-
?>
The Worker class allows us to register commands with callbacks associated with them. In our case the Worker class doesn’t actually care or know about the parameters being passed to the actual callback, it just blindly passes them on. We are using two separate sockets in this example, one for incoming work requests and one for passing the results onwards. This allows us to create a simple pipeline by adding more workers in the mix. For example we could first have a watermark worker, which takes the original image and composites a watermark on it, passes the file onwards to thumbnail worker, which then creates different sizes of thumbnails and passes the final results to event collector.
The next part we are going to create a is a simple worker script that does the actual thumbnailing of the images :
-
< ?php
-
include __DIR__ . ’/common.php’ ;
-
-
// Create worker class and bind the inbound address to ’THUMBNAIL_ADDR’ and connect outbound to ’COLLECTOR_ADDR’
-
$worker = new Worker (THUMBNAIL_ADDR, COLLECTOR_ADDR) ;
-
-
// Register our thumbnail callback, nothing special here
-
$worker->register (’thumbnail’, function ($filename, $width, $height) {
-
$info = pathinfo ($filename) ;
-
-
$out = sprintf ("%s/%s_%dx%d.%s",
-
$info [’dirname’],
-
$info [’filename’],
-
$width,
-
$height,
-
$info [’extension’]) ;
-
-
$status = 1 ;
-
$message = ’’ ;
-
-
try {
-
$im = new Imagick ($filename) ;
-
$im->thumbnailImage ($width, $height) ;
-
$im->writeImage ($out) ;
-
}
-
catch (Exception $e) {
-
$status = 0 ;
-
$message = $e->getMessage () ;
-
}
-
-
return array (
-
’status’ => $status,
-
’filename’ => $filename,
-
’thumbnail’ => $out,
-
’message’ => $message,
-
) ;
-
}) ;
-
-
// Run the worker, will block
-
echo "Running thumbnail worker.." . PHP_EOL ;
-
$worker->work () ;
As you can see from the code the thumbnail worker registers a callback for ‘thumbnail’ command. The callback does the thumbnailing based on input and returns the status, original filename and the thumbnail filename. We have connected our Workers “outbound” socket to event collector, which will receive the results from the thumbnail worker and do something with them. What the “something” is depends on you. For example you could push the response into a websocket to show immediate feeedback to the user or store the results into a database.
Our example event collector will just do a var_dump on every event it receives from the thumbnailer :
-
< ?php
-
include __DIR__ . ’/common.php’ ;
-
-
$socket = new ZMQSocket (new ZMQContext (), ZMQ: :SOCKET_PULL) ;
-
$socket->bind (COLLECTOR_ADDR) ;
-
-
echo "Waiting for events.." . PHP_EOL ;
-
while (($message = $socket->recvMulti ())) {
-
var_dump ($message) ;
-
}
-
?>
The final piece of the puzzle is the client that pumps messages into the pipeline. The client connects to the thumbnail worker, passes on filename and desired dimensions :
-
< ?php
-
include __DIR__ . ’/common.php’ ;
-
-
$socket = new ZMQSocket (new ZMQContext (), ZMQ: :SOCKET_PUSH) ;
-
$socket->connect (THUMBNAIL_ADDR) ;
-
-
$socket->sendMulti (
-
array (
-
’thumbnail’,
-
realpath (’./test.jpg’),
-
50,
-
50,
-
)
-
) ;
-
echo "Sent request" . PHP_EOL ;
-
?>
After this our processing pipeline will look like this :
Now, if we notice that thumbnail workers or the event collectors can’t keep up with the rate of images we are pushing through we can start scaling the pipeline by adding more processes on each layer. ZeroMQ PUSH socket will automatically round-robin between all connected nodes, which makes adding more workers and event collectors simple. After adding more workers our pipeline will look like this :
Using ZeroMQ also allows us to create more flexible architectures by adding forwarding devices in the middle, adding request-reply workers etc. So, the last thing to do is to run our pipeline and see the results :
Let’s create our test image first :
$ convert magick:rose test.jpg
From the command-line run the thumbnail script :
$ php thumbnail.php Running thumbnail worker..
In a separate terminal window run the event collector :
$ php collector.php Waiting for events..
And finally run the client to send the thumbnail request :
$ php client.php Sent request $
If everything went according to the plan you should now see the following output in the event collector window :
array(4) [0]=> string(1) "1" [1]=> string(56) "
/test.jpg" [2]=> string(62) " /test_50x50.jpg" [3]=> string(0) "" Happy hacking !
-