ffmpeg getFrame test --SKIPIF-- <?php function_exists("imagecreatetruecolor") or die("skip function imagecreatetruecolor unavailable"); require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $frame = 73; $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); $img = sprintf("%s/test-%04d.png", $tmp_dir, $frame); $ff_frame = $mov->getFrame($frame); if ($ff_frame) { $gd_image = $ff_frame->toGDImage(); if ($gd_image) { imagepng($gd_image, $img); imagedestroy($gd_image); // generate md5 of file (NOTE: different versions of ffmpeg may produce different // md5 hashes since resampling has been changed slightly due to a fix. Need to // use EXPECTREX to test for both md5 possibilities. printf("ffmpeg getFrame(): md5 = %s\n", md5(file_get_contents($img))); unlink($img); } } ?>
--TEST-- ffmpeg getDuration test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getDuration(): %0.2f\n", $mov->getDuration()); ?> --EXPECT-- ffmpeg getDuration(): 4.40
--TEST-- ffmpeg getAudioSampleRate test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getAudioSampleRate(): %s\n", $mov->getAudioSampleRate()); ?> --EXPECT-- ffmpeg getAudioSampleRate(): 44100
--TEST-- ffmpeg getFrameRate test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getFrameRate(): %0.2f\n", $mov->getFrameRate()); ?> --EXPECT-- ffmpeg getFrameRate(): 25.00
--TEST-- ffmpeg getFileName test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getFileName(): %s\n", $mov->getFileName()); ?> --EXPECTREGEX-- ffmpeg getFileName\(\): .*\/cat.mpeg
--TEST-- ffmpeg animatedGif --SKIPIF-- <?php function_exists("imagecreatetruecolor") or die("skip function imagecreatetruecolor unavailable"); require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/Video000.3gp', false, $tmp_dir); $agif = sprintf("%s/test.gif", $tmp_dir); $ff_gif = new PHPVideoToolkit_animated_gif($agif, 120, 96, 5, 5); for ($i = 1; $i < 70; $i += 10) { $ff_frame = $mov->getFrame($i); $ff_gif->addFrame($ff_frame); } $img = imagecreatetruecolor(128, 96); $red = imagecolorallocate($img, 255, 0, 0); $white = imagecolorallocate($img, 255, 255, 255); imagerectangle($img, 5, 5, 90, 90, $white); $ff_frame_img = new PHPVideoToolkit_frame($img); $ff_gif->addFrame($ff_frame_img); printf("ffmpeg animated gif: md5 = %s\n", md5(file_get_contents($agif))); // unlink($agif); ?>
--TEST-- ffmpeg getPixelFormat test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getPixelFormat(): %s\n", $mov->getPixelFormat()); ?> --EXPECT-- ffmpeg getPixelFormat(): yuv420p
--TEST-- ffmpeg getFrameHeight test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getFrameHeight(): %d\n", $mov->getFrameHeight()); ?> --EXPECT-- ffmpeg getFrameHeight(): 284
--TEST-- ffmpeg getFrameNumber test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); /* move frame point to frame 5 */ $mov->getFrame(5); printf("ffmpeg getFrameNumber(): %d\n", $mov->getFrameNumber()); ?> --EXPECT-- ffmpeg getFrameNumber(): 5
--FILE-- <?php function print_image_md5($gd_image) { if ($gd_image) { $img = sprintf("tmp.png", $tmp_dir); imagepng($gd_image, $img); // generate md5 of file printf("%s\n", md5(file_get_contents($img))); unlink($img); } else { printf("failed\n"); } } $framenumber = 73; $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); $img = sprintf("%s/test-%04d.png", $tmp_dir, $framenumber); /* cropping as part of resize */ $frame = $mov->getFrame($framenumber); $frame->resize(50, 50, 10, 10, 10, 10); $gd_image = $frame->toGDImage(); print 'ffmpeg resize and crop: md5 = '; print_image_md5($gd_image); imagedestroy($gd_image); $framenumber++; /* cropping without resize */ $frame = $mov->getFrame($framenumber); $frame->crop(10, 10, 10, 10); $gd_image = $frame->toGDImage(); print 'ffmpeg crop: md5 = '; print_image_md5($gd_image);
--TEST-- ffmpeg getFrameCount test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getFrameCount(): %d\n", $mov->getFrameCount()); ?> --EXPECT-- ffmpeg getFrameCount(): 111
--TEST-- ffmpeg getFrame without an argument test --SKIPIF-- <?php function_exists("imagecreatetruecolor") or die("skip function imagecreatetruecolor unavailable"); require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); $img = $tmp_dir . '/test-'; while (($frame = $mov->getNextKeyFrame()) != false) { $i = $mov->getFrameNumber(); $filename = $img . $i . '.png'; $gd_image = $frame->toGDImage(); imagepng($gd_image, $filename); printf("ffmpeg getFrame({$i}): md5 = %s\n", md5(file_get_contents($filename))); imagedestroy($gd_image); unlink($filename); } ?> --EXPECT-- ffmpeg getFrame(27): md5 = d82d780ddf49a48799d09a6c0c806903 ffmpeg getFrame(53): md5 = e6d91c77fa6ebca6087de92b901fae61 ffmpeg getFrame(79): md5 = 0e89a830644873281948dfd3e74c894c
--TEST-- ffmpeg getAudioCodec test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getAudioCodec(): %s\n", $mov->getAudioCodec()); ?> --EXPECT-- ffmpeg getAudioCodec(): mp2
--TEST-- ffmpeg getPixelAspectRatio test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf('frame number = ' . $mov->getFrameNumber() . "\n"); printf("ffmpeg getPixelAspectRatio(): %s\n", $mov->getPixelAspectRatio()); printf('frame number = ' . $mov->getFrameNumber() . "\n"); ?> --EXPECT-- frame number = 1 ffmpeg getPixelAspectRatio(): -1 frame number = 1
--TEST-- ffmpeg getAudioChannels test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getAudioChannels(): %s\n", $mov->getAudioChannels()); ?> --EXPECT-- ffmpeg getAudioChannels(): 1
--TEST-- ffmpeg getFramesResampled test --SKIPIF-- <?php function_exists("imagecreatetruecolor") or die("skip function imagecreatetruecolor unavailable"); require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); $framecount = $mov->getFrameCount(); for ($i = 1; $i <= $framecount; $i++) { $img = sprintf("%s/test-%04d.png", $tmp_dir, $i); $width = 40 + ($i % 2 ? $i + 1 : $i); $height = 40 + ($i % 2 ? $i + 1 : $i); $frame = $mov->getFrame($i); $frame->resize($width, $height); $gd_image = $frame->toGDImage(); imagepng($gd_image, $img); printf("ffmpeg getFramesResampled(%d): md5 = %s\n", $i, md5(file_get_contents($img))); imagedestroy($gd_image); unlink($img); } ?> --EXPECT--
--TEST-- ffmpeg getFrameWidth test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getFrameWidth(): %d\n", $mov->getFrameWidth()); ?> --EXPECT-- ffmpeg getFrameWidth(): 384
--TEST-- ffmpeg hasAudio test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/MOV00007.gif', false, $tmp_dir); printf("ffmpeg hasAudio(): %s\n", $mov->hasAudio() ? 'Yes' : 'No'); $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg hasAudio(): %s\n", $mov->hasAudio() ? 'Yes' : 'No'); ?> --EXPECT-- ffmpeg hasAudio(): No ffmpeg hasAudio(): Yes
--TEST-- ffmpeg getFramesNoArg test --SKIPIF-- <?php function_exists("imagecreatetruecolor") or die("skip function imagecreatetruecolor unavailable"); require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); $img = $tmp_dir . '/test-'; $i = 0; while (($frame = $mov->getFrame()) != false) { $i++; $filename = $img . $i . '.png'; $gd_image = $frame->toGDImage(); imagepng($gd_image, $filename); printf("ffmpeg getFrame({$i}): md5 = %s\n", md5(file_get_contents($filename))); imagedestroy($gd_image); unlink($filename); } ?> --EXPECT-- ffmpeg getFrame(1): md5 = 3bdd86fce4a2556bd53b58c1bbebc7da ffmpeg getFrame(2): md5 = 551362661dca92950a67e2462e246acb
--TEST-- ffmpeg getAudioBitRate test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getAudioBitRate(): %s\n", $mov->getAudioBitRate()); ?> --EXPECT-- ffmpeg getAudioBitRate(): 96
$tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; // printf("ffmpeg-php version string: %s\n", FFMPEG_PHP_VERSION_STRING); // printf("libavcodec build number: %d\n", LIBAVCODEC_BUILD_NUMBER); // printf("libavcodec version number: %d\n", LIBAVCODEC_VERSION_NUMBER); echo "--------------------"; print_class_methods("ffmpeg_movie"); echo "\n\n--------------------"; print_class_methods("ffmpeg_frame"); echo "\n\n--------------------"; print_class_methods("ffmpeg_animated_gif"); echo "\n\n--------------------\n"; // get an array for movies from the test media directory $movies = getDirFiles($dir . '/examples/to-be-processed'); // print_r($movies); foreach ($movies as $movie) { $mov = new PHPVideoToolkit_movie($movie, false, $tmp_dir); printf("file name = %s\n", $mov->getFileName()); printf("duration = %s seconds\n", $mov->getDuration()); printf("frame count = %s\n", $mov->getFrameCount()); printf("frame rate = %0.3f fps\n", $mov->getFrameRate()); printf("comment = %s\n", $mov->getComment()); printf("title = %s\n", $mov->getTitle()); printf("author = %s\n", $mov->getAuthor()); printf("copyright = %s\n", $mov->getCopyright()); printf("get bit rate = %d\n", $mov->getBitRate()); printf("has audio = %s\n", $mov->hasAudio() == 0 ? 'No' : 'Yes'); if ($mov->hasAudio()) { printf("get audio codec = %s\n", $mov->getAudioCodec()); printf("get audio bit rate = %d\n", $mov->getAudioBitRate()); printf("get audio sample rate = %d \n", $mov->getAudioSampleRate()); printf("get audio channels = %s\n", $mov->getAudioChannels());
--TEST-- ffmpeg getVideoCodec test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/cat.mpeg', false, $tmp_dir); printf("ffmpeg getVideoCodec(): %s\n", $mov->getVideoCodec()); ?> --EXPECTREGEX-- ffmpeg getVideoCodec\(\): mpeg1video
--TEST-- ffmpeg getVideoBitRate test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/MOV00007.3gp', false, $tmp_dir); printf("ffmpeg getVideoBitRate(): %s\n", $mov->getVideoBitRate()); ?> --EXPECT-- ffmpeg getVideoBitRate(): -1
--TEST-- ffmpeg getID3Info() test --SKIPIF-- <?php require_once '../../ffmpeg_movie.php'; require_once '../../ffmpeg_frame.php'; require_once '../../ffmpeg_animated_gif.php'; $ignore_demo_files = true; $dir = dirname(dirname(dirname(dirname(dirname(__FILE__))))); require_once $dir . '/examples/example-config.php'; $tmp_dir = PHPVIDEOTOOLKIT_EXAMPLE_ABSOLUTE_BATH . 'tmp/'; ?> --FILE-- <?php $mov = new PHPVideoToolkit_movie($dir . '/examples/to-be-processed/Ballad of the Sneak.mp3', false, $tmp_dir); printf("ffmpeg getTitle(): %s\n", $mov->getTitle()); printf("ffmpeg getArtist(): %s\n", $mov->getArtist()); printf("ffmpeg getAlbum(): %s\n", $mov->getAlbum()); printf("ffmpeg getGenre(): %s\n", $mov->getGenre()); printf("ffmpeg getTrackNumber(): %s\n", $mov->getTrackNumber()); printf("ffmpeg getYear(): %s\n", $mov->getYear()); ?> --EXPECT-- ffmpeg getTitle(): Ballad of the Sneak ffmpeg getArtist(): DaVinci's Notebook ffmpeg getAlbum(): Strong Bad Sings ffmpeg getGenre(): Ballad ffmpeg getTrackNumber(): 1 ffmpeg getYear(): 2004