오디오 및 비디오 처리 및 스트리밍 미디어 개발에 Go 언어를 사용하는 방법
소개:
인터넷의 급속한 발전과 네트워크 대역폭의 지속적인 향상으로 오디오 및 비디오의 응용이 점점 더 널리 보급되고 있습니다. 높은 동시성, 고성능 프로그래밍 언어로서 Go 언어는 점차 개발자들의 관심을 끌었습니다. 이 기사에서는 오디오 및 비디오 형식 처리, 오디오 및 비디오 인코딩 및 디코딩, 오디오 및 비디오 전송 및 스트리밍, 스트리밍 미디어 서버 구축 등을 포함하여 오디오 및 비디오 처리 및 스트리밍 미디어 개발에 Go 언어를 사용하는 방법을 소개합니다. .
1. 오디오 및 비디오 형식 처리
오디오 및 비디오 처리에서 일반적인 오디오 및 비디오 형식에는 MP3, AAC, WAV, FLV, MP4 등이 포함됩니다. Go 언어는 이러한 오디오 및 비디오 형식을 쉽게 처리할 수 있는 몇 가지 뛰어난 라이브러리를 제공합니다. 다음은 MP3 파일 처리를 예로 들어 설명합니다.
Go 언어에서는 타사 라이브러리 "github.com/hajimehoshi/go-mp3"를 사용하여 MP3 파일을 처리할 수 있습니다. 먼저 라이브러리를 설치해야 합니다.
go get github.com/hajimehoshi/go-mp3/mp3
다음으로 다음 코드 예제를 사용하여 MP3 파일을 읽고 오디오 데이터를 출력합니다.
package main
import (
"fmt" "github.com/hajimehoshi/go-mp3/mp3" "github.com/hajimehoshi/oto" "os"
)
func main() {
file, err := os.Open("test.mp3") if err != nil { fmt.Println("Open file failed:", err) return } defer file.Close() decoder, err := mp3.NewDecoder(file) if err != nil { fmt.Println("NewDecoder failed:", err) return } pcm, err := oto.NewPlayer(decoder.SampleRate(), 2, 2, 8192) if err != nil { fmt.Println("NewPlayer failed:", err) return } defer pcm.Close() fmt.Println("Playing...") buffer := make([]byte, 8192) for { n, err := decoder.Read(buffer) if err != nil { fmt.Println("Read failed:", err) break } if n == 0 { break } pcm.Write(buffer[:n]) } fmt.Println("Done.")
}
위 코드에서는 mp3.NewDecoder 함수를 사용하여 MP3 디코더를 생성하고 oto.NewPlayer 함수를 통해 오디오 플레이어를 생성합니다. 그런 다음 Read 메서드를 통해 오디오 데이터를 읽고, Write 메서드를 통해 재생할 오디오 데이터를 플레이어에 씁니다.
2. 오디오 및 비디오 인코딩 및 디코딩
오디오 및 비디오 처리에서 인코딩 및 디코딩은 매우 중요한 부분입니다. Go 언어는 ffmpeg, opus, x264 등과 같은 뛰어난 인코딩 및 디코딩 라이브러리를 제공합니다. 이러한 라이브러리의 대부분은 Go 언어 캡슐화를 제공하며 비교적 사용이 간단합니다.
다음은 ffmpeg 라이브러리를 예로 들어 오디오 및 비디오 인코딩 및 디코딩에 Go 언어를 사용하는 방법을 소개합니다. 먼저 ffmpeg 라이브러리를 설치해야 합니다.
go get github.com/giorgisio/goav/avcodec
go get github.com/giorgisio/goav/avformat
그런 다음 다음 코드 예제를 사용하여 MP3 파일을 AAC로 인코딩합니다. 파일:
package main
import (
"github.com/giorgisio/goav/avcodec" "github.com/giorgisio/goav/avformat" "github.com/giorgisio/goav/avutil" "os"
)
func main() {
inputFile := "input.mp3" outputFile := "output.aac" // 注册所有的编解码器 avcodec.AvcodecRegisterAll() inputContext := avformat.AvformatAllocContext() if avformat.AvformatOpenInput(&inputContext, inputFile, nil, nil) < 0 { panic("Open input file failed.") } defer avformat.AvformatFreeContext(inputContext) if avformat.AvformatFindStreamInfo(inputContext, nil) < 0 { panic("Find stream info failed.") } audioStreamIndex := -1 for i := 0; i < len(inputContext.Streams()); i++ { if inputContext.Streams()[i].CodecParameters().CodecType() == avutil.AVMEDIA_TYPE_AUDIO { audioStreamIndex = i break } } codecParameters := inputContext.Streams()[audioStreamIndex].CodecParameters() codecId := codecParameters.CodecId() codec := avcodec.AvcodecFindDecoder(codecId) if codec == nil { panic("Find decoder failed.") } codecContext := avcodec.AvcodecAllocContext3(codec) if codecContext == nil { panic("Allocate codec context failed.") } defer avcodec.AvcodecFreeContext(codecContext) if avcodec.AvcodecParametersToContext(codecContext, codecParameters) < 0 { panic("Parameters to context failed.") } if avcodec.AvcodecOpen2(codecContext, codec, nil) < 0 { panic("Open codec failed.") } defer avcodec.AvcodecClose(codecContext) outputFileContext := avformat.AvformatAllocOutputContext2() if avformat.AvformatAllocOutputContext2(&outputFileContext, nil, "adts", outputFile) < 0 { panic("Allocate output context failed.") } defer avformat.AvformatFreeContext(outputFileContext) outputStream := avformat.AvformatNewStream(outputFileContext, nil) if outputStream == nil { panic("New stream failed.") } if avcodec.AvcodecParametersFromContext(outputStream.CodecParameters(), codecContext) < 0 { panic("Parameters from context failed.") } if outputStream.CodecParameters().CodecType() != avutil.AVMEDIA_TYPE_AUDIO { panic("Codec type is not audio.") } if avformat.AvioOpen(&outputFileContext.Pb(), outputFile, avformat.AVIO_FLAG_WRITE) < 0 { panic("Open output file failed.") } if avformat.AvformatWriteHeader(outputFileContext, nil) < 0 { panic("Write header failed.") } defer avformat.AvWriteTrailer(outputFileContext) packet := avcodec.AvPacketAlloc() defer avcodec.AvPacketFree(packet) for avcodec.AvReadFrame(inputContext, packet) >= 0 { if packet.StreamIndex() == audioStreamIndex { packet.SetPts(packet.Pts() * 2) packet.SetDts(packet.Dts() * 2) packet.SetDuration(packet.Duration() * 2) packet.SetPos(-1) if avcodec.AvInterleavedWriteFrame(outputFileContext, packet) < 0 { panic("Interleaved write frame failed.") } } avcodec.AvPacketUnref(packet) }
}
위 코드에서는 ffmpeg 라이브러리를 사용하여 입력 MP3 파일을 디코딩한 다음 인코딩을 디코딩합니다. 오디오 데이터를 저장하고 인코딩된 데이터를 출력 파일에 씁니다.
3. 오디오 및 비디오 전송 및 스트리밍
오디오 및 비디오 전송 및 스트리밍은 실시간 오디오 및 비디오 전송과 스트리밍 미디어 서비스를 구현하는 핵심이며 매우 복잡한 링크이기도 합니다. 현재 가장 일반적으로 사용되는 오디오 및 비디오 전송 프로토콜은 RTMP와 HLS입니다. Go 언어는 RTMP 및 HLS 프로토콜의 푸시 및 풀 스트리밍을 쉽게 구현할 수 있는 몇 가지 뛰어난 라이브러리를 제공합니다.
다음은 RTMP 프로토콜을 예로 들어 오디오 및 비디오 전송 및 스트리밍에 Go 언어를 사용하는 방법을 소개합니다. 먼저 rtmp 라이브러리를 설치해야 합니다.
go get github.com/gwuhaolin/livego/protocol/rtmp
go get github.com/gwuhaolin/livego/av/codec
go get github.com/gwuhaolin/livego/ Container
그런 다음 다음 코드 예제를 통해 카메라의 비디오 데이터를 RTMP 서버로 푸시합니다.
package main
import (
"github.com/gwuhaolin/livego/protocol/rtmp" "github.com/gwuhaolin/livego/av/codec" "github.com/gwuhaolin/livego/container" "os"
)
func main() {
inputFile := "/dev/video0" outputURL := "rtmp://localhost/live/stream" inputCodec := codec.NewVideoCodec(codec.H264) outputCodec := codec.NewVideoCodec(codec.H264) container := container.NewPushContainer(inputFile, inputCodec, outputURL, outputCodec) container.Push()
}
위 코드에서, 우리는 rtmp 라이브러리에서 제공하는 RTMPusher 클래스를 사용하여 카메라의 비디오 데이터를 RTMP 서버로 푸시합니다. 그 중 inputFile은 입력 파일(카메라 장치 파일)이고, outputURL은 푸시 주소입니다.
4. 스트리밍 미디어 서버 구축
스트리밍 미디어 개발에서 스트리밍 미디어 서버는 실시간 오디오 및 비디오 전송과 주문형 기능을 구현하는 핵심 구성 요소입니다. 현재 일반적으로 사용되는 스트리밍 미디어 서버에는 Nginx-rtmp, FFmpeg, GStreamer 등이 있습니다.
이 섹션에서는 Nginx-rtmp를 예로 들어 Nginx-rtmp를 사용하여 스트리밍 미디어 서버를 구축하는 방법을 소개합니다. Nginx-rtmp는 오디오 및 비디오 데이터를 RTMP 서버로 푸시할 수 있으며 RTMP 서버에서 오디오 및 비디오 데이터를 가져올 수도 있습니다.
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar zxf nginx-1.18.0.tar. gz
cd nginx-1.18.0
./configure --add-module=/path/to/nginx-rtmp-module
make
make install
rtmp {
server { listen 1935; chunk_size 4000; application live { live on; record off; } application hls { live on; hls on; hls_path /path/to/hls; hls_fragment 5s; hls_playlist_length 30s; } }
}
위 구성에서는 live와 hls라는 두 가지 애플리케이션을 정의했습니다. 그 중 라이브 애플리케이션은 실시간 오디오 및 비디오 전송에 사용되고, hls 애플리케이션은 주문형 서비스에 사용됩니다.
/path/to/nginx/sbin/nginx -c /path/to/nginx/conf/nginx.conf
푸시:
ffmpeg -re -i /path/to/source -c:v copy -c:a copy -f flv rtmp://localhost/live/stream
Play:
ffplay rtmp://localhost/live/stream
요약 :
이 글에서는 오디오 및 비디오 처리와 스트리밍 미디어 개발에 Go 언어를 사용하는 방법을 소개합니다. 오디오 및 비디오 형식 처리, 오디오 및 비디오 인코딩 및 디코딩, 오디오 및 비디오 전송 및 스트리밍, 스트리밍 미디어 서버 구축을 학습함으로써 오디오 및 비디오 기술을 더 잘 이해하고 적용하며 다양하고 풍부한 오디오 및 비디오를 구현할 수 있습니다. 응용 프로그램. 이 기사가 오디오 및 비디오 개발에 관심이 있는 독자들에게 도움이 되기를 바랍니다.
위 내용은 오디오 및 비디오 처리와 스트리밍 미디어 개발에 Go 언어를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!