영상으로 대신합니다.
먼저, 내 도시를 다른 사람에게 공유하는 방법
다른 사람 도시 받아 불러오는 방법
영상으로 대신합니다.
먼저, 내 도시를 다른 사람에게 공유하는 방법
다른 사람 도시 받아 불러오는 방법
사진과 같이 ~
먼저, 폴더 창을 엽니다. 아무 폴더나 상관없음.
폴더창 상단에 보면 주소창이 있는데,
빈 곳을 클릭하면 키보드로 입력할 수 있게 바뀜.
샘플로 내 최초 100만 인구 달성 도시를 공유한다.
Paradox Mods 로 도시 공유가 가능해졌기 때문에, 그 링크를 먼저 남긴다.
https://mods.paradoxplaza.com/mods/87348/Windows
파일로 받고 싶어하시는 분들을 위해...
원드라이브 링크 : Gilbert_20241027_0017.zip
대뜸 예제 첨부
일단 아래와 같은 클래스를 만들어 둔다.
import java.io.File;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.SourceDataLine;
/** Class to play wav file */
public class SoundClip implements Serializable
{
private static final long serialVersionUID = -4189707921602251694L;
protected URL url;
protected double volume = 100.0;
protected transient boolean flagStop = false;
/** Create instance with URL to get wav file */
public SoundClip(URL url)
{
this.url = url;
}
/** Create instance with wav file */
public SoundClip(File f) throws MalformedURLException
{
this(f.toURI().toURL());
}
/** Play wav sound now */
public void start()
{
if(url == null) return;
flagStop = false;
AudioInputStream inp1 = null;
AudioInputStream inp2 = null;
SourceDataLine line = null;
try
{
byte[] buffer = new byte[4096];
int reads;
// Load wav from URL
inp1 = AudioSystem.getAudioInputStream(url);
if(flagStop) return; // Return when stop() method called
// Detect audio format of wav file and get converted input stream
AudioFormat formatBase = inp1.getFormat();
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, formatBase.getSampleRate(), 16, formatBase.getChannels(), formatBase.getChannels() * 2, formatBase.getSampleRate(), false);
inp2 = AudioSystem.getAudioInputStream(format, inp1);
if(flagStop) return; // Return when stop() method called
// Create SourceDataLine to play wav
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
Mixer mixer = AudioSystem.getMixer(null);
line = (SourceDataLine) mixer.getLine(info);
if(flagStop) return; // Return when stop() method called
// Open SourceDataLine
line.open(format);
// This must be in here (after line opened !)
FloatControl ctrl = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
ctrl.setValue((float) (20.0f * Math.log10(volume / 100.0)));
// Play Start
line.start();
while(! flagStop)
{
reads = inp2.read(buffer, 0, buffer.length);
if(reads < 0) break; // Return when stop() method called
line.write(buffer, 0, reads);
}
// END
line.drain();
line.stop();
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try { line.close(); } catch(Exception ex) {}
try { inp2.close(); } catch(Exception ex) {}
try { inp1.close(); } catch(Exception ex) {}
flagStop = false;
}
}
/** Play wav sound now */
public void play()
{
start();
}
/** Stop playing */
public void stop()
{
flagStop = true;
}
/** Get volume (0 ~ 100) default 100 */
public double getVolume()
{
return volume;
}
/** Set volume (0 ~ 100) default 100 */
public void setVolume(double volume)
{
this.volume = volume;
if(this.volume < 0) this.volume = 0;
}
/** Get URL of wav file */
public URL getUrl() {
return url;
}
/** Set wav file */
public void setUrl(URL url) {
this.url = url;
}
}
이제 이걸 써먹으면 된다.
문제가 있는데, 사운드를 재생하는 동안 쓰레드를 독차지하고 있게 된다.
즉, 재생하는 동안 그 아래 코드들은 사운드 재생이 끝날 때까지 실행되지 않는다.
그래서 별도 쓰레드를 많이 만들어 두어서 재생 작업을 쓰레드에서 해야 된다.
기존 Beton Brutal 의 DLC Beton Bath 는 너무 난이도가 어려웠습니다.
Beton Brutal
https://store.steampowered.com/app/2330500/BETON_BRUTAL/
기존 Beton Brutal 의 DLC Beton Bath 는 너무 난이도가 어려웠습니다.
Beton Brutal
https://store.steampowered.com/app/2330500/BETON_BRUTAL/
Elgato Wave Neo 마이크가 도착하였다.
(구매는 https://smartstore.naver.com/grantree/products/10222370399)
먼저 도식도부터 보고 넘어가자.
게임컴에 왜 5800X3D를 안다냐고 할 수 있는데
1. 윈도우7 멀티부팅해서 쓰고 있으나 5800X3D를 달면 윈도우7 부팅하자마자 블루스크린
2. 시티즈 스카이라인 2가 3900X에서 더 성능이 잘 나옴.
이래서 본컴에 3900X 사용 중
RECentral 4 는 스트리밍 없이 녹화만 할 때 사용 중이다. 물론 방송에도 사용할 수는 있다.
RECentral 4는 사용이 쉽고, OBS 대비 부하가 적다.
RECentral 4의 단점은, 상세한 설정이 어렵고, 여러 플랫폼 동시송출 시 녹화 기능을 지원하지 않는다는 것이다. AVerMedia 캡처 카드가 있어야만 쓸 수 있는 프로그램이란 것도 있고.
반면 OBS는 오픈소스 무료 프로그램이라 여러 캡처카드를 지원한다. 설정하는 방법도 너무 복잡한데, 결국 필자가 방송 시에는 OBS를 쓰고 있으므로, 아래쪽에 세팅을 스샷으로 찍어놨다. 이 글을 계속 읽다보면 볼 수 있을 것이다.
결국 전문 스트리머 영역으로 가려면 OBS는 필수라고 할 수 있겠다.
그리고 송출컴에 이슈가 있었는데 해결했다.
어제까지만 해도, 송출 시 전부 x264 (오직 CPU로만 연산함) 으로만 인코딩을 했었다.
어제까지 쓰던 송출컴 GPU는 Radeon RX 550 인데, 이걸로 H264 인코딩 시에도 렉이 걸림.
그래서 녹화를 하면 영상에 렉이 걸리는 사태가 벌어졌음.
오늘 RTX 3050 6G 모델이 도착해 달아줌.