feat(emulator): fiddling with audio, still very broken

This commit is contained in:
Laureηt 2022-02-24 21:24:21 +01:00
parent 8c1d51b68a
commit 0f6e0c9921
No known key found for this signature in database
GPG key ID: D88C6B294FD40994
2 changed files with 99 additions and 28 deletions

View file

@ -4,15 +4,18 @@ import asyncio
import logging import logging
import random import random
import time import time
from math import ceil
import mgba.audio
import mgba.core import mgba.core
import mgba.image import mgba.image
import mgba.log import mgba.log
import redis import redis
from ffmpeg_manager import ffmpeg_stream from ffmpeg_manager import ffmpeg_audio_stream, ffmpeg_video_stream
from redis_manager import RedisManager from redis_manager import RedisManager
from settings import ( from settings import (
EMULATOR_FPS,
EMULATOR_HEIGHT, EMULATOR_HEIGHT,
EMULATOR_POLLING_RATE, EMULATOR_POLLING_RATE,
EMULATOR_RAND_RATE, EMULATOR_RAND_RATE,
@ -58,10 +61,14 @@ async def emulator() -> None:
# save frame to PNG image # save frame to PNG image
image = screen.to_pil().convert("RGB") image = screen.to_pil().convert("RGB")
image.save(ffmpeg_stream.stdin, "PNG") image.save(ffmpeg_video_stream.stdin, "PNG")
# TODO: get audio n = ceil(96000 / EMULATOR_FPS)
audio_buffer = audio_channels.read(n)
for short in audio_buffer:
bidule = short.to_bytes(2, byteorder="little", signed=True)
ffmpeg_audio_stream.write(bidule)
# sleep until next frame, if necessary # sleep until next frame, if necessary
sleep_t = last_frame_t - time.time() + EMULATOR_SPF sleep_t = last_frame_t - time.time() + EMULATOR_SPF
if sleep_t > 0: if sleep_t > 0:
@ -91,6 +98,7 @@ if __name__ == "__main__":
core: mgba.core.Core = mgba.core.load_path(EMULATOR_ROM_PATH) core: mgba.core.Core = mgba.core.load_path(EMULATOR_ROM_PATH)
screen: mgba.image.Image = mgba.image.Image(EMULATOR_WIDTH, EMULATOR_HEIGHT) screen: mgba.image.Image = mgba.image.Image(EMULATOR_WIDTH, EMULATOR_HEIGHT)
core.set_video_buffer(screen) core.set_video_buffer(screen)
audio_channels: mgba.audio.StereoBuffer = core.get_audio_channels()
core.reset() core.reset()
# setup logging format # setup logging format

View file

@ -12,37 +12,100 @@ from settings import (
) )
# launch ffmpeg process # launch ffmpeg process
ffmpeg_stream = subprocess.Popen( ffmpeg_video_stream = subprocess.Popen(
[ [
"/usr/bin/ffmpeg", "/usr/bin/ffmpeg", # ffmpeg binary location
"-y", "-y", # overwrite output files without asking
"-f", "-f", # force input file format
"image2pipe", "image2pipe", # allows to pipe images to ffmpeg
"-vcodec", "-vcodec", # set the video codec
"png", "png", # input images are PNGs
"-r", "-r", # set input frame rate
f"{EMULATOR_FPS}", f"{EMULATOR_FPS}",
"-s", "-s", # set input frame size
f"{EMULATOR_WIDTH}x{EMULATOR_HEIGHT}", f"{EMULATOR_WIDTH}x{EMULATOR_HEIGHT}",
"-i", # input file url
"pipe:0", # use stdin (pipe n°0) for input
"-f", # force input or output file format
"flv", # output an flv video
"-s", # set output frame size
f"{FFMPEG_WIDTH}x{FFMPEG_HEIGHT}",
"-r", # set output frame rate
f"{FFMPEG_FPS}",
"-b:v", # set video output bitrate
FFMPEG_BITRATE,
"-fflags", # set format flags
"nobuffer", # reduce the latency introduced by buffering during initial input streams analysis
"-flags", # set generic flags
"low_delay", # force low delay
"-strict", # specify how strictly to follow the standards
"experimental", # allow non standardized experimental encoders...
RTMP_STREAM_URI, # where to output the video
],
stdin=subprocess.PIPE,
stdout=subprocess.DEVNULL,
stderr=subprocess.STDOUT,
)
ffmpeg_audio_stream = subprocess.Popen(
# [
# "/usr/bin/ffmpeg", # FFMPEG_BIN
# "-i",
# "-",
# "-f",
# "s24le",
# "-acodec",
# "pcm_s24le",
# "-ar",
# "44100", # ouput will have 44100 Hz
# "-ac",
# "2", # stereo (set to '1' for mono)
# RTMP_STREAM_URI,
# ],
# [
# "/usr/bin/ffmpeg", # FFMPEG_BIN
# "-f", # audio format
# "s24le",
# "-acodec", # audio codec
# "pcm_s24le",
# "-ar", # audio sampling rate
# "44100",
# "-ac", # number of audio canals
# "2", # stereo (set to '1' for mono)
# "-i",
# "pipe:",
# "-y",
# "-f",
# "flv",
# # "-tune",
# # "zerolatency",
# "-fflags", # set format flags
# "nobuffer", # reduce the latency introduced by buffering during initial input streams analysis
# "-flags", # set generic flags
# "low_delay", # force low delay
# "-strict", # specify how strictly to follow the standards
# "experimental", # allow non standardized experimental things
# RTMP_STREAM_URI,
# ],
[
"/usr/bin/ffmpeg", # FFMPEG_BIN
"-f",
"-y",
"s24le",
"-acodec",
"pcm_s24le",
"-ar",
"44100", # ouput will have 44100 Hz
"-ac",
"2", # stereo (set to '1' for mono)
"-i", "-i",
"-", "-",
"-f", "-f",
"flv", "bonjour",
"-s",
f"{FFMPEG_WIDTH}x{FFMPEG_HEIGHT}",
"-r",
f"{FFMPEG_FPS}",
"-b:v",
FFMPEG_BITRATE,
"-fflags",
"nobuffer",
"-flags",
"low_delay",
"-strict",
"experimental",
RTMP_STREAM_URI,
], ],
stdin=subprocess.PIPE, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, # stdout=subprocess.STDOUT,
stderr=subprocess.STDOUT, # stderr=subprocess.STDOUT,
) )
# https://stackoverflow.com/questions/67388548/multiple-named-pipes-in-ffmpeg