Recherche avancée
Sur d’autres sites (114)
-
ffmpeg HLS transcoding and chunks upload to remote server
25 mai 2020, par Georgе StoyanovI am trying to create a so called origin server for storing the hls chunks and the manifest file on a remote server. The sending machine running ffmpeg is with IP :
192.168.178.50
and the web server which has to store both the HLS chunks and the manifest file is with IP :192.168.178.100
. My ffmpeg transcoding command line is :


$ 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




But no matter what method I am using I got in the access log of my apache web server the following errors :



$ 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"




These are the supported methods on my web server :



$ 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




My web server is running apache2 on
Ubuntu 16.04
:


$ apache2 -v

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




So according to the access.log file no matter what method I define in the ffmpeg command line it is always trying to upload the chunks using HTTP POST, but the latter is already supported and the directory I am directing the chunks has even 777 rights. Am I missing something here ?


-
FFmpeg (Thumbnail from video) works in command line, but not in PHP script
25 juin 2017, par Jun KimI looked at the similar questions, and the solutions there do not work in my case. Anyone has any idea ? I am trying to capture a thumbnail from a given video file.
Later, my goal is to capture a thumbnail from live streaming video file.
Below is my current set up.
Linux Ubuntu 16.04
PHP version 7.0
Nginx Version 1.10.3
FFmpeg Version FFmpeg 2.8.11
I installed FFmpeg through below commands in my Ubuntu server.
apt-get update
apt-get install ffmpegWhen I type the below command line in the terminal, it does the conversion fine.
ffmpeg -i /etc/nginx/html/test.mp4 -ss 00:00:01 -vframes 1 -vf scale=240:120 /etc/nginx/html/Share/ffmpeg/thumbnails/test.png;
In order to use it in php file, I confirmed the location of ffmpeg binaries by I typing in the terminal,
which ffmpeg
, and it returns/usr/bin/ffmpeg
I also gave permission to the directory by using
chmod 755
command line.Here is what I have in my ffmpeg.php file.
I included the full path to my ffmpeg as you can see.<?php
header("Content-Type: text/html;charset=UTF-8");
$ffmpeg = "/usr/bin/ffmpeg";
$videoFile="/etc/nginx/html/test.mp4";
$thumbnail= "/etc/nginx/html/Share/ffmpeg/thumbnails/thumbnail1.jpg";
$cmd = "$ffmpeg -i $videoFile -ss 00:00:01 -vframes 1 -vf scale=240:120 $thumbnail 2>&1 &";
$output = shell_exec($cmd);
echo "<pre>".$output."</pre>";
?>This returns the message like below.
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 '/etc/nginx/html/Share/test.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf53.24.2
Duration: 00:00:06.40, start: 0.000000, bitrate: 1321 kb/s
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 640x368 [SAR 1:1 DAR 40:23], 932 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : SoundHandler
[swscaler @ 0x1621be0] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to '/etc/nginx/html/Share/ffmpeg/thumbnails/thumbnail1.jpg':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf56.40.101
Stream #0:0(und): Video: mjpeg, yuvj420p(pc), 240x120 [SAR 20:23 DAR 40:23], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
encoder : Lavc56.60.100 mjpeg
Stream mapping:
Stream #0:0 -> #0:0 (mpeg4 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[image2 @ 0x16165a0] Could not open file : /etc/nginx/html/Share/ffmpeg/thumbnails/thumbnail1.jpg
av_interleaved_write_frame(): Input/output error
frame= 1 fps=0.0 q=3.9 Lsize=N/A time=00:00:00.04 bitrate=N/A
video:8kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!UPDATED : I also gave permission to ffmpeg by chmod +x $(which ffmpeg)
I tried
php /etc/nginx/html/Share/ffmpeg/ffmpeg.php
in the terminal, and it also does conversion fine.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 '/etc/nginx/html/Share/test.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf53.24.2
Duration: 00:00:06.40, start: 0.000000, bitrate: 1321 kb/s
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 640x368 [SAR 1:1 DAR 40:23], 932 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : SoundHandler
[swscaler @ 0x72dbe0] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to '/etc/nginx/html/Share/ffmpeg/thumbnails/thumbnail.jpg':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf56.40.101
Stream #0:0(und): Video: mjpeg, yuvj420p(pc), 240x120 [SAR 20:23 DAR 40:23], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
encoder : Lavc56.60.100 mjpeg
Stream mapping:
Stream #0:0 -> #0:0 (mpeg4 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
frame= 1 fps=0.0 q=3.9 Lsize=N/A time=00:00:00.04 bitrate=N/A
video:8kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown -
ffmpeg failed to call avcodec_send_packet
23 juin 2017, par GizakWindows 10 x64,
ffmpeg : 3.1, prebuilt dllsAbsolute beginner here.
I was trying out a very basic case to decode frames from a video file but desperately failed at every attempts. The final code snippet looks like this :
#define __STDC_CONSTANT_MACROS
extern "C" {
#include<libavutil></libavutil>avutil.h>
#include<libavutil></libavutil>imgutils.h>
#include <libavformat></libavformat>avformat.h>
#include <libavcodec></libavcodec>avcodec.h>
#include <libswscale></libswscale>swscale.h>
}
#include <iostream>
int main(int argc, char **argv) {
AVFormatContext* ctx_format = nullptr;
AVCodecContext* ctx_codec = nullptr;
AVCodec* codec = nullptr;
AVFrame* frame = av_frame_alloc();
int stream_idx;
SwsContext* ctx_sws = nullptr;
const char* fin = argv[1];
AVStream *vid_stream = nullptr;
AVPacket* pkt = av_packet_alloc();
av_register_all();
if (int ret = avformat_open_input(&ctx_format, fin, nullptr, nullptr) != 0) {
std::cout << 1 << std::endl;
return ret;
}
if (avformat_find_stream_info(ctx_format, nullptr) < 0) {
std::cout << 2 << std::endl;
return -1; // Couldn't find stream information
}
av_dump_format(ctx_format, 0, fin, false);
for (int i = 0; i < ctx_format->nb_streams; i++)
if (ctx_format->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
stream_idx = i;
vid_stream = ctx_format->streams[i];
break;
}
if (vid_stream == nullptr) {
std::cout << 4 << std::endl;
return -1;
}
codec = avcodec_find_decoder(vid_stream->codecpar->codec_id);
if (!codec) {
fprintf(stderr, "codec not found\n");
exit(1);
}
ctx_codec = avcodec_alloc_context3(codec);
if(avcodec_parameters_to_context(ctx_codec, vid_stream->codecpar)<0)
std::cout << 512;
if (avcodec_open2(ctx_codec, codec, nullptr)<0) {
std::cout << 5;
return -1;
}
//av_new_packet(pkt, pic_size);
while(av_read_frame(ctx_format, pkt) >= 0){
int ret = avcodec_send_packet(ctx_codec, pkt);
if (ret < 0 || ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
std::cout << "avcodec_send_packet: " << ret << std::endl;
break;
}
if (pkt->stream_index == stream_idx) {
while (ret >= 0) {
ret = avcodec_receive_frame(ctx_codec, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
//std::cout << "avcodec_receive_frame: " << ret << std::endl;
break;
}
std::cout << "frame: " << ctx_codec->frame_number << std::endl;
}
}
av_packet_unref(pkt);
}
avformat_close_input(&ctx_format);
av_packet_unref(pkt);
avcodec_free_context(&ctx_codec);
avformat_free_context(ctx_format);
return 0;
}
</iostream>It basically leaves everything by its defaults and try to read packets and decode frames from them. The
avcodec_send_packet
always returned a negative value at the first or second round of calling in the while loop.Output for flv :
> .\streamer_test.exe .\SampleVideo_360x240_5mb.flv
Input #0, flv, from '.\SampleVideo_360x240_5mb.flv':
Metadata:
encoder : Lavf53.24.2
Duration: 00:00:53.32, start: 0.000000, bitrate: 787 kb/s
Stream #0:0: Audio: aac (LC), 48000 Hz, 5.1, fltp, 384 kb/s
Stream #0:1: Video: flv1, yuv420p, 320x240, 500 kb/s, 1k fps, 25 tbr, 1k tbn
frame: 1
[flv @ 000001545edb66c0] Bad picture start code
[flv @ 000001545edb66c0] header damaged
avcodec_send_packet: -1094995529Output for mp4 :
> .\streamer_test.exe .\SampleVideo_360x240_10mb.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\SampleVideo_360x240_10mb.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01T00:00:00.000000Z
encoder : Lavf53.24.2
Duration: 00:02:05.95, start: 0.000000, bitrate: 669 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 282 kb/s, 15 fps, 15 t
br, 15360 tbn, 30 tbc (default)
Metadata:
creation_time : 1970-01-01T00:00:00.000000Z
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
Metadata:
creation_time : 1970-01-01T00:00:00.000000Z
handler_name : SoundHandler
[h264 @ 000002e2446a6cc0] Invalid NAL unit size (17191968 > 1007).
[h264 @ 000002e2446a6cc0] Error splitting the input into NAL units.
avcodec_send_packet: -1094995529Output for mkv :
> .\streamer_test.exe .\SampleVideo_1280x720_2mb.mkv
Input #0, matroska,webm, from '.\SampleVideo_1280x720_2mb.mkv':
Metadata:
ENCODER : Lavf53.24.2
Duration: 00:00:10.65, bitrate: 1575 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 25 tbc (de
fault)
Stream #0:1: Audio: aac (LC), 48000 Hz, 5.1, fltp (default)
frame: 1
[mpeg4 @ 000001166798ede0] header damaged
avcodec_send_packet: -1So I guess there must be something wrong around
avcodec_send_packet
call but could not figured out what is missing. Any ideas about the causes ? Much appreciate your help !