Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: [Python] Информация о видеофайле  (Прочитано 4281 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hippi90

  • Автор темы
  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
[Python] Информация о видеофайле
« : 22 Апреля 2011, 02:18:29 »
Всем доброго времени суток! Подскажите, как вытащить из видеофайла такую информацию, как разрешение, битрейт видео и аудио, кодеки, количество кадров в секунду. Не хотелось бы тащить за собой тяжеловесные фреймворки, такие как Gstreamer. Версия интерпретатора - Python 3.1.3.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #1 : 22 Апреля 2011, 05:44:36 »
ну поищи питоновский биндинг для libavi
не найдешь - сам напиши.
gstreamer настолько тяжеловесный что выглядит как муха рядом со слоном питона

Оффлайн hippi90

  • Автор темы
  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #2 : 23 Апреля 2011, 17:33:36 »
Похоже действительно придется писать самому. GStreamer не хочется использовать, чтобы не добавлять лишних зависимостей, GStreamer за собой еще и Glib тянет. Поскольку я и так использую в программе FFmpeg, логичнее всего будет написать модуль расширения, который будет использовать libav*. Просто не хотелось добавлять своего быдлокода в программу :)

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #3 : 23 Апреля 2011, 20:24:00 »
Поскольку я и так использую в программе FFmpeg...
То есть запускаете его внешней командой?

Тогда не вижу ничего плохого в том, чтобы тем же способом запускать ffprobe и парсить его вывод.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн hippi90

  • Автор темы
  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #4 : 23 Апреля 2011, 20:46:40 »
Тогда не вижу ничего плохого в том, чтобы тем же способом запускать ffprobe и парсить его вывод.

Я в питоне не силен, чем принято парсить вывод в Python? Ксати, ffprobe берет данные из метаданных в файле, а они не всегда корректны, если вообще есть.

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #5 : 24 Апреля 2011, 08:41:47 »
Тогда не вижу ничего плохого в том, чтобы тем же способом запускать ffprobe и парсить его вывод.
Я в питоне не силен, чем принято парсить вывод в Python?
Наверняка что-то есть.
Вот, например:
http://docs.python.org/library/subprocess.html#subprocess.check_output

Ксати, ffprobe берет данные из метаданных в файле, а они не всегда корректны, если вообще есть.
Подозреваю, что и Gstreamer и Libav (которая часть ffmpeg) делают то же самое.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #6 : 25 Апреля 2011, 09:57:26 »
Я в питоне не силен, чем принято парсить вывод в Python?
Как засосать вывод внешней утилиты в питон
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import os
print "Вариант 1"
os.system('ls')
temp=os.popen('ls').readlines()
print "Вариант 2"
print temp
print "Вариант 3"
temp=os.popen('ls').read()
print temp
Как парсить в питоне примерчик.
#! /usr/bin/env python
#!-*-coding: UTF-8-*-
# Пример обработки csv файла
# В OOo Calc создается таблица и сохраняется как csv файл
# с разделителями между полями ";"
# каждая запись в двойных кавычках
# Каждая строка текста - это строка в таблице
# В 5 столбце есть массивы hex строк с разделителями "," кроме 1 и 2 строк, которые является названиями столбцов
# Создадим бинарные файлы запросов с именами "q"+str(id) с содержимым соответствующего hex массива.
import sys, os
import re
lines=open('./Tags.csv', 'rb').readlines()# читаем файл построчно (это первое деление)
# делим строчки кроме 1 и 2, по полям , а пятое поле еще и по hex.
i=0
for line in lines:
i+=1
if i<=2 :
continue
fields=line.split(';')
fout="q"+fields[0] #имя файла
Mrbin=fields[4].split(",")
out=""
for b in Mrbin:
b=re.sub(r'[\"\']+','',b)
out+=chr(int(('0x'+b),16))
f1=open(fout,'wb')# пишем
f1.write(out)
f1.close()

Оффлайн hippi90

  • Автор темы
  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #7 : 25 Апреля 2011, 11:51:18 »
