2026, 새로운 도약을 시작합니다.

gif 파일을 mp4로 변환 (ffmpeg 필요함)

gittomp4.png

2038888542_1597380995.7764.gif

게시판 보기 페이지에서

gif 파일을 mp4 파일로 변환하여 출력하는 코드입니다.

서버에 ffmpeg 가 설치되어 있어야 gif 파일을 mp4로 변환할수 있습니다. ( 웹호스팅 환경에서 사용불가 )

그누보드버전은 5.4.2.8 버전 이상에서만 이 코드가 동작합니다.

SIR 사이트에는 이 코드가 적용되어 있습니다.

사용방법은 파일을 그대로 덮어쓰기하면 됩니다.

------ 수정 히스토리 --------

2020년 12월 4일, 에디터로 쓴글 삭제시 mp4 파일이 삭제되는 않는 문제 수정

버전 정보

테스트한 버전 5.4.2.8
호환 가능 버전 5.4.2.8 버전 이상

첨부파일

gittomp4.png (842 bytes)
0회 2020-08-14 13:55
gif2mp4.zip (3.1 KB) 254회 2020-12-04 14:23
|

댓글 26개

대박!! 공식 플러그인이 나왔군요!!!
역시 @thisgun 님입니다. 맛있는 커피라도 사드리고 싶네요
도커를 사용하시는 분은 ffmpeg설치보다는 https://hub.docker.com/r/jrottenberg/ffmpeg/ 이것을 사용하세요.

[code]
@exec('ffmpeg -i '.escapeshellcmd(preg_replace('/[^0-9A-Za-z_\-\.\\\\\/]/i', '', $filename)).' -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -pix_fmt yuv420p -movflags +faststart '.escapeshellcmd(preg_replace('/[^0-9A-Za-z_\-\.\\\\\/]/i', '', $mp4_file)));
[/code]



[code]
@exec('docker run -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:4.3-alpine -i '.escapeshellcmd(preg_replace('/[^0-9A-Za-z_\-\.\\\\\/]/i', '', $filename)).' -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -pix_fmt yuv420p -movflags +faststart '.escapeshellcmd(preg_replace('/[^0-9A-Za-z_\-\.\\\\\/]/i', '', $mp4_file)));
[/code]

을 하면 될것 같습니다. ffmpeg 실행이 Docker안에서 바로 됩니다.

도커 이미지가 자동다운로드 안되면

docker pull jrottenberg/ffmpeg:4.3-centos 식으로 미리 다운로드 하시면 됩니다.
위의 것은 alpine리눅스이고 지금 예제는 centos입니다.

편하신 리눅스 패키지로 변경하시면 됩니다. 알파인 리눅스를 많이 사용하는 이유는 이미지 크기가 작다고 합니다.
최고네요!!!

그누보드 도커 잡을 때 꼭 넣어야겠네요.
도커에서 해보려고 했는데...

1. 호스트에서 ffmpeg 패키지 설치 후 도커에 있는 그누보드에서 원본파일 그대로 실행했을 시

[code]
sh: ffmpeg: not found
[/code]

Nginx에서는 mp4 파일을 받아오려고 하지만, php에서는 명령어 실행이 안됨

2. 호스트의 ffmpeg 패키지 삭제 후 말씀하신대로 Docker 이미지 받아서 그대로 실행했을 때

[code]
sh: docker: not found
[/code]

마찬가지로 docker라는 명령어를 발견할 수 없다고 합니다.

3. docker-compose로 ffmpeg 이미지를 데몬으로 실행

그냥 실행되고 있으니

[code]
@exec('docker exec ffmpeg -i '.escapeshellcmd(preg_replace('/[^0-9A-Za-z_\-\.\\\\\/]/i', '', $filename)).' -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -pix_fmt yuv420p -movflags +faststart '.escapeshellcmd(preg_replace('/[^0-9A-Za-z_\-\.\\\\\/]/i', '', $mp4_file)));
[/code]

이렇게 했더니

[code]
sh: docker: not found
[/code]

마찬가지로 이렇게 나옵니다.

php-fpm:alpine 이미지 문제인지, 잘 모르겠네요.
@exec에서 docker, ffmpeg이 실행이 안된다고 하면 당연히 path에서 못불러 오겠죠.
정확한 path를 넣어 줘 보세요
정확한 path를 어떻게 찾아야할까요?

