我正在尝试使用来自Libav的avconv /“ffmpeg”使用stdin和stdout的管道将.wav文件转换为.mp3,但是,我的输出.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