PHP wrapper around the mediainfo command
You should install mediainfo:
$ sudo apt-get install mediainfo$ brew install mediainfoTo use this library install it through Composer, run:
$ composer require mhor/php-mediainfo<?php
//...
use Mhor\MediaInfo\MediaInfo;
//...
$mediaInfo = new MediaInfo();
$mediaInfoContainer = $mediaInfo->getInfo('music.mp3');
//...$general = $mediaInfoContainer->getGeneral();$videos = $mediaInfoContainer->getVideos();
foreach ($videos as $video) {
    // ... do something
}$audios = $mediaInfoContainer->getAudios();
foreach ($audios as $audio) {
    // ... do something
}$subtitles = $mediaInfoContainer->getSubtitles();
foreach ($subtitles as $subtitle) {
    // ... do something
}$images = $mediaInfoContainer->getImages();
foreach ($images as $image) {
    // ... do something
}$menus = $mediaInfoContainer->getMenus();
foreach ($menus as $menu) {
    // ... do something
}<?php
require './vendor/autoload.php';
use Mhor\MediaInfo\MediaInfo;
$mediaInfo = new MediaInfo();
$mediaInfoContainer = $mediaInfo->getInfo('./SampleVideo_1280x720_5mb.mkv');
echo "Videos channel: \n";
echo "=======================\n";
foreach ($mediaInfoContainer->getVideos() as $video) {
    if ($video->has('format')) {
        echo 'format: '.(string)$video->get('format')."\n";
    }
    if ($video->has('height')) {
        echo 'height: '.$video->get('height')->getAbsoluteValue()."\n";
    }
    echo "\n---------------------\n";
}
echo "Audios channel: \n";
echo "=======================\n";
foreach ($mediaInfoContainer->getAudios() as $audio) {
    $availableInfo = $audio->list();
    foreach ($availableInfo as $key) {
        echo $audio->get($key);
    }
    echo "\n---------------------\n";
}By default, unknown type throw an error this, to avoid this behavior, you can do:
$mediaInfo = new MediaInfo();
$mediaInfo->setConfig('ignore_unknown_track_types', true);
$mediaInfoContainer = $mediaInfo->getInfo('music.mp3');
$others = $mediaInfoContainer->getOthers();
foreach ($others as $other) {
    // ... do something
}$informationArray = $general->get();Field Name are in lower case separated by "_"
$oneInformation = $general->get('count_of_audio_streams');Field Name are in lower case separated by "_"
if ($general->has('count_of_audio_streams')) {
    echo $general->get('count_of_audio_streams');
}$availableInfo = $general->list();
foreach ($availableInfo as $key) {
    echo $general->get($key);
}For field:
- cover_data
 
Cover type will be applied
For fields:
- duration
 - delay_relative_to_video
 - video0_delay
 - delay
 
Duration type will be applied
For fields:
- overall_bit_rate_mode
 - overall_bit_rate
 - bit_rate_mode
 - compression_mode
 - codec
 - format
 - kind_of_stream
 - writing_library
 - id
 - format_settings_sbr
 - channel_positions
 - default
 - forced
 - delay_origin
 - scan_type
 - interlacement
 - scan_type
 - frame_rate_mode
 - format_settings_cabac
 - unique_id
 
Mode type will be applied
For fields:
- channel_s
 - bit_rate
 - sampling_rate
 - bit_depth
 - width
 - nominal_bit_rate
 - format_settings_reframes
 - height
 - resolution
 - maximum_bit_rate
 
Rate type will be applied
For fields:
- frame_rate
 
FloatRate type will be applied
For fields:
- display_aspect_ratio
 - original_display_aspect_ratio
 
Ratio type will be applied
For fields:
- file_size
 - stream_size
 
