-
Notifications
You must be signed in to change notification settings - Fork 422
Description
I use pyav on win10 as:
from future import print_function
from PyQt5.QtMultimedia import *
import time
import av
container = av.open(r'd:\king.mp4')
stream = next(s for s in container.streams if s.type == 'audio')
fifo = av.AudioFifo()
resampler = av.AudioResampler(
format=av.AudioFormat('s16').packed,
layout='stereo',
rate=48000,
)
qformat = QAudioFormat()
qformat.setByteOrder(QAudioFormat.LittleEndian)
qformat.setChannelCount(2)
qformat.setCodec('audio/pcm')
qformat.setSampleRate(48000)
qformat.setSampleSize(16)
qformat.setSampleType(QAudioFormat.SignedInt)
output = QAudioOutput(qformat)
output.setBufferSize(16 * 48000)
device = output.start()
print(qformat, output, device)
def decode_iter():
try:
for pi, packet in enumerate(container.demux(stream)):
for fi, frame in enumerate(packet.decode()):
yield pi, fi, frame
except:
return
for pi, fi, frame in decode_iter():
frame = resampler.resample(frame)
print(pi, fi, frame, output.state())
bytes_buffered = output.bufferSize() - output.bytesFree()
us_processed = output.processedUSecs()
us_buffered = 1000000 * bytes_buffered / (2 * 16 / 8) / 48000
print('pts: %.3f, played: %.3f, buffered: %.3f' % (frame.time or 0, us_processed / 1000000.0, us_buffered / 1000000.0))
data = frame.planes[0].to_bytes()
while data:
written = device.write(data)
if written:
# print 'wrote', written
data = data[written:]
else:
# print 'did not accept data; sleeping'
time.sleep(0.033)
if False and pi % 100 == 0:
output.reset()
print(output.state(), output.error())
device = output.start()
# time.sleep(0.05)
while output.state() == QAudio.ActiveState:
time.sleep(0.1)
It works but the sound is very noisy, although hearable, how to deal with the noise?