다음 명령을 사용하여 iOS 시뮬레이터의 비디오를 녹화하려고 합니다.
./fbsimctl stream --bgra --fps 12 - | ffmpeg -f rawvideo -pix_fmt bgra -s 414x736 -framerate 12 -i - -f h264 -r 12 - | ffplay -
문제는 결과 비디오가 왜곡된다는 것입니다.
ffmpeg가 bgra 형식을 제대로 변환하지 못하는 것 같습니다.
전달해야 하는 다른 매개변수가 있나요?
아래에 붙여넣은 샘플 출력 중간에 경고가 있습니다.
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264)) [swscaler @ 0x7f8342009000] Warning: data is not aligned! This can lead to a speed loss
다음은 샘플 출력입니다.
./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
감사해요,
--수만
답변1
문제는 결과 비디오가 왜곡된다는 것입니다.
오늘도 똑같은 문제가 발생했습니다. 원인은 fbsimctl bgra 출력이 BMP 파일 스타일이고 각 이미지 배열이 0으로 채워져 길이가 4의 배수가 되기 때문입니다(참조:https://en.wikipedia.org/wiki/BMP_file_format자세한 내용은).
지정된 이미지 크기를 4의 배수로 확장하여 이 문제를 해결했습니다. 귀하의 경우에는 -s 414x736
로 변경해야 합니다 -s 416x736
.
답변2
경고: 데이터가 정렬되지 않았습니다! 이로 인해 속도 저하가 발생할 수 있습니다.
이는 크기 조정 시 입력 또는 출력 차원 중 하나가 16의 정수 배수가 아님을 의미합니다.
ffmpeg 가속 스케일링 코드(예: MMX 또는 SSE)는 인코딩 시 최적의 방식으로 작동하지 않습니다. 즉, 속도가 느릴 수 있습니다. 이는 걱정할 것도 없고 조치를 취할 필요도 없습니다.
물론 비디오 크기가 정확히 16의 배수가 아닌 입력 파일인 경우 이에 대해 할 수 있는 일은 전혀 없습니다. 출력 크기만 사용자가 제어할 수 있습니다.
여기에 게시된 또 다른 답변은 한 치수를 4로 변경하는 것을 제안하지만 요점은 ffmpeg 코드에서 치수가 4가 아닌 16의 정확한 배수가 되어야 한다는 것입니다.