Size type will be applied
- All date fields will be transformed into 
Datetimephp object 
$mediaInfo = new MediaInfo();
$mediaInfo->setConfig('command', '/usr/local/bin/mediainfo');
$mediaInfoContainer = $mediaInfo->getInfo('music.mp3');$mediaInfo = new MediaInfo();
$mediaInfo->setConfig('use_oldxml_mediainfo_output_format', false);
$mediaInfoContainer = $mediaInfo->getInfo('music.mp3');$mediaInfo = new MediaInfo();
$mediaInfoContainer = $mediaInfo->getInfo('http://example.org/music/test.mp3');$mediaInfo = new MediaInfo();
$mediaInfoContainer = $mediaInfo->getInfo('music.mp3');
$json = json_encode($mediaInfoContainer);
$array = $mediaInfoContainer->__toArray();
$xml = $mediaInfoContainer->__toXML();Download MediaInfo CLI from here. Extract zip-archive and place MediaInfo.exe somewhere. Use it:
$mediaInfo = new MediaInfo();
$mediaInfo->setConfig('command', 'C:\path\to\directory\MediaInfo.exe');
$mediaInfoContainer = $mediaInfo->getInfo('music.mp3');By default, MediaInfo tries to detect if a URL is already percent-encode and encodes the URL when it's not.
Setting the 'urlencode' config setting to true forces MediaInfo to encode the URL despite the presence of percentage signs in the URL.
This is for example required when using pre-signed URLs for AWS S3 objects.
$mediaInfo = new MediaInfo();
$mediaInfo->setConfig('urlencode', true);
$mediaInfoContainer = $mediaInfo->getInfo('https://demo.us-west-1.amazonaws.com/video.mp4?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ABC%2F123%2Fus-west-1%2Fs3%2Faws4_request&X-Amz-Date=20200721T114451Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Signature=123');This setting requires MediaInfo 20.03 minimum
Recent versions of MediaInfo don't include cover data by default, without passing an additional flag. To include any available cover data, set the 'include_cover_data' config setting to true. See the cover type for details on retrieving the base64 encoded image from cover_data.
Originally this cover data was always included in the MediaInfo output, so this option is unnecessary for older versions. But around version 18 cover data was removed from the output by default, unless you also pass the --Cover_Data=base64 flag.
$mediaInfo = new MediaInfo();
$mediaInfo->setConfig('include_cover_data', true);
$mediaInfoContainer = $mediaInfo->getInfo('music.mp3');
$general = $mediaInfoContainer->getGeneral();
if ($general->has('cover_data')) {
    $attributeCover = $general->get('cover_data');
    $base64EncodedImage = $attributeCover->getBinaryCover();
}Note: Older versions of MediaInfo will print the following error if passed this flag:
$ mediainfo ./music.mp3 -f --OUTPUT=OLDXML --Cover_Data=base64
Option not knownThis configuration allows you to customize the return values of attributes in php-mediainfo by creating custom checker and attribute classes. You can extend existing classes, override methods, and add additional functionality to provide more comprehensive or specialized information in the attribute objects returned by php-mediainfo.
- Create a new class that implements the 
AttributeCheckerInterface 
class CustomDurationChecker extends \Mhor\MediaInfo\Checker\DurationChecker
{
    public function create($durations): \Mhor\MediaInfo\Attribute\Duration
    {
        return new CustomDuration($durations[0]);
    }
    public function getMembersFields(): array
    {
        return [
            'duration',
        ];
    }
}- Create a new class that implements the 
AttributeInterface 
class CustomDuration extends \Mhor\MediaInfo\Attribute\Duration
{
    public function getSeconds()
    {
        return $this->getMilliseconds() / 1000;
    }
}- Set the new list of attribute checkers into the config
 
$mediaInfo = new MediaInfo();
$mediaInfo->setConfig('attribute_checkers', [new CustomDurationChecker()]);
$mediaInfoContainer = $mediaInfo->getInfo(
    './SampleVideo_1280x720_5mb.mkv'
);
foreach ($mediaInfoContainer->getAudios() as $audio) {
    echo $audio->get('duration')->getSeconds();
}Look at this bundle: MhorMediaInfoBunde
Look at this to use composer with Codeigniter
See LICENSE for more information