asticode/go-astiav
Golang ffmpeg and libav C bindings
go-astiav를 사용하면 Go 프로그램이 C 코드를 작성하지 않고도 FFmpeg(오디오, 비디오, 이미지 처리를 위한 강력한 오픈소스 도구)를 사용할 수 있습니다. 이는 Go를 FFmpeg의 C 라이브러리에 연결하여 수행하지만, 저수준 API를 Go 개발자가 자연스럽게 기대하는 스타일로 재구성합니다.
기능
- Go 함수 뒤에 수천 가지 FFmpeg 기능(디코딩, 인코딩, 필터링, 스케일링 등)을 제공합니다. C 포인터와 메모리 규칙을 다루는 대신, Go 코드는 익숙한 방식으로 데이터를 읽고 씁니다.
- 관용적인 것에 초점을 맞춥니다: 오류는 Go 표준
if err != nil패턴을 따르고, 상수와 플래그는 타입화되며, 메서드는 느슨한 C 함수가 아닌 구조체로 그룹화됩니다. - FFmpeg 공식 예제를 미러링한 예제 프로그램을 제공하며, 디먹싱(미디어 컨테이너를 스트림으로 분할), 비디오/오디오 디코딩, 필터링, 스케일링, 트랜스코딩, 하드웨어 가속과 같은 주제를 다룹니다.
- 완전히 테스트됨(README는 이를 완료된 목표로 나열).
호환성
- FFmpeg 버전
n9.0에서만 작동하며, 이전 또는 이후 릴리스에서는 작동하지 않습니다. - 자체 API에 대한 주요 변경은 일반적인
v2Go 모듈 버전 업 없이 발생합니다. 별도의 변경 로그가 이를 추적합니다.
메모리 관리 패턴
README는 핵심 패턴을 설명합니다: 미디어 프레임이나 패킷을 읽을 때 객체를 한 번 할당하고, 루프에서 재사용한 다음 명시적으로 해제합니다. 예:
pkt := astiav.AllocPacket()– 패킷을 한 번 할당합니다.defer pkt.Free()– 완료 시 해제되도록 보장합니다.- 루프 내에서
formatContext.ReadFrame(pkt)를 호출하여 재사용된 패킷을 채우고,defer pkt.Unref()로 진행하기 전에 주입된 데이터를 정리합니다.
이를 통해 개발자는 메모리 사용을 제어하면서 리소스가 해제되는 시점을 코드에서 명확히 할 수 있습니다.
설치
- 특정 설정으로 FFmpeg를 소스에서 빌드해야 합니다. 프로젝트는 이를 위한 Dockerfile 예제를 보여주고, Go 빌드 도구가 FFmpeg 라이브러리를 찾을 수 있도록 환경 변수(
CGO_CFLAGS,CGO_LDFLAGS,PKG_CONFIG_PATH)를 설정하도록 안내합니다. - Windows에서는 MSYS2/Mingw64의 GCC 툴체인과
pkg-config,make,nasm같은 패키지가 필요합니다. README는 단계별 명령을 제공합니다.
이 프로젝트가 존재하는 이유
저자는 이전에 오래된 Go-FFmpeg 바인딩의 인기 있는 포크인 goav를 유지 관리했지만, 해결되지 않은 문제가 너무 많다고 느꼈습니다. 계속 패치하는 대신, 더 깨끗하고 Go 관용적인 디자인으로 이러한 문제를 해결하기 위해 go-astiav를 처음부터 작성했습니다.
요약: go-astiav는 FFmpeg의 풍부한 미디어 처리 능력을 Go 코드에 가져오는 특수 목적의 브리지로, 현대적인 Go API, 테스트된 예제, 그리고 FFmpeg n9.0에 대한 명확한(그러나 더 엄격한) 호환성 스토리를 제공합니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트