【问题标题】:How to know if ffmpeg conversion succeeded in Ruby?如何知道 Ruby 中的 ffmpeg 转换是否成功?
【发布时间】:2015-12-08 03:35:07
【问题描述】:

我在 Rails 应用程序中运行 ffmpeg 命令将音频文件转换为 mp3:

# Convert to MP3
conversion_result = `ffmpeg -i "#{Refile::cache.directory}/#{self.file.id}" -f mp3 "#{_path_to_mp3}" 2>&1`

转换后conversion_result的例子如下:

"ffmpeg 版本 N-74748-gbaeb8f5 版权所有 (c) 2000-2015 FFmpeg 开发人员\n 使用 gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04) 构建\n 配置:--extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-解码器=amrwb --enable-libpulse --enable-libdcadec --enable-libfreetype --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab\n libavutil 54. 31.100 / 54 . 31.100\n libavcodec 56. 59.100 / 56. 59.100\n libavformat 56. 40.101 / 56. 40.101\n libavdevice 56. 4.100 / 56. 4.100\n libavfilter 5. 40.100 / 5. 40.100\n libavresample 2. / 2. 1. 0\n libswscale 3. 1.101 / 3. 1.101 \ n libswreesample 1. 2.101 / 1. 2.101 \ n libpostproc 53. 3.100 \ ninput#0,mov,mp4,m4a,3gp,3g2,mj2,from'../mey_attachments/cache/25888dc028deaabae4d4de19d4726573860dbce0b907113 ':\n 元数据:\n major_brand : 3gp4\n minor_version : 0\n compatible_brands: isom3gp4\n creation_time : 2015-09-01 16:34:01\n 时长:00:00:08.57,开始:0.000000,比特率:426 kb/s\n 流

0:0(eng):音频:aac (LC) (mp4a / 0x6134706D),44100 Hz,单声道,fltp,48 kb/s(默认)\n 元数据:\n creation_time : 2015-09-01 16 :34:01\n

handler_name : SoundHandle\n输出#0, mp3, to '/tmp/Voice00045.mp3':\n 元数据:\n major_brand : 3gp4\n 次要版本:0\n compatible_brands:isom3gp4\n TSSE: Lavf56.40.101\n 流 #0:0(eng):音频:mp3 (libmp3lame),44100 Hz, 单声道,fltp(默认)\n 元数据:\n creation_time : 2015-09-01 16:34:01\n handler_name : SoundHandle\n 编码器 : Lavc56.59.100 libmp3lame\n流映射:\n 流 #0:0 -> #0:0 (aac (native) -> mp3 (libmp3lame))\n按 [q] 停止,按 [?] 寻求帮助\nsize= 67kB 时间=00:00:08.56 比特率= 64.5kbits/s \n视频:0kB 音频:67kB 字幕:0kB 其他流:0kB 全局标题:0kB 复用开销: 0.465427%\n"

如何确保命令执行后转换成功?

【问题讨论】:

    标签: ruby-on-rails ruby ffmpeg ruby-2.2


    【解决方案1】:

    你需要命令的全文输出吗?

    因为如果不是,我建议您在命令以退出代码 0(成功)终止时使用 system command that will return true,如果失败则使用 false 或 nil。

    conversion_success = system %Q[ffmpeg -i "#{Refile::cache.directory}/#{self.file.id}" -f mp3 "#{_path_to_mp3}" 2>&1]
    

    请注意,在示例中,我使用 %Q[...] 作为字符串以避免必须转义 "s 并且能够对命令进行字符串插值。

    【讨论】:

    • 现在;我使用系统命令并检查结果; if $?.success? && File.exists?(_path_to_mp3)。方法对吗?
    • 好吧,我没想到那个。你可以简单地坚持你原来的解决方案并使用$?.success?或者你使用系统然后你有两个选项(检查系统的返回值或使用$?.success?),我想这并不重要,而且真的更重要的风格。我认为没有对错之分。
    • 能否举例说明如何使用system 来检查结果?
    • 在我提供的示例中,conversion_successtruefalsenil。只有true 表示成功。所以你可以只使用if conversion_successif system(...)虽然我更喜欢第一个,因为它有点干净......
    猜你喜欢
    • 2011-08-10
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多