FFmpeg: Pipe segments to s3



我想通过管道将ffmpeg段传输到s3,而不将它们写入磁盘。

ffmpeg -i t2.mp4 -map 0 -c copy -f segment -segment_time 20 output_%04d.mkv

是否可以修改此命令,以便ffmpeg将段写入s3存储桶?也许是这样的?

ffmpeg -i t2.mp4 -map 0 -c copy -f segment -segment_time 20 pipe:1 
| aws s3 cp - s3://bucket/output_%04d.mkv

当我运行上面的命令时,我收到这个错误

Could not write header for output file #0
(incorrect codec parameters ?): Muxer not found

该命令有效,除了上传整个视频,而不是单个片段

ffmpeg -i t2.mp4 -map 0 -c copy -f segment -segment_time 20 pipe:output_%04d.mkv 
| aws s3 cp - s3://bucket/test.mkv

它可以与s3fs配合使用。在Ubuntu 18.04.4 LTS上测试。

s3fs版本:

root@ip-172-31-69-62:~# s3fs --version
Amazon Simple Storage Service File System V1.86 (commit:unknown) with OpenSSL
Copyright (C) 2010 Randy Rizun <rrizun@gmail.com>
License GPL2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@ip-172-31-69-62:~# 

来源编译的;无法使它与从"apt-installs3fs"安装的常规版本一起工作。您需要正确配置.aws/credentials,然后只需装载一个文件夹:

root@ip-172-31-69-62:~# s3fs sm-alfa-beta /mnt/s5

不要管它;将其视为常规文件夹,然后将其放在S3存储桶上。

root@ip-172-31-69-62:~# ffmpeg -i t2.mp4 -map 0 -c copy -f segment -segment_time 5 /mnt/s5/output_%04d.mkv
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 't2.mp4':
Metadata:
major_brand     : mp42
minor_version   : 0
compatible_brands: mp42mp41
creation_time   : 2014-07-18T06:00:15.000000Z
Duration: 00:00:21.29, start: 0.000000, bitrate: 14904 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 14517 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
Metadata:
creation_time   : 2014-07-18T06:00:15.000000Z
handler_name    : ?Mainconcept Video Media Handler
encoder         : AVC Coding
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
Metadata:
creation_time   : 2014-07-18T06:00:15.000000Z
handler_name    : #Mainconcept MP4 Sound Media Handler
[segment @ 0x55e4b1d6d660] Opening '/mnt/s5/output_0000.mkv' for writing
Output #0, segment, to '/mnt/s5/output_%04d.mkv':
Metadata:
major_brand     : mp42
minor_version   : 0
compatible_brands: mp42mp41
encoder         : Lavf57.83.100
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 14517 kb/s, 25 fps, 25 tbr, 1k tbn, 25 tbc (default)
Metadata:
creation_time   : 2014-07-18T06:00:15.000000Z
handler_name    : ?Mainconcept Video Media Handler
encoder         : AVC Coding
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
Metadata:
creation_time   : 2014-07-18T06:00:15.000000Z
handler_name    : #Mainconcept MP4 Sound Media Handler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[segment @ 0x55e4b1d6d660] Opening '/mnt/s5/output_0001.mkv' for writing
[segment @ 0x55e4b1d6d660] Opening '/mnt/s5/output_0002.mkv' for writing
[segment @ 0x55e4b1d6d660] Opening '/mnt/s5/output_0003.mkv' for writing1.9x    
[segment @ 0x55e4b1d6d660] Opening '/mnt/s5/output_0004.mkv' for writing1.2x    
frame=  531 fps=284 q=-1.0 Lsize=N/A time=00:00:21.22 bitrate=N/A speed=11.4x    
video:37640kB audio:491kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

以下是部分:

root@ip-172-31-69-62:~# ls -l /mnt/s5
total 38150
-rw-r--r-- 1 root root  9542771 Jul  7 20:01 output_0000.mkv
-rw-r--r-- 1 root root  9464801 Jul  7 20:01 output_0001.mkv
-rw-r--r-- 1 root root 10072341 Jul  7 20:01 output_0002.mkv
-rw-r--r-- 1 root root  8269715 Jul  7 20:01 output_0003.mkv
-rw-r--r-- 1 root root  1714287 Jul  7 20:01 output_0004.mkv
root@ip-172-31-69-62:~# 

在Ubuntu 18.04.4:上编译s3fs的说明

sudo apt-get install build-essential libcurl4-openssl-dev libxml2-dev pkg-config libssl-dev libfuse-dev automake
cd /tmp && 
git clone https://github.com/s3fs-fuse/s3fs-fuse.git && 
cd s3fs-fuse && 
./autogen.sh && 
./configure  && 
make
sudo make install

试着用s3fs处理S3,就像它是一个普通的文件系统一样。

aws s3 cp(还(不支持管道传输多个文件

因此,您必须先在本地保存这些多个文件,然后使用--recursive(正如您在问题中提到的(将它们作为一个完整的文件夹cp,或者一个接一个地保存。

我认为aws s3不支持通过ffmpeg或任何其他命令从stdin管道传输多个文件。在cli文档中,我没有提到通过stdin的协议可以支持这一点。即使存在这样一个计划,它也将是相当棘手的工作;流可能必须包括要上传的文件的长度,或者使用某种复杂的规范来对单个数据流中的单独文件内容进行编码,并且没有理由相信它与ffmpeg兼容。

如果您的目标是避免写入物理磁盘,我建议您尝试在内存中创建所需的文件,使用类似tmpfs的内存支持文件系统。这种方法的好处是,您不需要对单个程序(ffmpegaws s3(做任何特殊的操作,它们与文件系统正常交互,但数据实际上只写入RAM。

如果这不是一个选项,我会再次退一步,考虑一下这些磁盘写入的问题到底有多大。从设计上讲,文件系统就是文件的表示方式,所以如果你试图将几个文件上传到AWS,文件系统可能是最好的选择。你确定你的磁盘真的是你需要解决的瓶颈吗?否则,您可能需要寻找ffmpeg命令行工具的替代品,该工具将允许您在内存中生成所需的段,并将它们直接流式传输到S3。您可能需要自己构建这样一个实用程序。

最新更新