Ich erstelle eine NodeJS-Anwendung, die eine statische Videodatei in ein strahlbares Video konvertiert, das (mithilfe des Moduls fluent-ffmpeg) sofort an einen Client (iPad oder Browser) gesendet wird.
Alles ist eingestellt und alles, was ich jetzt brauche, ist, ffmpeg richtig zu konfigurieren. Aber ich habe viele Probleme mit ffmpeg. Zuerst habe ich einen Flash-Stream erstellt (flv mit lib264-Codec, der sehr gut funktioniert hat, aber auf dem iPad natürlich nicht funktioniert).
Mit meinen aktuellen Einstellungen höre ich sofort Audio, aber das Bild startet einige Sekunden später. Dann wurde meine 30-Sekunden-Testdatei auf 3 Sekunden Hochgeschwindigkeitsbilder komprimiert.
Wie kann ich mein ffmpeg so konfigurieren, dass es die mp4 korrekt überträgt (natürlich in einem Durchgang)? Es scheint, als würde es rohes h264 streamen. Wenn das der Fall ist, wie kann ich den mp4-Container erzwingen? Ich dachte, ich mache das mit '-f mp4'
Meine korrekten Einstellungen sind:
'-crf 22','-c:v libx264','-f mp4','-movflags','faststart+frag_keyframe'
Ich habe auch versucht:
'-r 30','-crf 30','-analyzeduration 0','-probesize 1000','-rc_lookahead 0','-fflags nobuffer','-g 75','-ss 0','-threads 0','-vcodec libx264','-qcomp 0.6','-qmin 10','-qmax 51','-qdiff 4','-b:v 400k','-maxrate 400k','-bufsize 800k','-acodec mp3','-ab 192k','-ar 44100','-tune zerolatency','-f mp4','-movflags','faststart+frag_keyframe'
Wie Sie an den vielen Optionen sehen können, die ich ausprobiert habe, bin ich ziemlich verzweifelt. Im Grunde laufe ich nur im Dunkeln herum.
Ich denke nicht, dass es wichtig ist, aber dies sind meine Anfrage-Header:
res.writeHead(200, {
'Content-Type':'video/mp4',
'Content-Length':stat.size,
'Content-Range':'bytes '+start+'-'+end+'/'+stat.size,
'Transfer-Encoding':'chunked'
});
FFmpeg-Protokoll:
file conversion error ffmpeg version N-52458-gaa96439 Copyright (c) 2000-2013 the FFmpeg developers
built on Apr 24 2013 22:19:32 with gcc 4.8.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable
-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwola
me --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 52. 27.101 / 52. 27.101
libavcodec 55. 6.100 / 55. 6.100
libavformat 55. 3.100 / 55. 3.100
libavdevice 55. 0.100 / 55. 0.100
libavfilter 3. 60.101 / 3. 60.101
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Input #0, avi, from 'C:/temp/avatar.avi':
Metadata:
encoder : Nandub v1.0rc2
Duration: 00:01:09.78, start: 0.000000, bitrate: 1517 kb/s
Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 640x352, 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 222 kb/s
[libx264 @ 0218d480] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0218d480] profile High, level 3.0
[libx264 @ 0218d480] 264 - core 130 r2274 c832fe9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16
chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 w
eightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=23 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=22.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'pipe:1':
Metadata:
encoder : Lavf55.3.100
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 640x352, q=-1--1, 11988 tbn, 23.98 tbc
Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, s16, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (msmpeg4 -> libx264)
Stream #0:1 -> #0:1 (mp3 -> libvo_aacenc)
Press [q] to stop, [?] for help
frame= 103 fps=0.0 q=27.0 size= 0kB time=00:00:04.70 bitrate= 0.1kbits/s
frame= 162 fps=161 q=27.0 size= 278kB time=00:00:07.15 bitrate= 317.9kbits/s
frame= 214 fps=141 q=27.0 size= 463kB time=00:00:09.33 bitrate= 406.3kbits/s
frame= 277 fps=137 q=27.0 size= 673kB time=00:00:11.95 bitrate= 461.3kbits/s
frame= 334 fps=132 q=27.0 size= 826kB time=00:00:14.32 bitrate= 472.5kbits/s
frame= 386 fps=127 q=27.0 size= 1061kB time=00:00:16.52 bitrate= 526.2kbits/s
frame= 428 fps=120 q=27.0 size= 1061kB time=00:00:18.27 bitrate= 475.9kbits/s
frame= 472 fps=116 q=27.0 size= 1061kB time=00:00:20.08 bitrate= 432.9kbits/s
frame= 525 fps=115 q=27.0 size= 1562kB time=00:00:22.30 bitrate= 573.7kbits/s
frame= 589 fps=116 q=27.0 size= 1804kB time=00:00:24.99 bitrate= 591.4kbits/s
frame= 690 fps=124 q=27.0 size= 1804kB time=00:00:29.19 bitrate= 506.2kbits/s
frame= 827 fps=136 q=27.0 size= 2191kB time=00:00:34.91 bitrate= 514.1kbits/s
frame= 921 fps=140 q=27.0 size= 2540kB time=00:00:38.81 bitrate= 536.1kbits/s
frame= 1015 fps=143 q=27.0 size= 2540kB time=00:00:42.74 bitrate= 486.9kbits/s
frame= 1124 fps=148 q=27.0 size= 3531kB time=00:00:47.30 bitrate= 611.5kbits/s
frame= 1248 fps=154 q=27.0 size= 3727kB time=00:00:52.46 bitrate= 581.9kbits/s
frame= 1371 fps=160 q=27.0 size= 4251kB time=00:00:57.58 bitrate= 604.7kbits/s
frame= 1516 fps=167 q=27.0 size= 4684kB time=00:01:03.62 bitrate= 603.0kbits/s
frame= 1632 fps=170 q=27.0 size= 4932kB time=00:01:08.46 bitrate= 590.1kbits/s
frame= 1673 fps=167 q=2686559.0 Lsize= 5507kB time=00:01:09.76 bitrate= 646.6kbits/s
video:4385kB audio:1091kB subtitle:0 global headers:0kB muxing overhead 0.582195%
[libx264 @ 0218d480] frame I:17 Avg QP:18.90 size: 11501
[libx264 @ 0218d480] frame P:1467 Avg QP:21.41 size: 2825
[libx264 @ 0218d480] frame B:189 Avg QP:24.42 size: 788
[libx264 @ 0218d480] consecutive B-frames: 84.5% 1.0% 1.4% 13.2%
[libx264 @ 0218d480] mb I I16..4: 21.5% 75.6% 2.9%
[libx264 @ 0218d480] mb P I16..4: 1.0% 2.8% 0.2% P16..4: 39.6% 13.7% 8.2% 0.0% 0.0% skip:34.6%
[libx264 @ 0218d480] mb B I16..4: 0.1% 0.3% 0.1% B16..8: 37.3% 2.6% 0.4% direct: 0.8% skip:58.4% L0:44.0% L1:51.7% BI: 4.3%
[libx264 @ 0218d480] 8x8 transform intra:70.8% inter:82.9%
[libx264 @ 0218d480] coded y,uvDC,uvAC intra: 58.7% 53.9% 12.8% inter: 20.2% 19.7% 0.4%
[libx264 @ 0218d480] i16 v,h,dc,p: 62% 16% 9% 13%
[libx264 @ 0218d480] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 14% 30% 3% 5% 6% 4% 5% 4%
[libx264 @ 0218d480] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 34% 13% 11% 4% 10% 11% 7% 6% 3%
[libx264 @ 0218d480] i8c dc,h,v,p: 44% 19% 33% 4%
[libx264 @ 0218d480] Weighted P-Frames: Y:0.1% UV:0.0%
[libx264 @ 0218d480] ref P L0: 69.0% 16.7% 10.2% 4.0% 0.0%
[libx264 @ 0218d480] ref B L0: 86.1% 10.0% 3.9%
[libx264 @ 0218d480] ref B L1: 92.9% 7.1%
[libx264 @ 0218d480] kb/s:514.67
Mein genauer nodejs-Befehl mit Testfällen, die ich verwendet habe (die auskommentiert sind):
, proc = new ffmpeg({
source: movie,
nolog: true,
timeout:15000
})
.addOptions(['-crf 22','-c:v libx264','-f mp4','-movflags','faststart+frag_keyframe'])
//.addOptions(['-threads 0', '-i_qfactor 0.71', '-qcomp 0.6', '-qmin 10', '-qmax 63', '-qdiff 4', '-trellis 0', '-vcodec libx264', '-s 640x360', '-b:v 1000k', '-b:a 56k','-ar 22050','-f mp4','-movflags','faststart+frag_keyframe'])
//.addOptions(['-r 30','-crf 30','-analyzeduration 0','-probesize 1000','-rc_lookahead 0','-fflags nobuffer','-g 75','-ss 0','-threads 0','-vcodec libx264','-qcomp 0.6','-qmin 10','-qmax 51','-qdiff 4','-b:v 400k','-maxrate 400k','-bufsize 800k','-acodec mp3','-ab 192k','-ar 44100','-tune zerolatency',metaDuration,tDuration,'-f mp4','-movflags','faststart+frag_keyframe'])
.writeToStream(res, function(retcode, error){
if (!error){
console.log('file has been converted succesfully',retcode .green);
}else{
console.log('file conversion error',error .red);
}
});
Mein Frontend-Player ist ein einfacher HTML5-Player mit VideoJS (für Theming und Steuerungsmöglichkeiten).
<video id="player" class="video-js vjs-default-skin" controls preload="both" width="100%" height="100%"><source src="'+url+'" type="video/mp4"></video>
quelle
Antworten:
Hast du überprüft, ob die Bildrate des Originalvideos mit deinen anderen Einstellungen übereinstimmt? Auch das Quellvideo, wenn es zu Beginn 48 kHz hat, wenn Sie zum Codieren gehen, kann die Verschiebung verursachen, die Sie sehen, wenn Sie versuchen, die Ausgabe auf 44,1 kHz zu bringen. Stellen Sie sicher, dass die eingehende Datei ebenfalls 44.1 lautet
quelle
Die Antwort mag etwas spät sein, aber haben Sie versucht, die Option '-re' zu verwenden?
Wenn Sie es nicht verwenden, wird versucht, das Video so schnell wie möglich zum Ziel zu streamen.
Mit -re liest du die Datei mit ihrer nativen Bildrate und somit wird sie auch mit der Wiedergabegeschwindigkeit des Videos übertragen.
quelle