Я пытаюсь преобразовать файл .wav в .mp3, используя avconv / «ffmpeg» из Libav с каналами для stdin и stdout, однако мой вывод .mp3 приводит к 0 байтов.
Это то, что я сейчас делаю:
$desc = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
);
$cmd = "/usr/bin/ffmpeg -loglevel quiet -i pipe:0 -acodec libmp3lame -q:a 5 pipe:1";
$p = proc_open($cmd, $desc, $pipes);
fwrite($pipes[0], $wav); // $wav contains the wav file data.
fclose($pipes[0]);
$mp3 = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// At this point doing strlen($mp3) returns 0
proc_close($p);
Как я могу преобразовать файл .wav в .mp3 с помощью ffmpeg, используя ввод и вывод по конвейеру?
PS: В результате проверки работоспособности при запуске следующей команды из командной строки получается преобразованный .mp3:
/usr/bin/ffmpeg -loglevel quiet -i test.wav -acodec libmp3lame -q:a 5 test.mp3
ОБНОВИТЬ
После применения предложения LordNeckbeard команда ffmpeg, кажется, зависает. Я также включил вывод ffmpeg, чтобы получить некоторую обратную связь, и теперь он, похоже, действительно ждет. Не уверен, почему вход .wav имеет фиксированную продолжительность …
avconv version 9.18-6:9.18-0ubuntu0.14.04.1+fdkaac, Copyright (c) 2000-2014 the Libav developers
built on Apr 10 2015 23:18:58 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
[wav @ 0x150e460] max_analyze_duration reached
Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, wav, from 'pipe:0':
Duration: 00:00:15.04, bitrate: N/A
Stream #0.0: Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s
Output #0, mp3, to 'pipe:1':
Metadata:
TSSE : Lavf54.20.4
Stream #0.0: Audio: libmp3lame, 48000 Hz, mono, s16p
Stream mapping:
Stream #0:0 -> #0:0 (pcm_s16le -> libmp3lame)
Press ctrl-c to stop encoding
Задача ещё не решена.
Других решений пока нет …