以下将三个文件添加到GES时间轴的Python代码会引发以下错误,其他人也遇到过此错误:
(GError('您的 GStreamer 安装缺少插件'),'gstdecodebin2.c(3928): gst_decode_bin_expose ():/GESPipeline:gespipeline0/GESTimeline:gestimeline0/GESVideoTrack:gesvideotrack0/GnlComposition:gnlcomposition1/GnlSource:gnlsource0/GstBin:videosrcbin/GstURIDecodeBin:uridecodebin0/GstDecodeBin:decodebin4:找不到合适的插件')
from gi.repository import GES
from gi.repository import GstPbutils
from gi.repository import Gtk
from gi.repository import Gst
from gi.repository import GObject
import sys
import signal
VIDEOPATH = "file:///path/to/my/video/folder/"
class Timeline:
def __init__(self, files):
print Gst._version # prints 1
self.pipeline = GES.Pipeline()
container_caps = Gst.Caps.new_empty_simple("video/quicktime")
video_caps = Gst.Caps.new_empty_simple("video/x-h264")
audio_caps = Gst.Caps.new_empty_simple("audio/mpeg")
self.container_profile = GstPbutils.EncodingContainerProfile.new("jane_profile", "mp4 concatation", container_caps, None )#Gst.Caps("video/mp4", None))
self.video_profile = GstPbutils.EncodingVideoProfile.new(video_caps, None, None, 0)
self.audio_profile = GstPbutils.EncodingAudioProfile.new(audio_caps, None, None, 0)
self.container_profile.add_profile(self.video_profile)
self.container_profile.add_profile(self.audio_profile)
self.bus = self.pipeline.get_bus()
self.bus.add_signal_watch()
self.bus.connect("message", self.busMessageCb)
self.timeline = GES.Timeline.new_audio_video()
self.layer = self.timeline.append_layer()
signal.signal(signal.SIGINT, self.handle_sigint)
self.start_on_timeline = 0
for file in files:
asset = GES.UriClipAsset.request_sync(VIDEOPATH + file)
print asset.get_duration()
duration = asset.get_duration()
clip = self.layer.add_asset(asset, self.start_on_timeline, 0, duration, GES.TrackType.UNKNOWN)
self.start_on_timeline += duration
print 'start:' + str(self.start_on_timeline)
self.timeline.commit()
self.pipeline.set_timeline(self.timeline)
def handle_sigint(self, sig, frame):
Gtk.main_quit()
def busMessageCb(self, unused_bus, message):
print message
print message.type
if message.type == Gst.MessageType.EOS:
print "eos"
Gtk.main_quit()
elif message.type == Gst.MessageType.ERROR:
error = message.parse_error()
print (error)
Gtk.main_quit()
if __name__=="__main__":
GObject.threads_init()
Gst.init(None)
GES.init()
gv = GES.version() # prints 1.2
timeline = Timeline(['one.mp4', 'two.mp4', 'two.mp4'])
done = timeline.pipeline.set_render_settings('file:///home/directory/output.mp4', timeline.container_profile)
print 'done: {0}'.format(done)
timeline.pipeline.set_mode(GES.PipelineFlags.RENDER)
timeline.pipeline.set_state(Gst.State.PAUSED)
Gtk.main()
我将GST_PLUGIN_PATH_1_0环境变量设置为"/usr/local/lib:/usr/local/lib/gstreamer-1.0:/usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu/gstreamer-1.0"
我编译并安装了gstreamer1.0-1.2.4,以及该版本的基本,好,坏和丑陋的软件包。GES 与 1.2.1 版本一起安装,因为这是最接近我找到的 gstreamer 版本。我还安装了 libav-1.2.4。
decodebin2 应该根据插件库的制作安装日志位于基础中,并链接到 libgstplayback,这是我GST_PLUGIN_PATH_1_0的一部分:
/usr/local/lib/gstreamer-1.0 libgstplayback_la-gstdecodebin2.lo
我确实有 gstreamer0.10,当我执行"gst-inspect-1.0 -b"时,解码bin2 作为黑名单版本存在,因为它位于 gstreamer0.10 库路径中,而不是 1.0 的路径上。
我尝试清除 ~/.cache/gstreamer 文件并再次运行 gst-inspect-1.0 以重新生成插件注册表,但我仍然在 Python 代码中不断收到错误。此示例代码可能是错误的,因为它是我第一次尝试使用 Gstreamer 编辑服务编写时间线。我在 Ubuntu Trusty 或 14.04 上。
该文件是一个 mp4 文件,这就是我为所需库安装 gst-libav 的原因。文件上的MP4Box-info的输出是:
电影信息 *时间刻度 90000 - 持续时间 00:00:08.405碎片文件编号 - 2 首曲目适合渐进式下载的文件(mdat 之前的 moov)文件品牌 mp42 - 版本 0创建时间: GMT 周一 8月 17 17:02:26 2015
文件没有 MPEG4 IOD/OD
轨道 # 1 信息 - 轨道ID 1 - 时间刻度 50000 - 持续时间 00:00:08.360媒体信息:语言"英语" - 键入"vide:avc1" - 209 个样本可视轨道布局:x=0 y=0 宽度=1920 高度=1080MPEG-4 配置:视觉流 - 对象类型指示 0x21AVC/H264 视频 - 视觉尺寸 1920 x 1080AVC 信息: 1 个 SPS - 1 个 PPS - 配置文件主 @ 级别 4.2NAL 单元长度位:32像素长宽比 1:1 - 指示轨道大小 1920 x 1080自同步
轨道 # 2 信息 - 轨道ID 2 - 时间刻度 48000 - 持续时间 00:00:08.405媒体信息: 语言 "英语" - 键入 "soun:mp4a" - 394 个样本MPEG-4 配置:音频流 - 对象类型指示 0x40MPEG-4 音频 MPEG-4 音频 AAC LC - 2 通道 - 采样率 48000 在流 1 上同步
log @ pastebin.com/BjJ8Z5Bd 当我运行 'GST_DEBUG=3,gnl*:5 python ./timeline1.py> timeline1.log 2>&1'
GStreamer 1.x中没有"decodebin2",你在这里使用。它现在只是被称为"decodebin",相当于 0.10 中的"decodebin2"。
但是,您的问题不是找不到解码器。您的问题是您缺少播放此特定媒体文件的插件。它是什么类型的媒体文件?