使用 AWS Lambda 将 Ogg Opus 流式传输为 MKV 和 CAF?
Streaming Ogg Opus as MKV and CAF with AWS Lambda?
我们愿意支持在尽可能多的手机上提供 Ogg Opus。
根据 Wikipedia 和我们的实验,我们发现:
- Android 5.0+ 支持 Matroska (.mkv,.mka) 或 WebM (.webm) 容器格式的 Ogg Opus
- Android 7.0+ 支持 Ogg (.ogg) 容器格式的 Ogg Opus(以 .opus 作为别名)
- Android 10+ 支持 Ogg (.opus) 容器格式的 Ogg Opus
- iOS 11+ 支持核心音频格式 (.caf) 容器格式的 Ogg Opus
Android documentation 指出 .ogg 和 .mkv 从 5.0+ 开始受支持,但实验证明并非如此。
我们想使用 AWS S3 以某种基本格式(如 .mkv)存储音频,这些格式将提供给 Android。对于来自 iOS 的请求,我们希望将它们重定向到 AWS Lambda 函数,该函数将采用基本格式并将音频流重新打包为 .caf 容器格式。它不需要任何转码,因为两种情况下的编解码器 (Ogg Opus) 相同。
关于如何实施 AWS Lambda 有什么建议吗?我们更愿意使用 Python,但愿意使用其他支持的语言。
更新:
- 我正在查看 Pydub based on finding this article: Simple Audio Processing in Python With Pydub,但直接使用 ffmpeg 可能会更好。
- 转换很简单,可以使用
ffmpeg
和 opusenc
(来自 opus-tools),因此 .webm 文件将存储在 S3 中。
ffmpeg -i foo.mp3 foo.wav
opusenc --bitrate 16 --hard-cbr foo.wav foo.opus
ffmpeg -i foo.opus -acodec copy -f webm foo.webm
- 从 .webm 到 .caf 的转换也可以通过 ffmpeg 轻松完成。
ffmpeg -i foo.webm -acodec copy -f caf foo.caf
- 我找到了 AWS Lambda 的 ffmpeg layer。
所以问题是:如何设置 Lambda 来 returns 存储在 S3 中的 .webm 文件或通过 lambda 层进行转换?返回的格式应该基于 http headers(即 ACCEPT)还是文件扩展名?
我最终使用 mobile-ffmpeg-full 并将容器从 webm 转换为 caf。
// If an WebM, use FFmpeg to convert container to CAF
let error = MobileFFmpeg.execute("-i \"\(fileURL.path)\" -acodec copy \"\(cafFileURL.path)\"")
我们愿意支持在尽可能多的手机上提供 Ogg Opus。
根据 Wikipedia 和我们的实验,我们发现:
- Android 5.0+ 支持 Matroska (.mkv,.mka) 或 WebM (.webm) 容器格式的 Ogg Opus
- Android 7.0+ 支持 Ogg (.ogg) 容器格式的 Ogg Opus(以 .opus 作为别名)
- Android 10+ 支持 Ogg (.opus) 容器格式的 Ogg Opus
- iOS 11+ 支持核心音频格式 (.caf) 容器格式的 Ogg Opus
Android documentation 指出 .ogg 和 .mkv 从 5.0+ 开始受支持,但实验证明并非如此。
我们想使用 AWS S3 以某种基本格式(如 .mkv)存储音频,这些格式将提供给 Android。对于来自 iOS 的请求,我们希望将它们重定向到 AWS Lambda 函数,该函数将采用基本格式并将音频流重新打包为 .caf 容器格式。它不需要任何转码,因为两种情况下的编解码器 (Ogg Opus) 相同。
关于如何实施 AWS Lambda 有什么建议吗?我们更愿意使用 Python,但愿意使用其他支持的语言。
更新:
- 我正在查看 Pydub based on finding this article: Simple Audio Processing in Python With Pydub,但直接使用 ffmpeg 可能会更好。
- 转换很简单,可以使用
ffmpeg
和opusenc
(来自 opus-tools),因此 .webm 文件将存储在 S3 中。
ffmpeg -i foo.mp3 foo.wav
opusenc --bitrate 16 --hard-cbr foo.wav foo.opus
ffmpeg -i foo.opus -acodec copy -f webm foo.webm
- 从 .webm 到 .caf 的转换也可以通过 ffmpeg 轻松完成。
ffmpeg -i foo.webm -acodec copy -f caf foo.caf
- 我找到了 AWS Lambda 的 ffmpeg layer。
所以问题是:如何设置 Lambda 来 returns 存储在 S3 中的 .webm 文件或通过 lambda 层进行转换?返回的格式应该基于 http headers(即 ACCEPT)还是文件扩展名?
我最终使用 mobile-ffmpeg-full 并将容器从 webm 转换为 caf。
// If an WebM, use FFmpeg to convert container to CAF
let error = MobileFFmpeg.execute("-i \"\(fileURL.path)\" -acodec copy \"\(cafFileURL.path)\"")