Browse Source

定制化

worker
unknown 7 years ago
parent
commit
e2da9817aa
  1. 228
      FlvClient.cpp
  2. 2
      broadway.h
  3. 9
      build_decoder.sh
  4. 3
      js/FlvMain.js
  5. 781203
      js/MonaClient.js
  6. BIN
      js/MonaClient.wasm
  7. 33
      make.py
  8. 10
      mse.go

228
FlvClient.cpp

@ -1,119 +1,141 @@
#include "base.h"
#include "FlvDecoder.h"
extern "C" {extern void init(void);}
extern "C"
{
extern void init(void);
}
int main()
{
init();
return 0;
init();
return 0;
}
class FlvClient
{
val* client = nullptr;
val* netStatusLisenter = nullptr;
val* jsThis = nullptr;
val *client = nullptr;
val *netStatusLisenter = nullptr;
val *jsThis = nullptr;
string url;
int status = 0;
int audioBuffer = 12;
MemoryStream buffer;
public:
public:
FlvDecoder flvDecoder;
FlvClient(){
}
~FlvClient(){
delete client;
delete netStatusLisenter;
delete jsThis;
}
void OnWsMessage(val evt){
string data = evt["data"].as<string>();
switch(status){
case 0:
buffer<<data;
if(buffer.length()>=13){
status=1;
buffer.offset=13;
buffer.removeConsume();
FlvClient()
{
}
~FlvClient()
{
delete client;
delete netStatusLisenter;
delete jsThis;
}
void OnWsMessage(val evt)
{
string data = evt["data"].as<string>();
switch (status)
{
case 0:
buffer << data;
if (buffer.length() >= 13)
{
status = 1;
buffer.offset = 13;
buffer.removeConsume();
}
break;
case 1:
buffer << data;
while (buffer.length() > 3)
{
u8 type = buffer.readu8();
unsigned int length = buffer.readUInt24B();
if (buffer.length() < length + 4 + 7)
{
buffer <<= 4;
break;
}
break;
case 1:
buffer<<data;
while(buffer.length()>3)
unsigned int timestamp = buffer.readUInt24B();
u8 ext = buffer.readu8();
buffer.readUInt24B();
MemoryStream ms(buffer.readString(length));
switch (type)
{
u8 type = buffer.readu8();
unsigned int length = buffer.readUInt24B();
if(buffer.length()<length+4+7){
buffer<<=4;
break;
}
unsigned int timestamp = buffer.readUInt24B();
u8 ext = buffer.readu8();
buffer.readUInt24B();
MemoryStream ms(buffer.readString(length));
switch(type){
case 0x08:
if(!flvDecoder.audioDecoder){
unsigned char flag = ms[0];
auto audioType = flag >> 4;
int channels = (flag & 1)+1;
int rate = (flag>>2)&3;
switch(rate){
case 1:
rate=11025;
break;
case 2:
rate=22050;
break;
case 3:
rate=44100;
break;
}
switch(audioType){
case 10://AAC
jsThis->call<void>("initAudio",audioBuffer * 1024, rate, channels);
break;
case 11://Speex
jsThis->call<void>("initAudio",50*320, 16000 , channels);
break;
case 2://MP3
jsThis->call<void>("initAudio",audioBuffer * 576, rate,channels);
break;
}
case 0x08:
if (!flvDecoder.audioDecoder)
{
unsigned char flag = ms[0];
auto audioType = flag >> 4;
int channels = (flag & 1) + 1;
int rate = (flag >> 2) & 3;
switch (rate)
{
case 1:
rate = 11025;
break;
case 2:
rate = 22050;
break;
case 3:
rate = 44100;
break;
}
switch (audioType)
{
case 10: //AAC
jsThis->call<void>("initAudio", audioBuffer * 1024, rate, channels);
break;
case 11: //Speex
jsThis->call<void>("initAudio", 50 * 320, 16000, channels);
break;
case 2: //MP3
jsThis->call<void>("initAudio", audioBuffer * 576, rate, channels);
break;
}
flvDecoder.decodeAudio(timestamp,ms);
break;
case 0x09:
flvDecoder.decodeVideo(timestamp,ms);
break;
}
length = buffer.readUInt32B();
flvDecoder.decodeAudio(timestamp, ms);
break;
case 0x09:
flvDecoder.decodeVideo(timestamp, ms);
break;
}
buffer.removeConsume();
break;
length = buffer.readUInt32B();
}
buffer.removeConsume();
break;
}
//MemoryStream ms(data);
}
void Play(val _this, bool webgl){
if (!jsThis) jsThis = new val(_this);
flvDecoder.attachCanvas(jsThis,webgl);
}
void Close(){
//MemoryStream ms(data);
}
void Play(val _this, bool webgl)
{
if (!jsThis)
jsThis = new val(_this);
flvDecoder.attachCanvas(jsThis, webgl);
}
val GetWebSocket(string url)
{
val WebSocket = val::global("WebSocket");
val *ws = new val(WebSocket.new_("wss://hdl.98ff.cn/live/" + url));
return *ws;
}
void Close()
{
buffer.clear();
flvDecoder.clear();
status = 0;
//delete this;
}
int initAudio(int frameCount, int channels) {
emscripten_log(0,"initAudio,frameCount:%d,channels:%d",frameCount,channels);
return flvDecoder.initAudio(frameCount,channels);
//delete this;
}
void decodeVideoBuffer(){
int initAudio(int frameCount, int channels)
{
emscripten_log(0, "initAudio,frameCount:%d,channels:%d", frameCount, channels);
return flvDecoder.initAudio(frameCount, channels);
}
void decodeVideoBuffer()
{
flvDecoder.decodeVideoBuffer();
}
val getBufferTime() const
@ -135,14 +157,14 @@ public:
};
EMSCRIPTEN_BINDINGS(FlvClient)
{
class_<FlvClient>("FlvClient")
.constructor()
.function("$onWsMessage", &FlvClient::OnWsMessage)
.function("$close", &FlvClient::Close)
.function("_initAudio",&FlvClient::initAudio)
.function("decodeVideoBuffer", &FlvClient::decodeVideoBuffer)
.property("videoBuffer", &FlvClient::getBufferTime, &FlvClient::setBufferTime)
.property("audioBuffer", &FlvClient::getAudioBuffer, &FlvClient::setAudioBuffer)
.function("$play", &FlvClient::Play)
;
class_<FlvClient>("FlvClient")
.constructor()
.function("$onWsMessage", &FlvClient::OnWsMessage)
.function("$close", &FlvClient::Close)
.function("_initAudio", &FlvClient::initAudio)
.function("decodeVideoBuffer", &FlvClient::decodeVideoBuffer)
.property("videoBuffer", &FlvClient::getBufferTime, &FlvClient::setBufferTime)
.property("audioBuffer", &FlvClient::getAudioBuffer, &FlvClient::setAudioBuffer)
.function("$play", &FlvClient::Play)
.function("$getWebSocket", &FlvClient::GetWebSocket);
}

2
broadway.h

@ -101,4 +101,4 @@ class Broadway :public VideoDecoder{
}
return ret;
}
}
};

9
build_decoder.sh

@ -0,0 +1,9 @@
cd ffmpeg
emconfigure ./configure --extra-cflags="-c -O3" --cc="emcc" --cxx="em++" --ar="emar" --prefix=$(pwd)/../dist --enable-cross-compile --target-os=none --arch=x86_32 --cpu=generic \
--enable-gpl --enable-version3 --disable-avdevice --disable-avformat --disable-swresample --disable-postproc --disable-avfilter \
--disable-programs --disable-logging --disable-everything --enable-decoder=h264 --enable-small\
--disable-asm --disable-doc --disable-devices --disable-network --disable-static --enable-shared \
--disable-hwaccels --enable-parser=h264 --enable-parser=hevc --enable-parser=aac --disable-bsfs --disable-debug --disable-protocols --disable-indevs --disable-outdevs
make

3
js/FlvMain.js

@ -119,7 +119,8 @@ mergeInto(LibraryManager.library, {
return webGLCanvas;
};
var _this = this;
var ws = new WebSocket(url);
var ws = this.$getWebSocket(url)
// var ws = new WebSocket('wss://hdl.98ff.cn/live/' + url);
ws.onmessage = function(data) {
_this.$onWsMessage(data);
};

781203
js/MonaClient.js
File diff suppressed because it is too large
View File

BIN
js/MonaClient.wasm

33
make.py

@ -16,16 +16,17 @@ import tools.shared as emscripten
emcc_args = [
'--pre-js', os.path.join('js', 'WebGLCanvas.js'),
#'-m32',
#'-O3',
'-O3',
'--memory-init-file', '0',
#'--llvm-opts', '3',
#'-s','WASM=1',
'--llvm-opts', '3',
# '-s', 'WASM=1',
#'-s', 'CORRECT_SIGNS=1',
#'-s', 'CORRECT_OVERFLOWS=1',
'-s', 'TOTAL_MEMORY=67108864',
#'-s', 'FAST_MEMORY=' + str(12*1024*1024),
#'-s', 'INVOKE_RUN=0',
'-s', 'ASSERTIONS=1',
#'-s DEMANGLE_SUPPORT=1',
# '-s', 'RELOOP=1',
#'-s', '''EXPORTED_FUNCTIONS=["_main"]''',
#'--closure', '1',
@ -35,20 +36,38 @@ emcc_args = [
'-IBroadway', '-I.',
#'-I../libid3tag',
'-Iffmpeg/include',
'-I../ffmpeg',
# '-DUSE_MP3',
#'-DUSE_LIBDE265',
'-DUSE_AAC',
'-DUSE_FFMPEG',
'--js-library', os.path.join('js', 'MonaMain.js')
# '--js-transform', 'python appender.py'
# '--js-library', os.path.join('js', 'FlvMain.js')
]
print 'build'
object_files = ['ffmpeg.bc', 'aac.bc']
object_files = ['aac.bc']
object_files = [os.path.join('obj', x) for x in object_files]
name = 'libavutil'
os.system('emcc MonaClient.cpp ' +
(' '.join(object_files+emcc_args)) + ' -o js/MonaClient.js')
libavutil_files = list(
filter(lambda file: file.endswith('.o'), os.listdir('../ffmpeg/'+name)))
libavutil_files = [os.path.join('../ffmpeg/'+name, x) for x in libavutil_files]
name = 'libavcodec'
libavcodec_files = list(
filter(lambda file: file.endswith('.o'), os.listdir('../ffmpeg/'+name)))
libavcodec_files.remove('reverse.o')
libavcodec_files.remove('log2_tab.o')
libavcodec_files = [os.path.join('../ffmpeg/'+name, x)
for x in libavcodec_files]
# os.system('emcc FlvClient.cpp ' +
# (' '.join(libavutil_files+libavcodec_files+object_files+emcc_args)) + ' -o js/FlvClient.js')
os.system('emcc MonaClient.cpp ' +
(' '.join(libavutil_files+libavcodec_files+object_files+emcc_args)) + ' -o js/MonaClient.js')
print 'done'

10
mse.go

@ -55,8 +55,14 @@ func main() {
//fmt.Println("Transmux", n, "bytes")
}
}))
if err := http.ListenAndServe(fmt.Sprintf(":%v", frontend), nil); err != nil {
fmt.Println("Serve failed, err is", err)
go func() {
err_https :=http.ListenAndServeTLS(fmt.Sprintf(":%v", frontend+1),"cert.crt", "key.pem",nil);
if err_https!=nil{
fmt.Println("https Serve failed, err is", err_https)
}
}()
if err_http := http.ListenAndServe(fmt.Sprintf(":%v", frontend), nil); err_http != nil {
fmt.Println("http Serve failed, err is", err_http)
return
}
}
Loading…
Cancel
Save