Конвертировать .mkv в .mp4

Я пытаюсь конвертировать .mkv в .mp4. Ниже приведен мой терминал. Я получаю сообщение об ошибке:

Не удается найти код запуска H264. Ошибка импорта видео.h264: BitStream не соответствует

gayan@GayanF:~/Videos/converted$ mkvmerge --identify file.mkv
File 'file.mkv': container: Matroska
Track ID 0: video (VP9)
Track ID 1: audio (AAC)
Global tags: 1 entry
Tags for track ID 0: 2 entries
Tags for track ID 1: 4 entries

gayan@GayanF:~/Videos/converted$ mkvextract tracks file.mkv 0:video.h264 1:audio.ac3
Extracting track 0 with the CodecID 'V_VP9' to the file 'video.h264'. Container format: IVF
Extracting track 1 with the CodecID 'A_AAC' to the file 'audio.ac3'. Container format: raw AAC file with ADTS headers
Progress: 100%
gayan@GayanF:~/Videos/converted$ MP4Box -fps 24 -add video.h264 -add audio.ac3 video.mp4
Cannot find H264 start code
Error importing video.h264: BitStream Not Compliant
1
задан 16 June 2018 в 07:45

4 ответа

Да, переопределите __iadd__ метод. Пример:

def __iadd__(self, other):
    self.number += other.number
    return self    
107
ответ дан 31 October 2019 в 05:21

В дополнение к перегрузке __iadd__ (не забудьте возвращаться сам!), Вы можете также нейтрализация на __add__, как x + = y будет работать как x = x + y. (Это - одна из ловушек + = оператор.)

>>> class A(object):
...   def __init__(self, x):
...     self.x = x
...   def __add__(self, other):
...     return A(self.x + other.x)
>>> a = A(42)
>>> b = A(3)
>>> print a.x, b.x
42 3
>>> old_id = id(a)
>>> a += b
>>> print a.x
45
>>> print old_id == id(a)
False

Это даже сбивает с толку экспертов:

class Resource(object):
  class_counter = 0
  def __init__(self):
    self.id = self.class_counter
    self.class_counter += 1

x = Resource()
y = Resource()

Что делают значения Вы ожидаете x.id, y.id, и Resource.class_counter иметь?

12
ответ дан 31 October 2019 в 05:21

http://docs.python.org/reference/datamodel.html#emulating-numeric-types

Например, для выполнения оператора x + = y где x является экземпляром класса, который имеет __ iadd __ () метод, x. __ iadd __ (y) называют.

5
ответ дан 31 October 2019 в 05:21

В дополнение к тому, что правильно дано в ответах выше, стоит явно разъяснить, что, когда __iadd__ переопределяется, x += y, операция НЕ заканчивается концом __iadd__ метод.

Вместо этого это заканчивается x = x.__iadd__(y). Другими словами, Python присваивает возвращаемое значение Вашего __iadd__ реализация к объекту, который Вы "добавляете к", ПОСЛЕ ТОГО, КАК реализация завершается.

Это означает, что возможно видоизменить левую сторону x += y операция так, чтобы заключительный неявный шаг перестал работать. Рассмотрите то, что может произойти, когда Вы добавляете к чему-то, что это в рамках списка:

>>> x[1] += y # x has two items

Теперь, если Ваш __iadd__ реализация (метод объекта в x[1]) ошибочно или нарочно удаляет первый объект (x[0]) с начала списка, Python затем выполнит Ваш __iadd__ метод), & попытайтесь присвоить его возвращаемое значение [1 111]. Который больше не будет существовать (это будет в [1 112]), приводя к ÌndexError.

Или, если Ваш __iadd__ вставляет что-то в начало x из вышеупомянутого примера, Ваш объект будет в [1 116], не x[1], и независимо от того, что было ранее в [1 118], теперь будет в [1 119] и будет присвоен возвращаемое значение __iadd__ вызов.

, Если каждый не понимает то, что происходит, получающиеся ошибки могут быть кошмаром для фиксации.

21
ответ дан 31 October 2019 в 15:21

Другие вопросы по тегам:

Похожие вопросы: