Ich hab mir pytube geholt und etwas damit gespielt.
Hab dabei eine zweite Download Funktion geschrieben, welche in der Lage ist, nur bestimmte Teile eines Video zu downloaden.
Bei einem 10min. Video z.B. 3:45-4:21.
Der Download funktioniert auch soweit, doch ist das Video nicht abspielbar. Ich schätze das liegt an den Header Informationen des .mp4.
Um nur einen Part vom Video zu downloaden, muss ich Bytes überspringen und somit essentielle Informationen, die das Vid zum abgespielt benötigt.
Meine Frage: Kann ich einfach eine selbstgeschriebene oder kopierte Header-Datei in das Vid reinsetzen?
Ggf. auch den originalen Header.
Video Header auslesen ersetzen
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
So einfach ist das nicht. Du kannst nicht einfach den header nehmen und so vorn dann klatschen. Der muss aktualisiert werden.
Videos kann man auch nicht einfach byte-weise schneiden. Du must schon den Anfang eines frames bzw. den Anfang eines bestimmten frame Typs treffen. Z.b. auf ein I-Frame.
Kommt auf das container-format und den verwendeten codec an.
Dan beste wird wohl sein eine externes Modul dafür zu nehmen.
Videos kann man auch nicht einfach byte-weise schneiden. Du must schon den Anfang eines frames bzw. den Anfang eines bestimmten frame Typs treffen. Z.b. auf ein I-Frame.
Kommt auf das container-format und den verwendeten codec an.
Dan beste wird wohl sein eine externes Modul dafür zu nehmen.
Hab ich mir schon gedacht.
Die Header und Codecs, die das jeweilige Format benötigt, werden verwendet um dem Abspielmedium zu weisen.
Die jeweiligen Bytes enthalten doch trotzdem die einzelnen Frames. Könnte ich nicht einfach diese lesen und weiterverarbeiten?
Die Header und Codecs, die das jeweilige Format benötigt, werden verwendet um dem Abspielmedium zu weisen.
Die jeweiligen Bytes enthalten doch trotzdem die einzelnen Frames. Könnte ich nicht einfach diese lesen und weiterverarbeiten?
@Dami123: Das Wort „einfach” ist in diesem Zusammenhang wahrscheinlich der Stolperstein.
@Dami123: um mitten in eine Video zu springen mußt Du trotzdem den Header lesen, um zu wissen, wohin.
Der Aufbau eines mp4-Containers ist relativ simple (QuickTime File Format Specification), um alle Atome richtig zu interpretieren, ist aber etwas Fleiß nötig.
Hier mal ein Anfang:
Die eigentlichen Video-Daten stehen in einem oder mehreren großen mdat-Blöcken. Um zu wissen, wo die Frames zu einem bestimmten Zeitpunkt liegen, mußt Du die time-to-sample, sample-to-chunk, chunk-offset Tabellen einlesen.
Um daraus aber wieder ein lesbares mp4-File zu machen, mußt Du aber auch diese ganzen Tabellen entsprechen anpassen.
Der Aufbau eines mp4-Containers ist relativ simple (QuickTime File Format Specification), um alle Atome richtig zu interpretieren, ist aber etwas Fleiß nötig.
Hier mal ein Anfang:
Code: Alles auswählen
import struct
class MP4Container(object):
def __init__(self, filename):
with open(filename,'rb') as fd:
self.read_tags(fd)
def skip(self, fd, block_size):
fd.seek(block_size,1)
#data = fd.read(block_size)
#print repr(data[:100])
def read_tags(self, fd, block_size=1e99):
rd = 0
while rd<block_size:
head = fd.read(8)
if not head: break
size,tag = struct.unpack('>i4s', head)
print tag,size
self.TAGS.get(tag,MP4Container.skip)(self, fd, size-8)
rd+=size
def time2sample(self, fd, block_size):
assert block_size>8
version, entry_count = struct.unpack('>ii',fd.read(8))
print hex(version), entry_count
assert block_size-8 == entry_count*8
entries = zip(*[iter(struct.unpack('>%di'%(entry_count*2), fd.read(entry_count*8)))]*2)
print entries
TAGS = {
'moov':read_tags,
'trak':read_tags,
'mdia':read_tags,
'minf':read_tags,
'stbl':read_tags,
'stts':time2sample,
}
MP4Container('beispiel.mp4')
Um daraus aber wieder ein lesbares mp4-File zu machen, mußt Du aber auch diese ganzen Tabellen entsprechen anpassen.