docker 간에 서로를 찾아야 하는데... volume을 공유해도 안되고..

depend를 걸어도 안되고... 같은 네트워크에 있어도 안되고 어렵네요.
ffmpeg 는 cafe24의 경우 설치 요청을 하면 사용자 홈디렉토리에 설치해 줍니다.
웹호스팅도 설치 가능한가요?

완전 혜자네요.
이걸 5.3.3.3 버전에서 사용할 방법은 없을까요?
[http://sir.kr/data/editor/2008/44da2bde692f193f25b3f6d7f242e649_1597372502_0101.jpg]

업데이트 하세요...
데이트 하는 마음이 생기실겁니다.
감사합니다 호스팅환경이라 적용은 불가능하네요 ㅠㅠ 나중에 적용 시도 해봐야겠습니다
호스팅에 ffmpeg 설치해달라고 요청하면 되지 않을까요?

카페24는 된다고 하더라구요.
서버호스팅일경우 가능합니다 제 경우는 그냥 일반 웹호스팅이라.. 안돼요 ㅠㅠㅎㅎ
와... 정말 멋진 플러그인이네요.
하지만... 웹호스팅 인생이라서...
음.. 포스터 gif 파일은 생성되는데 mp4 파일이 생성이 안되네요.

수동으로 ffmpeg 명령어를 내리거나, 도커 이미지를 활용했을땐 잘 되거든요.

왜 안될까요?

그누보드 최신버전 순정 테마, 순정 게시판, 갤러리에 첨부파일과 스마트에디터를 통해서 업로드 모두 해보았습니다.
php exec 명령어가 실행할수 있는 환경이어야 합니다.

https://stackoverflow.com/questions/24999673/how-to-enable-shell-exec-and-exec-on-php
도커의 php 환경이 문제였나봅니다. 실제서버에 돌려보니 잘 돌아갑니다.

아마 php의 disable_functions에 exec가 들어가있는 것 같습니다.

순정에 적용해보니 문제점(?)이 2가지 있는데요.

1. 게시글 내에서는 MP4로 잘 재생이 됩니다.

그런데 썸네일에는 여전히 움짤gif가 표시되어 MP4로 출력하는 의미가 없는 것 같습니다.

gif 움짤이 업로드 되었을땐 썸네일이 mp4로 변환된 파일이 자동재생되면 좋을 것 같습니다.

현재 SIR 사진 게시판처럼 썸네일에도 mp4 재생되게 하는 방법이 있을까요?

thumbnail.lib.php를 만져보았지만 잘 안되되더라구요 ㅜ ㅜ

2. 첨부파일로 움짤gif를 넣으니 클릭이 가능해서 클릭하면 원본 gif가 나오더라구요. 클릭이 안되게하는 것이 좋을 것 같습니다.

에디터로 올리면 클릭이 안되고 첨부파일로 올리면 클릭이 되는데, 어떻게 작업하면 움짤을 첨부파일로 올렸을때 클릭이 안되게 할 수 있을까요?
나리야에서 사용 가능한지 궁금합니다.~!~~~
나리야에서도 가능할 것 같은데요.

아직 나리야 게시판 플러그인이 그누 최신버전 업데이트 이후 반영이 안되어서 기다리고 있어요.
플러그인 적용했는데 에디터로 올린경우 글 삭제시 원본 gif만 삭제되고 변환된 mp4 는 그대로 남아있네요. 이것도 같이 삭제할수 없나요?
네 알려 주셔서 감사합니다.

그 문제를 수정해서 다시 올려놓았으니, 다시 받아서 수정해 주세요.

안녕하세요 ffmpeg 명령어 설치 했고 파일을 /extend 에 올려놓고선 

gif 파일을 첨부 해보니깐 이미지 자체가 출력이 안되고 

파일 다운로드로 나오는건 어떤문제 인가요? 제가 초보라 답답하네요

f054c3bfd0938316fbb9550ea624c3e0_1697092300_3819.jpg

스킨은 처음 다운 받은 basic 이며 gnuboard5.5.8.3.3 버젼입니다

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기
🐛 버그신고