alexander.pronin, спасибо за примеры, изучу. os.popen с версии 2.6 объявлено устаревшим, вместо него надо использовать модуль subprocess.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #8 : 25 Апреля 2011, 12:36:38 »
hippi90, когда разберетесь с subprocess, выложите сюда примерчик для полноты информации.

Оффлайн hippi90

  • Автор темы
  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #9 : 26 Апреля 2011, 17:48:54 »
hippi90, когда разберетесь с subprocess, выложите сюда примерчик для полноты информации.
В документации неплохо описано, и есть примеры для замены устаревших функций.
#!/usr/bin/python3
import subprocess

#Замена для os.system
p = subprocess.Popen("ls -l /", shell=True)
sts = os.waitpid(p.pid, 0)[1]

#Замена для os.popen
p = subprocess.Popen(["/bin/ls", "-l", "/"], stdout=subprocess.PIPE)
print(p.stdout.readlines())
В качестве аргумента для stdout можно также передать существующий файловый дескриптор или объект файла, вывод будет перенаправлен в файл, так же можно перенаправить stdin и stderr.

Оффлайн RazrFalcon

  • O_o
  • Старожил
  • *
  • Сообщений: 3129
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: [Python] Информация о видеофайле
« Ответ #10 : 26 Апреля 2011, 18:25:12 »
Как на счет парсинга mediainfo?
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн hippi90

  • Автор темы
  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #11 : 26 Апреля 2011, 19:38:52 »
Кстати, раз уж заговорили о парсинге, попробовал парсить вывод ffmpeg при конвертации видео. Он выдает большое количество информации о своих настройках, видеофайле и информацию о процессе конвертации (пример под спойлером):
(Нажмите, чтобы показать/скрыть)
Попробовал такой код:
f = open("log.v2n", "r")
strs = f.readlines()
i = 0
for str in strs:
i+=1
m = re.search("time=([0-9]*.[0-9]*)", str)
if m:
print(m.group(1))
print(i)
Цикл идет до первой строки вида: frame=   38 fps=  0 q=2.0 size=      11kB time=1.52 bitrate=  57.2kbits/s Выводит первое значение, затем прекращается. Если же из файла удалить весь предшествующий мусор, то цикл обработает все строки, сколько бы их не было. Откуда такое поведение?

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #12 : 29 Апреля 2011, 12:01:49 »
1. такое поведение от того, что строки "frame= ... fps= ... time=..." это на самом деле одна строка.
Запустите ipython, выполните вручную первые две команды (open и readlines) и посмотрите, что окажется в strs.
(Нажмите, чтобы показать/скрыть)
Умный текстовый редактор, видать, просто заменяет \r на \n, поэтому после редактирования файла все хорошо.


2. Файлы так читать не надо, это не python-way, надо вот так

i = 0
for str in file("log.v2n", "r"):
i+=1
m = re.search("time=([0-9]*.[0-9]*)", str)
if m:
print(m.group(1))
print(i)
« Последнее редактирование: 29 Апреля 2011, 12:06:27 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн hippi90

  • Автор темы
  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #13 : 29 Апреля 2011, 17:34:51 »
1. такое поведение от того, что строки "frame= ... fps= ... time=..." это на самом деле одна строка.
Запустите ipython, выполните вручную первые две команды (open и readlines) и посмотрите, что окажется в strs.
(Нажмите, чтобы показать/скрыть)
Умный текстовый редактор, видать, просто заменяет \r на \n, поэтому после редактирования файла все хорошо.


2. Файлы так читать не надо, это не python-way, надо вот так

i = 0
for str in file("log.v2n", "r"):
i+=1
m = re.search("time=([0-9]*.[0-9]*)", str)
if m:
print(m.group(1))
print(i)
Результат аналогичный, цикл доходит до первой строки, содержащей шаблон, и прерывается.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: [Python] Информация о видеофайле
« Ответ #14 : 03 Мая 2011, 13:23:01 »
Результат аналогичный, цикл доходит до первой строки, содержащей шаблон, и прерывается.
Разумеется, т.к. я своим вариантом предлагал исправление другой ошибки.
Эти циклы, что первый, что второй, не подходят для обработки того, что выдает FFmpeg.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.051 секунд. Запросов: 25.