pyav: сохранение видео и аудио для отделения файлов от потоковой передачи hls - PullRequest
0 голосов
/ 27 марта 2019

Я пишу скрипт для извлечения ключевых кадров видео (в frame_{0}.jpg) и аудио в отдельный файл .mp3.Вот что у меня есть:

import os
import av

path_to_video = 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8'
container = av.open(path_to_video)

stream = container.streams.video[0]
audio_stream = container.streams.audio[0]

stream.codec_context.skip_frame = 'NONKEY'
tgt_path = "./frames"
if not os.path.isdir(tgt_path):
    os.makedirs(tgt_path)
for frame in container.decode(stream):
   tgt_filename = os.path.join(tgt_path,'frame-{:09d}.jpg'.format(frame.pts))
   frame.to_image().save(tgt_filename,quality=80)

Как сохранить аудиопоток в файл (желательно в виде фрагментов).Нужно ли мне запускать отдельную процедуру захвата и работать параллельно, или я могу выполнить захват в вышеуказанном цикле?

Я просмотрел сообщения pyav github , к сожалению, к сожалению.Не уверен, как я могу сделать это в одном цикле.

1 Ответ

0 голосов
/ 25 мая 2019

Это из ответа , опубликованного на pyav github repo:

import av

input_container = av.open(
    'http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8')
input_stream = input_container.streams.get(audio=0)[0]

output_container = av.open('live_stream.mp3', 'w')
output_stream = output_container.add_stream('mp3')

for frame in input_container.decode(input_stream):
    frame.pts = None
    for packet in output_stream.encode(frame):
        output_container.mux(packet)

for packet in output_stream.encode(None):
    output_container.mux(packet)

output_container.close()
...