
데이터베이스에 저장된 SVG 그래픽으로 비디오를 만들고 싶습니다. 내 절차는 다음과 같습니다.
- 데이터베이스에 연결
- 파이프를 입력으로 사용하는 ffmpeg 명령 만들기
- ffmpeg 하위 프로세스 생성
- 프로세스의 출력을 기다립니다.
다른 스레드를 시작하십시오. 모든 svg 파일에 대해 다음을 수행하십시오.
- 데이터베이스에서 svg를 바이트 버퍼로 다운로드
- ffmpeg 하위 프로세스의 stdin에 바이트 버퍼를 씁니다.
내 코드를 실행할 때 svg 파일을 ffmpeg로 파이프할 때 문제가 발생합니다.
나는 ffmpeg -f image2pipe -c:v svg -i - -c:v libx264 -y Downloads/out.mp4
. 그런데 ffmpeg에서 다음 오류가 발생합니다.
[image2pipe @ 0x562ebd74c300] Could not find codec parameters for stream 0 (Video: svg (librsvg), none): unspecified size
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
ffmpeg에 형식이 있다는 것을 알았 svg_pipe
으므로 시도해 보았으나 성공하지 못했습니다. 동일한 오류가 발생했습니다.
또 다른 가능성은 모든 svg 파일을 임시 디렉토리에 다운로드한 다음 시도했을 때 작동했던 파이프 없이 ffmpeg를 사용하는 것입니다. 명령은 다음과 같습니다. ffmpeg -i *.svg -c:v libx264 out.mp4
하지만 제 경우에는 이것을 피하고 싶습니다.
파이프되지 않은 명령은 작동하고 파이프된 명령(예: cat sample.svg | ffmpeg -f svg_pipe -i - -c:v libx264 out.mp4
)은 실패하는 이유는 무엇입니까? 내 경우에는 어떻게 파이프를 사용할 수 있나요?
내 현재 솔루션:
나는 -f rawvideo
그래픽을 ffmpeg로 파이프하기 위해 인수를 사용합니다. 이는 작동하는 솔루션이지만 svg 그래픽을 원시 RGB 형식으로 변환해야 한다고 가정합니다. 나는 이것 에서이 솔루션을 가져 왔습니다.답변스택오버플로우에서.
답변1
몇 번의 시행착오를 거쳐 나는 작동하는 일련의 주장을 찾았습니다.
cat sample.svg | ffmpeg -f svg_pipe -frame_size 1000000000 -video_size 100x100 -i - -c:v libx264 -y out.mp4
svg_pipe
다음 명령을 실행하여 demuxer 의 옵션을 얻을 수 있습니다 :
ffmpeg -h demuxer=svg_pipe
산출:
Demuxer svg_pipe [파이프된 svg 시퀀스]:
svg demuxer AVOptions:
-frame_size .D........ 강제 프레임 크기(0에서 INT_MAX)(기본값 0)
-framerate <video_rate> .D... ...... 비디오 프레임 속도 설정(기본값 "25")
-pixel_format .D........ 비디오 픽셀 형식 설정
-video_size <image_size> .D........ set 비디오 크기
-loop .D........입력 파일 시퀀스에 대한 강제 루프(기본값 false)
어떤 이유로 우리는 -frame_size
인수를 입력 파일의 크기보다 크게 설정해야 합니다.
H.264 코덱은 투명도를 지원하지 않으므로 대부분의 경우 출력이 이상하게 보일 것입니다(기본 배경색은 검은색입니다).
흰색 배경에 SVG를 오버레이하는 것을 고려해보세요.
예(Ubuntu 18.04에서 FFmpeg 버전 n4.3.1 사용):
입력:
https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/atom.svg