ffmpeg HLS转码和块上传到远程服务器

时间:2017-06-27 11:00:15

标签: linux apache ubuntu ffmpeg

我正在尝试创建一个所谓的源服务器,用于在远程服务器上存储hls块和清单文件。运行ffmpeg的发送计算机使用IP:192.168.178.50,并且必须存储HLS块和清单文件的Web服务器使用IP:192.168.178.100。我的ffmpeg转码命令行是:

$ ffmpeg -i 01_llama_drama_1080p.mp4 -profile:v high -level 5.2 -s 1920x1080 -strict -2 -start_number 0 -hls_time 6 -hls_list_size 0 -f hls http://192.168.178.100/hls/test.m3u8

ffmpeg version 2.8.11-0ubuntu0.16.04.1 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
  configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --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-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --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-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '01_llama_drama_1080p.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-02-08 18:56:45
  Duration: 00:01:30.00, start: 0.000000, bitrate: 3120 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2925 kb/s, 24 fps, 24 tbr, 48 tbn, 48 tbc (default)
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
    Metadata:
      creation_time   : 2013-02-08 18:56:46
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
[libx264 @ 0x249b880] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x249b880] profile High, level 5.2
Output #0, hls, to 'http://185.71.86.48/hls/test.m3u8':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    encoder         : Lavf56.40.101
    Stream #0:0(und): Video: h264 (libx264), yuv420p, 1920x1080, q=-1--1, 24 fps, 90k tbn, 24 tbc (default)
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
      encoder         : Lavc56.60.100 libx264
    Stream #0:1(und): Audio: aac, 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2013-02-08 18:56:46
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
      encoder         : Lavc56.60.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[hls @ 0x24997e0] Cannot use rename on non file protocol, this may lead to races and temporarly partial files

但无论我使用何种方法,我都会在我的apache web服务器的访问日志中遇到以下错误:

$ tail -f /var/log/apache2/access.log

192.168.178.50 - - [27/Jun/2017:10:40:45 +0000] "POST /hls/test.m3u8 HTTP/1.1" 404 469 "-" "Lavf/56.40.101"
192.168.178.50 - - [27/Jun/2017:10:40:45 +0000] "POST /hls/test12.ts HTTP/1.1" 404 469 "-" "Lavf/56.40.101"
192.168.178.50 - - [27/Jun/2017:10:40:46 +0000] "POST /hls/test.m3u8 HTTP/1.1" 404 469 "-" "Lavf/56.40.101"
192.168.178.50 - - [27/Jun/2017:10:40:46 +0000] "POST /hls/test13.ts HTTP/1.1" 404 469 "-" "Lavf/56.40.101"
192.168.178.50 - - [27/Jun/2017:10:40:47 +0000] "POST /hls/test.m3u8 HTTP/1.1" 404 469 "-" "Lavf/56.40.101"
192.168.178.50 - - [27/Jun/2017:10:46:44 +0000] "POST /hls/test0.ts HTTP/1.1" 404 468 "-" "Lavf/56.40.101"
192.168.178.50 - - [27/Jun/2017:10:46:51 +0000] "POST /hls/test.m3u8 HTTP/1.1" 404 469 "-" "Lavf/56.40.101"

这些是我的网络服务器上支持的方法:

$ nmap -Pn -p 80 --script http-methods 192.168.178.100

Starting Nmap 7.01 ( https://nmap.org ) at 2017-06-27 10:47 UTC
Nmap scan report for 192.168.178.100
Host is up (0.0015s latency).
PORT   STATE SERVICE
80/tcp open  http
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS

Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds

我的网络服务器正在Ubuntu 16.04上运行apache2:

$ apache2 -v

Server version: Apache/2.4.18 (Ubuntu)
Server built:   2017-06-26T11:58:04

所以根据access.log文件,不管我在ffmpeg命令行中定义了什么方法,它总是尝试使用HTTP POST上传块,但后者已经被支持了,而我指向块的目录也是777权利。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:0)

ffmpeg 2.8中的hls muxer无法识别-method选项,后来是Official doc(在ffmpeg 3.0中)。您可以使用ffmpeg -h muxer=hls(或搜索ffmpeg -h full)显示识别选项,这就是为什么您只使用POST个请求的版本。

此外,为了使您的设置工作,您需要在服务器端处理这些请求的某些内容(例如将它们写入文件)。仅Apache就不会这样做,这会带来太大的安全风险(特别是没有像你的例子那样的任何身份验证)。

答案 1 :(得分:0)

我创建了一个bash脚本,它正在安装NGINX,在我的Github页面上配置它并限制对某个IP网络的访问。您可以在Origin Server running on NGINX查看解决方案。关键是,@ mata说HTTP POST需要某种句柄来处理POST请求并将它们保存到存储中,或者你可以使用HTTP PUT,但在这种情况下你需要明确地允许它,因为它是由默认不允许。我的解决方案实际上只允许在一个特定目录中使用HTTP PUT,并且它还将HTTP PUT方法限制为仅一个IP。请务必查看我的WIKI页面以获取更详细的说明。

答案 2 :(得分:0)

我对该主题进行了大量研究,最后提出了解决方案。我写了一篇博客,介绍了从将视频上传到服务器->转换为HLS,VOD流->到将其上传到AWS S3服务器上以进行公共流传输的整个过程。

您可以在此处查看完整的博客: https://medium.com/sharma02gaurav/adaptive-bitrate-streaming-hls-vod-service-in-nodejs-8df0d91d2eb4

本文还为该教程提供了一个github存储库。