Programlı video dosya biçimini belirler?

5 Cevap php

Tamam, video formatı temellerini olsun - orada bazı konteyner biçimleri vardır ve daha sonra çekirdek video / ses formatları var. Ben video / ses bir dosya kullanarak kodek ne belirleyen bir web tabanlı uygulama yazmak istiyorum.

Nasıl en iyi ben programlı bir video codec belirleyebilirsiniz? Bu sistem çağrıları aracılığıyla standart kütüphane kullanımı ve çıkışını ayrıştırmak için iyi olurdu? (Örneğin, ffmpeg, kodlama, vb?)

5 Cevap

mplayer-tespit hile yapacak. Sadece bir dosya üzerinde ffmpeg çağrısında da çalışacak - otomatik olursa olsun aslında yapmak için ffmpeg söylüyorsun ne girdi dosyası hakkında başında bilgi bir dizi basacaktır.

Eğer harici bir program için bir exec çağrısı olmadan program yapmak istiyorsanız Tabii ki, sadece avcodec kitaplıkları içerebilir ve doğrudan kendi tespit rutin çalıştırın.

Kendi algılama uygulamak olsa da, bu kesinlikle * desteklerini libav biçimleri kesinlikle muazzam sayıda verilen mevcut rutinleri aşağı olacaktır. Ve tekerleği yeniden icat oldukça saçma durum olurdu.

Linux'un "dosya" komutu da hile yapabilirsiniz, ama dışarı yazdırır veri miktarı video biçimine bağlıdır. Bir MKV için sadece seni kullanılan internals, hatta video ve ses formatları hakkında bir şey söylüyorum ", Matroska veri" diyor o dosya Örneğin, AVI it üzerine, FOURCC, fps, vb çözünürlük ile ilgili her türlü veriyi verir.

Bunu başarmak için bir perl script FFMPEG kullandık.

$info = `ffmpeg -i $path$file 2>&1 /dev/null`;
@fields = split(/\n/, $info);

Ve sadece ayıklamak gerekiyor @ alanlarda hangi öğeleri bulmak.

Sen daha fazla satır aşağı başlamak gerekir. Sen kap biçimini bilmek gerekir ve nasıl codec'i belirtir.

Yani kapsayıcı formatı (sadece uzantısı, başlığına gidin ve gerçek kabı belirlemek) tanımlayan bir program ile başlamak istiyorum.

Sonra programı destekleyecek hangi kapları anlamaya ve codec içerecektir kapta saklanan meta verilerini ayrıştırmak için gerekli fonksiyonları koymak.

Eğer gerçekten ikili belirlenmesi belirteçlerin büyük bir veritabanı dosyasının başlangıcında yakın için bakmak istiyorum. Neyse ki, sizin soru, "Linux" olarak etiketlenen ve böyle bir dabase zaten orada var; dosya (1) sizin için iş yapacak.

I ffprobe kullanmanızı tavsiye ve json çıkış biçimi zorlayacaktır. Bu ayrıştırmak çok daha kolay olurdu. En basit örnek:

$meta = json_decode(join(' ', `ffprobe -v quiet -print_format json -show_format -show_streams /path/to/file 2>&1`));

Bozuk dosya halinde size hata ayarlarını raporlama bağlı null sonucu ve uyarı olarak alacak uyardı. Uygun hata işleme örneği tamamlayın:

$file = '/path/to/file';
$cmd = 'ffprobe -v quiet -print_format json -show_format -show_streams ' . escapeshellarg($file).' 2>&1';

exec($cmd, $output, $code);
if ($code != 0) {
    throw new ErrorException("ffprobe returned non-zero code", $code, $output);
}

$joinedOutput = join(' ', $output);
$parsedOutput = json_decode($joinedOutput);
if (null === $parsedOutput) {
    throw new ErrorException("Unable to parse ffprobe output", $code, $output);
}

//here we can use $parsedOutput as simple stdClass