Использование ffmpeg через PHP – странная проблема с выводом

  • Автор темы vitalsan
  • 42
  • Обновлено
  • 12, May 2024
  • #1
Хорошо, я использую ffmpeg для создания миниатюры загружаемого видео.

Эта часть работает нормально, но доступ к массиву $output из ffmpeg после его выполнения.

это совсем другое дело. Он выводит массив с различной информацией (в зависимости от типа файла и т. д.) - мне нужна одна строка с именем вновь созданного файла изображения. Вот строка, которую я использую для ffmpeg:
 
if (($key = array_search('Output',$output)) != false) {
echo $output[$key];
}
PHP: это работает нормально — видео сохраняется, изображение создается и $output заполняется.

Все идет нормально. Пример вывода:
  Array ( [0] => ffmpeg version 2.8.4 Copyright (c) 2000-2015 the FFmpeg developers [1] => built with Apple LLVM version 7.0.2 (clang-700.1.81) [2] => configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda [3] => libavutil 54. 31.100 / 54. 31.100 [4] => libavcodec 56. 60.100 / 56. 60.100 [5] => libavformat 56. 40.101 / 56. 40.101 [6] => libavdevice 56. 4.100 / 56. 4.100 [7] => libavfilter 5. 40.101 / 5. 40.101 [8] => libavresample 2. 1. 0 / 2. 1. 0 [9] => libswscale 3. 1.101 / 3. 1.101 [10] => libswresample 1. 2.101 / 1. 2.101 [11] => libpostproc 53. 3.100 / 53. 3.100 [12] => Input #0, flv, from '/Applications/MAMP/htdocs/medialist/users/public/video/videofile.flv': [13] => Duration: 00:11:33.04, start: 0.000000, bitrate: 1013 kb/s [14] => Stream #0:0: Video: h264 (Main), yuv420p(tv), 800x600 [SAR 1:1 DAR 4:3], 30.30 fps, 30 tbr, 1k tbn, 60 tbc [15] => Stream #0:1: Audio: speex, 16000 Hz, mono [16] => [swscaler @ 0x7f9109870c00] deprecated pixel format used, make sure you did set range correctly [17] => Output #0, mjpeg, to '/Applications/MAMP/htdocs/medialist/users/public/pictures/thumbs/videofile.flv.jpg': [18] => Metadata: [19] => encoder : Lavf56.40.101 [20] => Stream #0:0: Video: mjpeg, yuvj420p(pc), 800x600 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 1 fps, 1 tbn, 1 tbc [21] => Metadata: [22] => encoder : Lavc56.60.100 mjpeg [23] => Stream mapping: [24] => Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native)) [25] => Press [q] to stop, [?] for help [26] => frame= 1 fps=0.0 q=4.5 Lsize= 23kB time=00:00:01.00 bitrate= 188.1kbits/s [27] => video:23kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000% ) 
PHP: Мне кажется, это совершенно обычный массив.

Мне нужно получить строку, начинающуюся с «Выход № 0, mjpeg» — к сожалению, она не всегда находится на № 17, поэтому я не могу использовать $output[17] для получения нужной информации.

Хорошо, допустим, мы используем array_search() — это:
  exec("/usr/local/bin/ffmpeg -i $video -deinterlace -an -ss 1 -t 00:00:01 -r 1 -y -vcodec mjpeg -f mjpeg $thumbnail 2>&1",$output,$retval); 
PHP: не работает — он просто возвращает false, если я выполняю var_dump(); Если я попытаюсь сделать то же самое с in_array('Output',$output) тот же результат.

Т.е. информация, которую я получаю, похоже, отсутствует в массиве. Я также пытаюсь проанализировать массив с помощью foreach и выполнить strpos() для значения $ - все равно он не сработал на "выходе" - я заблудился.

Я понятия не имею, почему я не получаю нужную информацию - если я var_dump() каждое значение $ в foreach, они возвращаются в виде строки (XX) и содержимого значения.

Итак, они являются строками и должны работать как строки/обычные массивы.

Но они этого не делают, и я не понимаю, почему. У кого-нибудь есть блестящие идеи?

vitalsan


Рег
20 Mar, 2013

Тем
1

Постов
2

Баллов
12
  • 21, May 2024
  • #2
Хорошо, я понимаю, что это может быть правильно, но почему бы in_array() тоже не работать? Я подозреваю, что была еще одна проблема с возвращаемыми значениями, но, поскольку я все равно понял, как это сделать, по крайней мере, я не буду исследовать ее прямо сейчас.
 

oxeo


Рег
21 Jan, 2014

Тем
0

Постов
1

Баллов
1
  • 10, Jun 2024
  • #3
О, ну, обычно я хорошо умею находить решения своих проблем. Провел еще немного исследований и обнаружил, что если бы мне это понравилось:
 
$output = shell_exec("/usr/local/bin/ffmpeg -i $video -deinterlace -an -ss 1 -t 00:00:01 -r 1 -y -vcodec mjpeg -f mjpeg $thumbnail 2>&1");
//and parsed it like this:
echo explode(':',explode('to',$output)[1])[0];
PHP: я получил именно то, что мне было нужно
 

olgatms


Рег
31 May, 2014

Тем
1

Постов
3

Баллов
13
  • 12, Jun 2024
  • #4
 
function array_find($needle, array $haystack)
{
foreach ($haystack as $key => $value) {
if (false !== stripos($value, $needle)) {
return $key;
}
}
return false;
}
Code (php): You're probably looking for something like this, it's messy but it works
 

b. sergei


Рег
17 Mar, 2013

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966