diff --git a/main.cpp b/main.cpp index 34ffc55..1d5c2d7 100644 --- a/main.cpp +++ b/main.cpp @@ -41,7 +41,7 @@ int main(int argc, char *argv[]) MainWindow main; main.setWindowTitle("流媒体测试工具"); - main.setFixedSize(1920,1080); + main.setFixedSize(1280,769); main.show(); return app.exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp index 2ce41cf..693de46 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -97,13 +97,14 @@ void MainWindow::on_pushButton_2_clicked() GUIDToAvFormat(mCamera->MediaType())); } mCamera->SetObserver(mVideoCoder); - + if(mPusher == nullptr) + mPusher = new H264RtmpPuser(); // todo 鏍规嵁杩斿洖缁撴灉鍒ゆ柇鏄惁鎺ㄦ祦 qDebug()<<"杩炴帴RTMP鏈嶅姟鍣"<lineEdit->text(); if (!mPusher->IfConnect()) { const char* address = ui->lineEdit->text().toLocal8Bit().data(); qDebug()<RTMP264_Connect("rtmp://127.0.0.1:1939/live/1")) { + if (0 == mPusher->RTMP264_Connect("rtmp://hyrtc.net:2530/live/123")) { ToastWidget::showTip("宸茬粡杩炴帴涓奟TMP鏈嶅姟鍣",this->parentWidget()); mVideoCoder->SetOberver(mPusher); mPusher->StartPush(); diff --git a/media/AudioCapture.h b/media/AudioCapture.h index 61433de..33718bd 100644 --- a/media/AudioCapture.h +++ b/media/AudioCapture.h @@ -1,7 +1,7 @@ #ifndef __CAPTUREAUDIO_H__ #define __CAPTUREAUDIO_H__ #include "stdint.h" -#include "../third/portaudio/portaudio.h" +#include "../third/portaudio/include/portaudio.h" #include #include //Windows diff --git a/media/RtmpPusher.cpp b/media/RtmpPusher.cpp index 8fb71da..4171b73 100644 --- a/media/RtmpPusher.cpp +++ b/media/RtmpPusher.cpp @@ -208,6 +208,8 @@ int H264RtmpPuser::sortAndSendNal(uint8_t * data, int len) uint8_t * nalhead = nullptr; uint8_t * naltail = nullptr; uint32_t size = 0; + static uint32_t time = 0; + if(0 == mStartTime){ mStartTime = RTMP_GetTime(); } @@ -221,11 +223,12 @@ int H264RtmpPuser::sortAndSendNal(uint8_t * data, int len) && ((data[i + 2] == 0x00) && (data[i + 3] == 0x01) || (data[i + 2] == 0x01))) { if ((nalhead == nullptr) && (i == 0) ) { if ((data[i + 3] == 0x01) && (data[i + 4] == 0x41)) { //p 帧直接发 + time += 100; nalhead = data; naltail = data + (len); size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, RTMP_GetTime() - mStartTime); + this->SendH264Packet(nalhead, size, 0, time - mStartTime); return 0; } //sps 帧进行解包 @@ -241,21 +244,22 @@ int H264RtmpPuser::sortAndSendNal(uint8_t * data, int len) else { // i frame if ((data[i + 2] == 0x01) && (data[i + 3] == 0x65)) { + time += 100; naltail = data + i; size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, RTMP_GetTime() - mStartTime); + this->SendH264Packet(nalhead, size, 0, time - mStartTime); nalhead = data + i; naltail = data + (len); size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, RTMP_GetTime() - mStartTime); + this->SendH264Packet(nalhead, size, 0, time - mStartTime); return 0; } //pps if ((data[i + 3] == 0x01) && (data[i + 4] == 0x68)) { // sps or pps or sei naltail = data + i; size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, RTMP_GetTime() - mStartTime); + this->SendH264Packet(nalhead, size, 0, time - mStartTime); nalhead = data + i; i += 3; }//sps @@ -267,7 +271,7 @@ int H264RtmpPuser::sortAndSendNal(uint8_t * data, int len) if ((data[i + 3] == 0x01) && (data[i + 4] == 0x06)) { // sps or pps or sei naltail = data + i; size = naltail - nalhead; - this->SendH264Packet(nalhead, size, 0, RTMP_GetTime() - mStartTime); + this->SendH264Packet(nalhead, size, 0, time - mStartTime); nalhead = data + i; i += 3; } diff --git a/media/VideoCoder.cpp b/media/VideoCoder.cpp index 243df21..9c0d759 100644 --- a/media/VideoCoder.cpp +++ b/media/VideoCoder.cpp @@ -74,8 +74,8 @@ VideoCoder::VideoCoder(int width, int height, AVPixelFormat formt): printf("Could not allocate video frame\n"); } mFrame->format = mCodecCtx->pix_fmt; - mFrame->width = mCodecCtx->width/2; - mFrame->height = mCodecCtx->height/2; + mFrame->width = mCodecCtx->width; + mFrame->height = mCodecCtx->height; mFrame->pts = 0; int ret = av_image_alloc(mFrame->data, mFrame->linesize, mCodecCtx->width, mCodecCtx->height, mCodecCtx->pix_fmt, 8); @@ -125,14 +125,17 @@ void VideoCoder::Encode(uint8_t * src, int size, enum AVPixelFormat format) { mFrame->pts++; int got_picture = 0; //Encode - avcodec_encode_video2(mCodecCtx, &mAVPack, mFrame, &got_picture); - if (got_picture > 0) { + ret = avcodec_encode_video2(mCodecCtx, &mAVPack, mFrame, &got_picture); + + if (got_picture > 0) { + fwrite(mAVPack.data, 1, mAVPack.size, p); + fflush(p); if(nullptr != this->mObserver) this->mObserver->OnGetCodeFrame(mAVPack.data, mAVPack.size); } - //Debuger::Debug(L"Succeed to encode frame: %5d\tsize:%5d\n", 1, mAVPack.size); - fwrite(mAVPack.data, 1, mAVPack.size, p); - fflush(p); + Debuger::Debug(L"Succeed to encode frame: %5d\tsize:%5d\n", 1, mAVPack.size); + + // 鍒锋柊coder锛岄槻姝㈠寘鎸ゅ帇 av_packet_unref(&mAVPack); av_freep(&pFrame[0]); @@ -208,7 +211,7 @@ int VideoCoder::forceYUV420P(uint8_t * src, int size, //Show AVOption //av_opt_show2(img_convert_ctx, stdout, AV_OPT_FLAG_VIDEO_PARAM, 0); //Set Value - av_opt_set_int(img_convert_ctx, "sws_flags", SWS_BICUBIC | SWS_PRINT_INFO, 0); + av_opt_set_int(img_convert_ctx, "sws_flags", SWS_BICUBIC | SWS_PRINT_INFO, 0); av_opt_set_int(img_convert_ctx, "srcw", mWidth, 0); av_opt_set_int(img_convert_ctx, "srch", mHeight, 0); av_opt_set_int(img_convert_ctx, "src_format", format, 0); @@ -252,7 +255,7 @@ int VideoCoder::forceYUV420P(uint8_t * src, int size, memcpy(src_data[0], src, mWidth*mHeight * 3); //Packed break; } - case AV_PIX_FMT_RGB32: { + case AV_PIX_FMT_BGRA: { memcpy(src_data[0], src, mWidth*mHeight *4); //Packed break; } @@ -273,7 +276,6 @@ int VideoCoder::forceYUV420P(uint8_t * src, int size, *len = mDestWidth*mDestHeight + mDestWidth*mDestHeight / 2; // source姝ゆ椂灏变笉闇瑕佷簡锛屼絾鏄痙st瑕佸湪澶栭潰free av_freep(&src_data[0]); - av_freep(&dst_data[0]); sws_freeContext(img_convert_ctx); return 0; diff --git a/media/audiocaptureff.h b/media/audiocaptureff.h index 15276ac..2b03698 100644 --- a/media/audiocaptureff.h +++ b/media/audiocaptureff.h @@ -2,7 +2,7 @@ #define AUDIOCAPTUREFF_H #include "stdint.h" -#include "../third/portaudio/portaudio.h" +#include "../third/portaudio/include/portaudio.h" #include #include //Windows diff --git a/readme.md b/readme.md index ae203b1..7d6f60f 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ 3. opengl鐢ㄤ簬鏈湴鎽勫儚澶寸殑娓叉煋銆 4. directshow鐨勭浉鍏虫帴鍙g敤浜庤幏鍙栨湰鍦扮殑鎽勫儚澶存暟鎹 5. 鐣岄潰椋庢牸鍩轰簬!qssWrpter搴 https://gitee.com/290198252/qsswraper -6. librtmp闇瑕乷penssl 1.10 浠ヤ笅鐨勭増鏈 +6. librtmp闇瑕乷penssl 1.10浠ヤ笅鐗堟湰 ### 鐣岄潰: @@ -19,4 +19,6 @@ #### 鍙戣鐗 -- win32 \ No newline at end of file +- win32 + + diff --git a/utils/utils.cpp b/utils/utils.cpp index b577c78..8a2967d 100644 --- a/utils/utils.cpp +++ b/utils/utils.cpp @@ -20,5 +20,8 @@ AVPixelFormat GUIDToAvFormat(GUID mediatype){ if(IsEqualIID(MEDIASUBTYPE_RGB32,mediatype)){ return AV_PIX_FMT_BGRA; } + if(IsEqualIID(MEDIASUBTYPE_ARGB32,mediatype)){ + return AV_PIX_FMT_BGRA; + } return AV_PIX_FMT_NONE; } diff --git a/utils/utils.h b/utils/utils.h new file mode 100644 index 0000000..32af839 --- /dev/null +++ b/utils/utils.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include "qedit.h" +#include +#include +#include "guiddef.h" + + +extern "C" +{ +#include "libavcodec/avcodec.h" +#include "libavformat/avformat.h" +#include "libavutil/avutil.h" +#include "libswscale/swscale.h" +#include "libavutil/opt.h" +#include "libavutil/imgutils.h" +} + +using namespace std; + +wstring char2wchar(const char* cchar); + + +AVPixelFormat GUIDToAvFormat(GUID mediatype); diff --git a/yuvgl.pro b/yuvgl.pro index af249db..5b2c6f8 100644 --- a/yuvgl.pro +++ b/yuvgl.pro @@ -11,8 +11,8 @@ QT += multimedia TARGET = yuvgl -INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtZlib "C:/Program Files/OpenSSL-Win64/include" \ - $$PWD//third//ffmpeg//include +INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtZlib \ + media/ include(G:\\project\\c++qt\\qsswraper\\qsswraper.pri) @@ -49,7 +49,6 @@ SOURCES += \ media/audiocaptureff.cpp \ media/screen_capture.cpp \ media/sps_decode.cpp \ - utils/Base64.cpp \ utils/Debuger.cpp \ utils/utils.cpp HEADERS += \ @@ -57,7 +56,8 @@ HEADERS += \ librtmp/strncasecmp.h \ mainwindow.h \ cplaywidget.h \ - media/screen_capture.h + media/screen_capture.h \ + utils/utils.h FORMS += \ @@ -65,9 +65,6 @@ FORMS += \ mainwindow.ui -INCLUDEPATH += media/ \ - C:\\Program Files\\OpenSSL-Win64\\include - contains(DEFINES, __MINGW32__){ message("mingw") INCLUDEPATH += media/ inc/ @@ -79,7 +76,8 @@ contains(DEFINES, __MINGW32__){ } else { message("64-bit") } - }else{ + +}else{ message("msvc") @@ -88,7 +86,7 @@ contains(DEFINES, __MINGW32__){ contains(QT_ARCH, i386) { - INCLUDEPATH += inc $$PWD/third/msvc32/fdk-aac/include \ + INCLUDEPATH += inc $$PWD/third/fdk-aac/include \ $$PWD/third/msvc32/libx264/include \ $$PWD/third/msvc32/ffmpeg/include \ $$PWD/third/msvc32/openssl/include @@ -101,12 +99,32 @@ contains(DEFINES, __MINGW32__){ LIBS += libavfilter.a libavdevice.a libavcodec.a libpostproc.a \ libavformat.a libavutil.a \ libswresample.a libswscale.a fdk-aac.lib ws2_32.lib libeay32.lib ssleay32.lib \ - shell32.lib gdi32.lib crypt32.lib User32.lib GDI32.lib Advapi32.lib zlibstaticd.lib Secur32.lib \ + shell32.lib gdi32.lib crypt32.lib User32.lib GDI32.lib Advapi32.lib Secur32.lib \ Bcrypt.lib Kernel32.lib portaudio_x86.lib ole32.lib oleaut32.lib strmiids.lib libx264.lib d3d9.lib } else{ message("64-bit") + INCLUDEPATH += inc $$PWD/third/fdk-aac/include \ + $$PWD/third/ffmpeg/include \ + $$PWD/third/openssl_1_0_2/include \ + $$PWD/third/libx264/include \ + include + + + LIBS += -L$$PWD/third/openssl_1_0_2/lib + LIBS += -L$$PWD/third/ffmpeg/lib + LIBS += -L$$PWD/third/fdk-aac/lib + LIBS += -L$$PWD/third/portaudio/lib + LIBS += -L$$PWD/third/libx264/lib/x64 + + + LIBS += avfilter.lib avdevice.lib libavcodec.dll.a postproc.lib \ + libavformat.dll.a libavutil.dll.a \ + libswresample.dll.a libswscale.dll.a fdk-aac.lib ws2_32.lib libeay32.lib ssleay32.lib \ + shell32.lib gdi32.lib crypt32.lib User32.lib GDI32.lib Advapi32.lib Secur32.lib \ + Bcrypt.lib Kernel32.lib portaudio_x64.lib ole32.lib oleaut32.lib strmiids.lib libx264.lib d3d9.lib + QMAKE_CXXFLAGS_RELEASE += -Zi QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF diff --git a/yuvgl.pro.user b/yuvgl.pro.user index 5e86e24..2795ca8 100644 --- a/yuvgl.pro.user +++ b/yuvgl.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -82,6 +82,9 @@ true + + true + @@ -238,12 +241,12 @@ 2 false - yuvgl2 - Qt4ProjectManager.Qt4RunConfiguration:D:/project/rtmp/yuvgl.pro - D:/project/rtmp/yuvgl.pro + Qt4ProjectManager.Qt4RunConfiguration:G:/project/multimedia/client/rtmp_demo/yuvgl/yuvgl.pro + G:/project/multimedia/client/rtmp_demo/yuvgl/yuvgl.pro true true true + G:/project/multimedia/client/rtmp_demo/build-yuvgl-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug 1