如何使用 gstreamer 查找媒体长度?

发布于 2024-08-25 01:00:42 字数 32 浏览 4 评论 0原文

如何使用 gstreamer 查找媒体的播放时间?

How do I find the playback time of media with gstreamer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

时光礼记 2024-09-01 01:00:42

这是一个简单的 Python 脚本,用于获取 gstreamer 可以解码的任何内容的持续时间。请注意,gstreamer 中的所有时间均以纳秒为单位。

持续时间.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division

import sys
import gobject
gobject.threads_init()
import pygst
pygst.require("0.10")
import gst
d = gst.parse_launch("filesrc name=source ! decodebin2 ! fakesink")
source = d.get_by_name("source")
source.set_property("location", sys.argv[1])
d.set_state(gst.STATE_PLAYING)
d.get_state()
format = gst.Format(gst.FORMAT_TIME)
duration = d.query_duration(format)[0]
d.set_state(gst.STATE_NULL)

import datetime
delta = datetime.timedelta(seconds=(duration / gst.SECOND))
print delta

示例:

$ python duration.py VIDEO_TS/VTS_03_1.VOB
0:20:10.528000
$ python duration.py ~/Movies/BigBuckBunny_640x360.m4v
0:09:56.461667

Here's a simple Python script to get the duration of anything gstreamer can decode. Note that all times in gstreamer are in nanoseconds.

duration.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division

import sys
import gobject
gobject.threads_init()
import pygst
pygst.require("0.10")
import gst
d = gst.parse_launch("filesrc name=source ! decodebin2 ! fakesink")
source = d.get_by_name("source")
source.set_property("location", sys.argv[1])
d.set_state(gst.STATE_PLAYING)
d.get_state()
format = gst.Format(gst.FORMAT_TIME)
duration = d.query_duration(format)[0]
d.set_state(gst.STATE_NULL)

import datetime
delta = datetime.timedelta(seconds=(duration / gst.SECOND))
print delta

Examples:

$ python duration.py VIDEO_TS/VTS_03_1.VOB
0:20:10.528000
$ python duration.py ~/Movies/BigBuckBunny_640x360.m4v
0:09:56.461667
送舟行 2024-09-01 01:00:42

为什么要重新发明轮子?
用途:
gst-discoverer-1.0 文件名

gst-discoverer-0.10 文件名

根据文件类型,您可能需要添加“| grep Duration”以避免过长的标签。
为了消除视频、flac 和 mp3 文件的无关标签,应该使用 grep 来排除它们。
gst-discoverer-1.0 文件名 | grep -v 标签 | grep -v grep -v ID3v2 | grep -v ID3v2 | grep -v 图像 | grep -v 附件

Why re-invent the wheel?
Use:
gst-discoverer-1.0 filename
or
gst-discoverer-0.10 filename

Depending on the file type you may want to add " | grep Duration" to avoid the tags which can be lengthy.
For the ridding of extraneous tags for video,flac and mp3 files this should do the trick by using grep to exclude them.
gst-discoverer-1.0 filename | grep -v Tags | grep -v ID3v2 | grep -v image | grep -v attachment

惯饮孤独 2024-09-01 01:00:42

参见第 6.5 节。

http://majorsilence.com/pygtk_audio_and_video_playback_gstreamer

它避免了创建管道并手动运行它的需要。

See Section 6.5.

http://majorsilence.com/pygtk_audio_and_video_playback_gstreamer

It avoids need to create a pipeline and run it manually.

林空鹿饮溪 2024-09-01 01:00:42

添加到大于 1.16 的 gstreamer 的答案。
使用 GstPbutilsDiscoverer 我们还可以查询持续时间和其他属性。完整 API 此处

import gi
gi.require_version("GstPbutils", "1.0")
from gi.repository import GstPbutils

def get_file_duration(file: Path) -> timedelta:
    discoverer = GstPbutils.Discoverer()
    asset_info = discoverer.discover_uri(str(file_path.as_uri()))
    duration_in_microseconds = int(asset_info.get_duration() / 1000)
    return timedelta(microseconds=duration_in_microseconds)

Adding on to the answer for gstreamer greater then 1.16.
Using GstPbutils and Discoverer we can query duration and other attributes as well. Full API here

import gi
gi.require_version("GstPbutils", "1.0")
from gi.repository import GstPbutils

def get_file_duration(file: Path) -> timedelta:
    discoverer = GstPbutils.Discoverer()
    asset_info = discoverer.discover_uri(str(file_path.as_uri()))
    duration_in_microseconds = int(asset_info.get_duration() / 1000)
    return timedelta(microseconds=duration_in_microseconds)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文