Ich versuche, mit dem folgenden Befehl ein Video des iOS-Simulators aufzunehmen;
./fbsimctl stream --bgra --fps 12 - | ffmpeg -f rawvideo -pix_fmt bgra -s 414x736 -framerate 12 -i - -f h264 -r 12 - | ffplay -
Das Problem besteht darin, dass das resultierende Video verstümmelt ist.
Es scheint, als ob ffmpeg das BGRA-Format nicht richtig konvertiert.
Gibt es noch andere Parameter, die ich übergeben muss?
In der Mitte der unten eingefügten Beispielausgabe befindet sich eine Warnung:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264)) [swscaler @ 0x7f8342009000] Warning: data is not aligned! This can lead to a speed loss
Hier ist die Beispielausgabe;
./fbsimctl stream --bgra --fps 12 - | ffmpeg -f rawvideo -pix_fmt bgra -s 414x736 -framerate 12 -i - -f h264 -r 12 - | ffplay -
ffmpeg version 4.0.2ffplay version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers Copyright (c) 2003-2018 the FFmpeg developers
built with Apple LLVM version 9.1.0 (clang-902.0.39.2)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.0.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-ffplay --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma
built with Apple LLVM version 9.1.0 (clang-902.0.39.2)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.0.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-ffplay --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma
libavutil 56. 14.100 / 56. 14.100
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libavfilter 7. 16.100 / 7. 16.100
libavresample 4. 0. 0 / 4. 0. 0
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 1.100 / 5. 1.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
libpostproc 55. 1.100 / 55. 1.100
Running /usr/bin/xcode-select --print-path with environment {
HOME = "/Users/sumancherukuri";
PATH = "/Users/sumancherukuri/Projects/webrtc/webrtc_ios/depot_tools:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin";
}
Connection Did Connect => Bridge: Framebuffer ((null)) | HID (null) | (null)
079C6C51-C335-4273-A566-7D0667693F99 | iPhone X | Booted | iPhone X | iOS 11.4 | x86_64: launch: Bridge: Framebuffer ((null)) | HID (null) | (null)
Mounting Surface with Attributes: {
format = BGRA;
"frame_size" = 11069184;
height = 2436;
"row_size" = 4544;
width = 1125;
}
Input #0, rawvideo, from 'pipe:':
Duration: N/A, start: 0.000000, bitrate: 117006 kb/s
Stream #0:0: Video: rawvideo (BGRA / 0x41524742), bgra, 414x736, 117006 kb/s, 12 tbr, 12 tbn, 12 tbc
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
[swscaler @ 0x7f8342009000] Warning: data is not aligned! This can lead to a speed loss
[libx264 @ 0x7f8343801800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7f8343801800] profile High 4:4:4 Predictive, level 2.2, 4:4:4 8-bit
Output #0, h264, to 'pipe:':
Metadata:
encoder : Lavf58.12.100
Stream #0:0: Video: h264 (libx264), yuv444p, 414x736, q=-1--1, 12 fps, 12 tbn, 12 tbc
Metadata:
encoder : Lavc58.18.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
listen started: Streaming Video
frame= 56 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= frame= 79 fps= 77 q=26.0 size= 950kB time=00:00:01.75 bitrate=4448.9kbits/frame= 116 fps= 76 q=26.0 size= 2501kB time=00:00:04.83 bitrate=4239.1kbits/Input #0, h264, from 'pipe:':q= 0KB vq= 0KB sq= 0B f=0/0
Duration: N/A, bitrate: N/A
Danke,
-Suman
Antwort1
Das Problem besteht darin, dass das resultierende Video verstümmelt ist.
Ich bin heute auf genau dasselbe Problem gestoßen. Die Ursache ist, dass die Ausgabe von fbsimctl bgra im BMP-Dateiformat erfolgt und jedes Bildarray mit 0 aufgefüllt wird, sodass seine Länge ein Vielfaches von 4 wird (siehehttps://en.wikipedia.org/wiki/BMP-Dateiformatfür Einzelheiten).
Durch Erweitern der angegebenen Bildgröße auf ein Vielfaches von 4 konnte ich dieses Problem lösen. In Ihrem Fall sollten Sie zu -s 414x736
ändern -s 416x736
.
Antwort2
Achtung: Daten werden nicht ausgerichtet! Dies kann zu einem Geschwindigkeitsverlust führen
Dies bedeutet, dass eine der Eingabe- oder Ausgabedimensionen beim Skalieren kein ganzzahliges Vielfaches von 16 ist.
Der beschleunigte Skalierungscode von ffmpeg (z. B. MMX oder SSE) verhält sich beim Kodieren nicht optimal, d. h. er kann langsam sein. Das ist kein Grund zur Sorge und auch nichts, wogegen Sie etwas unternehmen müssen.
Natürlich können Sie hier überhaupt nichts tun, wenn die Eingabedatei Videoabmessungen aufweist, die kein genaues Vielfaches von 16 sind. Nur die Ausgabeabmessungen können vom Benutzer gesteuert werden.
In einer anderen hier geposteten Antwort wird vorgeschlagen, eine Dimension um 4 zu ändern. Der Punkt ist jedoch, dass der ffmpeg-Code erfordert, dass die Dimensionen genaue Vielfache nicht von vier, sondern von sechzehn sind.