文件上的 Gstreamer 音频捕获

Posted

技术标签:

【中文标题】文件上的 Gstreamer 音频捕获【英文标题】:Gstreamer audio capture on file 【发布时间】:2015-12-10 14:16:32 【问题描述】:

我是 Gstreamer 的新手,基本上已经阅读了一天的文档。我需要一个程序,每 5 分钟从音频输入中捕获 10-15 秒的音频并将其存储到文件中。 我唯一不知道该怎么做的是捕获本身,因为我以前没有使用过输入。现在我在网上找到了这段代码,但不知道它是否对我有帮助(我了解其中的大部分内容,但不知道它在哪里保存文件,如果它完全保存它们)任何帮助将不胜感激

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk
GObject.threads_init()
Gst.init(None)

pipeline = Gst.Pipeline()

autoaudiosrc = Gst.ElementFactory.make("autoaudiosrc", "autoaudiosrc")
audioconvert = Gst.ElementFactory.make("audioconvert", "audioconvert")
vorbisenc = Gst.ElementFactory.make("vorbisenc", "vorbisenc")
oggmux = Gst.ElementFactory.make("oggmux", "oggmux")
filesink = Gst.ElementFactory.make("filesink", "filesink")
url = "1.ogg"
filesink.set_property("location",url)
pipeline.add( autoaudiosrc)
pipeline.add( audioconvert)
pipeline.add( vorbisenc)
pipeline.add( oggmux)
pipeline.add( filesink)

autoaudiosrc.link( audioconvert)
audioconvert.link( vorbisenc)
vorbisenc.link( oggmux)
oggmux.link( filesink)

pipeline.set_state(Gst.State.PLAYING)
Gtk.main()

附:一位教授向我推荐了 gstreamer,但我还没有找到一个好的选择,所以这就是我尝试它的原因,但如果有更好的方法请告诉我,因为我觉得 gstreamer 更适合播放器/播放性质

【问题讨论】:

【参考方案1】:

这个问题写得很好,但是你可以在提问之前尝试更多的调查..你也可以添加标签 python 并且代码会被突出显示..

无论如何,gstreamer 保存到文件是完全可以的..

该示例将输出保存到您运行脚本的当前目录中名为1.ogg 的文件中。 你已经运行脚本了吗?寻找你运行它的那个文件..

filesink 元素执行实际的文件保存。如果您想将每个捕获保存在另一个文件中,您可以生成一些格式的文件名,例如 YYYY-MM-DD_HH_mm_ss.ogg(这是典型的日期时间格式,其中 YYYY 表示年、MM 月等)。

你可以

如果您使用的是 linux,则每 5 分钟运行一次脚本,这可能是一项 cron 作业 或者只是一个 bash 脚本.. 或者您可以在同一脚本中的 python 中对其进行编码,以一次又一次地运行 gstreamer 管道。这会更难但“更好”

【讨论】:

发现问题,需要重新安装 ubuntu(由于某种原因我无法获得 sudo 访问权限,不知道那里出了什么问题)它现在按原样保存文件,我打算制作一个给文件一个数字(21、2、3、4等)的各种循环将在我完成整个事情时将其发布在这里。【参考方案2】:
import gi
import datetime, time
import sys
import signal  
signal.alarm(15)
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk
GObject.threads_init()
Gst.init(None)

pipeline = Gst.Pipeline()

autoaudiosrc = Gst.ElementFactory.make("autoaudiosrc", "autoaudiosrc")
audioconvert = Gst.ElementFactory.make("audioconvert", "audioconv")
audioresample= Gst.ElementFactory.make("audioresample","audioresample")
vorbisenc = Gst.ElementFactory.make("vorbisenc", "vorbisenc")
oggmux = Gst.ElementFactory.make("oggmux", "oggmux")
filesink = Gst.ElementFactory.make("filesink", "filesink")
url = datetime.datetime.now()

audioresample.set_property("quality", 10) 
vorbisenc.set_property("quality", 1)

filesink.set_property("location",url)
pipeline.add( autoaudiosrc)
pipeline.add( audioconvert)
pipeline.add( vorbisenc)
pipeline.add( oggmux)
pipeline.add( filesink)
pipeline.add( audioresample)

autoaudiosrc.link( audioconvert)
audioconvert.link( audioresample)
audioresample.link(vorbisenc)
vorbisenc.link( oggmux)
oggmux.link( filesink)

pipeline.set_state(Gst.State.PLAYING)

Gtk.main()

正如所承诺的,完整的代码。您可以拥有的最佳音频质量,加上它现在将文件保存为日期和一角钱。 至于存储,我制作了一个完美运行的 bash 脚本,从而解决了这个问题(发现如果我在脚本本身中执行此操作,文件将永远无法正确保存)

【讨论】:

以上是关于文件上的 Gstreamer 音频捕获的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上使用 gstreamer 播放 .wav 音频文件?

GStreamer - 从 MP4 文件生成音频波形

如何在 gstreamer 中混合音频和视频

如何通过gstreamer将pcap转换为带有视频和音频的avi文件?

gstreamer:交错 2 个音频 - 链接错误

使用 (Python) Gstreamer 解码音频(到 PCM 数据)