package ffmpeg import ( "rkkvm/config" "rkkvm/external/process" ) //h264 //ffmpeg -re -i /dev/video0 -c:v h264_rkmpp -b:v 2000000 -bsf:v h264_mp4toannexb -g 10 -f rtp rtp://127.0.0.1:5004?pkt_size=1200 //h265 //ffmpeg -re -i /dev/video0 -c:v hevc_rkmpp -b:v 2000000 -g 10 -f rtp rtp://127.0.0.1:5004?pkt_size=1200 // vp8 //ffmpeg -re -i /dev/video0 -c:v libvpx -crf 10 -b:v 3M -deadline 1 -g 10 -error-resilient 1 -auto-alt-ref 1 -an -f rtp rtp://127.0.0.1:5004?pkt_size=1200 /* arecord -D hw:0,0 -f cd -r 44100 -c 2 | /app/ffmpeg -re -init_hw_device rkmpp=hw -filter_hw_device hw \ -f wav -thread_queue_size 4096 -i pipe:0 -f v4l2 -i /dev/video0 \ -vf hwupload,scale_rkrga=h=720:force_original_aspect_ratio=1 \ -c:v h264_rkmpp -flags +low_delay -b:v 6000000 -framerate 60 -g 10 \ -map 0:a -c:a aac -b:a 128k -ar 44100 -ac 2 -f rtp rtp://127.0.0.1:5006?pkt_size=1200 \ -map 1:v -f rtp rtp://127.0.0.1:5004?pkt_size=1200 arecord -D hw:0,0 -f cd -r 44100 -c 2 | /app/ffmpeg -re -f wav -i pipe:0 -c:a aac -b:a 128k -ar 44100 -ac 2 -f rtp rtp://127.0.0.1:5006?pkt_size=1200 arecord -D hw:0,0 -f dat -r 48000 -c 2 --buffer-size=60 | /app/ffmpeg -re -init_hw_device rkmpp=hw -filter_hw_device hw \ -f wav -i pipe:0 -map 0:a -c:a libopus -b:a 48000 -sample_fmt s16 -ssrc 1 -payload_type 111 -f rtp -max_delay 0 -application lowdelay \ -f rtp rtp://127.0.0.1:5006?pkt_size=1200 \ -i /dev/video0 -map 1:v -vf hwupload,scale_rkrga=h=720:force_original_aspect_ratio=1 -c:v h264_rkmpp -flags +low_delay -b:v 6000000 -framerate 60 -g 10 \ -f rtp rtp://127.0.0.1:5004?pkt_size=1200 */ // https://jsfiddle.net/z7ms3u5r/ var ffmpeg *FFmpeg type FFmpeg struct { *process.PipedCmd config.FFmpeg } func (f *FFmpeg) getCmd() string { return f.Commands[config.StreamInputVideoAudio] } func (f *FFmpeg) SetBitrate(b int) { f.Bitrate = b if f.Bitrate < 0 { f.Bitrate = 6000 } } func (f *FFmpeg) SetFPS(fps int) { f.FPS = fps if f.FPS < 0 { f.FPS = 30 } else if f.FPS > 60 { f.FPS = 60 } } func (f *FFmpeg) SetResolution(height int) { f.Height = height if f.Height <= 0 { f.Height = 1080 } else if f.Height > 2060 { f.Height = 2060 } } func (f *FFmpeg) SetGOP(gop int) { f.GOP = gop if f.GOP < 0 { f.GOP = 2 } } func (f *FFmpeg) ApplyOptions() { f.ChangeCmd(f.FormatCmd(f.getCmd())) } func InitFFmpeg() *FFmpeg { cfg := config.Get().Video cmd := cfg.Commands[config.StreamInputVideoAudio] ffmpeg = &FFmpeg{ PipedCmd: process.InitPipedCmd(cfg.FormatCmd(cmd)), FFmpeg: cfg, } return ffmpeg } func GetFFmpeg() *FFmpeg { return ffmpeg }