Example.mp4
dependencies: [
.package(url: " https://github.com/William-Weng/WWStreamPlayer.git" , .upToNextMajor(from: " 0.6.2" ))
]
函式
功能
ffmpegVersion()
使用的FFMpeg編譯版本
duration(at:)
取得本地端影片長度
frame(at:second:)
取得本地端影音該時段的畫面
thumbnails(at:count:)
產生本地端影音縮圖 (平均時間)
playVideo(at:frame:failure:completion:)
播放RTSP串流 (使用frame圖片)
playVideo(at:displayLayer:elapseTime:failure:completion:)
播放RTSP串流 (使用AVSampleBufferDisplayLayer)
playVideo(at:pixelBuffer:failure:completion:)
播放RTSP串流 (使用CVPixelBuffer for MetalKit)
stopVideo(for:)
停止播放
playAudio(at:bufferSize:result:)
播放聲音串流
stopAudio()
停止播放聲音串流
final class ViewController : UIViewController {
@IBOutlet weak var ffmpegVersionLabel : UILabel !
@IBOutlet weak var videoTimeLabel : UILabel !
@IBOutlet weak var videoImageView : UIImageView !
private let rtsp = " rtsp://192.168.4.141:8554/mystream "
private let streamPlayer : WWStreamPlayer = . init( )
private var pcmData : Data = . init( )
override func viewDidAppear( _ animated: Bool ) {
super. viewDidAppear ( animated)
ffmepgVersion ( )
}
@IBAction func playVideo( _ sender: UIBarButtonItem ) {
playRtspSteam ( at: rtsp)
}
}
private extension ViewController {
func ffmepgVersion( ) {
let version = streamPlayer. ffmpegVersion ( )
ffmpegVersionLabel. text = " FFMpeg: \( version) "
}
func playRtspSteam( at urlString: String ) {
guard let url = URL ( string: urlString) else { return }
streamPlayer. stopVideo ( for: . image)
streamPlayer. playVideo ( at: url, frame: { [ unowned self] image, elapseTime in
videoTimeLabel. text = " \( CMTimeGetSeconds ( elapseTime) ) "
videoImageView. image = image
} )
streamPlayer. playAudio ( at: url)
}
}
mediamtx
ffmpeg -re -stream_loop -1 -i BigBuckBunny.mp4 -c:v libx264 -preset veryfast -tune zerolatency -pix_fmt yuv420p -c:a aac -ac 2 -ar 44100 -b:a 128k -flags:a +global_header -f rtsp rtsp://localhost:8554/mystream
# mediamtx.yml
paths :
all :
# 任何 client 都可以當 publisher(ffmpeg、OBS 等)
source : publisher