首页 > 解决方案 > 从 Google Cloud Storage 读取文件流到 ffmpeg(使用 fluent-ffmpeg)

问题描述

我正在尝试使用 fluent-ffmpeg 在 NodeJS 后端运行 ffmpeg,从 Google Cloud Storage 读取输入文件。如果我先下载文件,一切正常:

const file = storage
    .bucket('example_bucket')
    .file('examplefile.mp4');

file.download({destination: 'test.mp4'}, (err) => {

    let command = ffmpeg()
    .input('test.mp4')
    .duration(10)
    .format('mp4');

    command.save('test_out.mp4');

});

res.json([{
    message: 'Command sent!'
}]);

但是如果我尝试使用可读流作为输入,它会失败:

const file = storage
    .bucket('example_bucket')
    .file('examplefile.mp4');


var filestream = file.createReadStream()

let command = ffmpeg()
    .input(filestream)
    .duration(10)
    .format('mp4');


command.save('test_out.mp4');
});

res.json([{
    message: 'Command sent!'
}]);

这是尝试进行转换时 ffmpeg 的完整输出。似乎可以很好地读取文件的详细信息,但由于某种原因它失败了,说“无法处理视频:ffmpeg 以代码 1 退出:管道:0:处理输入时发现无效数据”

Spawned Ffmpeg with command: ffmpeg -i pipe:0 -y -t 10 -f mp4 test_out.mp4
Stderr output: ffmpeg version 4.0.1 Copyright (c) 2000-2018 the FFmpeg developers
Stderr output:   built with Apple LLVM version 9.1.0 (clang-902.0.39.2)
Stderr output:   configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-librsvg --enable-libtheora --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-libass --enable-libbluray --enable-lzma --enable-gnutls --enable-fontconfig --enable-libfreetype --enable-libfribidi --disable-libjack --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-indev=jack --enable-opencl --disable-outdev=xv --enable-audiotoolbox --enable-videotoolbox --enable-sdl2 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-x86asm --enable-libx265 --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
Stderr output:   libavutil      56. 14.100 / 56. 14.100
Stderr output:   libavcodec     58. 18.100 / 58. 18.100
Stderr output:   libavformat    58. 12.100 / 58. 12.100
Stderr output:   libavdevice    58.  3.100 / 58.  3.100
Stderr output:   libavfilter     7. 16.100 /  7. 16.100
Stderr output:   libavresample   4.  0.  0 /  4.  0.  0
Stderr output:   libswscale      5.  1.100 /  5.  1.100
Stderr output:   libswresample   3.  1.100 /  3.  1.100
Stderr output:   libpostproc    55.  1.100 / 55.  1.100
Stderr output: [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb6db80a200] stream 2, offset 0x30: partial file
Stderr output: [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb6db80a200] Could not find codec parameters for stream 0 (Video: h264 (avc1 / 0x31637661), none, 1920x1080, 4647 kb/s): unspecified pixel format
Stderr output: Consider increasing the value for the 'analyzeduration' and 'probesize' options
Stderr output: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'pipe:0':
Stderr output:   Metadata:
Stderr output:     major_brand     : isom
Stderr output:     minor_version   : 512
Stderr output:     compatible_brands: isomiso2avc1mp41
Stderr output:     encoder         : Lavf58.12.100
Stderr output:     location-eng    : +60.2121+024.8754/
Stderr output:     location        : +60.2121+024.8754/
Stderr output:   Duration: 00:02:23.13, bitrate: N/A
Stderr output:     Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), none, 1920x1080, 4647 kb/s, SAR 1:1 DAR 16:9, 59.94 fps, 59.94 tbr, 60k tbn, 120k tbc (default)
Stderr output:     Metadata:
Stderr output:       handler_name    : VideoHandler
Stderr output:     Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Stderr output:     Metadata:
Stderr output:       handler_name    : SoundHandler
Stderr output:     Stream #0:2(eng): Data: none (tmcd / 0x64636D74)
Stderr output:     Metadata:
Stderr output:       handler_name    : TimeCodeHandler
Stderr output: Stream mapping:
Input is aac (mp4a / 0x6134706D) audio with h264 (avc1 / 0x31637661) video
Stderr output:   Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stderr output:   Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Stderr output: [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb6db80a200] stream 0, offset 0x34: partial file
Stderr output: pipe:0: Invalid data found when processing input
Stderr output: Cannot determine format of input stream 0:0 after EOF
Stderr output: Error marking filters as finished
Stderr output: Conversion failed!
Stderr output: 
Cannot process video: ffmpeg exited with code 1: pipe:0: Invalid data found when processing input
Cannot determine format of input stream 0:0 after EOF
Error marking filters as finished
Conversion failed!

标签: node.jsffmpeggoogle-cloud-storagefluent-ffmpeg

解决方案


推荐阅读