From f94c292ff4aea47d2f28bff7938176e3e3707cd1 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Wed, 19 Jun 2024 17:04:14 +0800 Subject: [PATCH] Backup:ffmpeg open audio file failed. --- external/ffmpeg/CMakeLists.txt | 2 +- external/ffmpeg/README.md | 18 ++++- external/goahead-5.2.0/CMakeLists.txt | 30 +++++++- test/application/HuntingCamera/CMakeLists.txt | 9 ++- test/hal/tool/src/CameraHalMock.cpp | 26 +++++-- test/hal/tool/src/CameraHalMock.h | 1 + utils/FxHttpServer/CMakeLists.txt | 2 +- utils/MediaBase/CMakeLists.txt | 2 +- utils/MediaBase/build/mediabase.cmake | 2 + utils/MediaBase/include/MediaBase.h | 2 + utils/MediaBase/src/IMediaBase.cpp | 7 +- utils/MediaBase/src/IMediaBase.h | 1 + utils/MediaBase/src/MediaBase.cpp | 7 ++ utils/MediaBase/src/MediaBaseImpl.cpp | 68 +++++++++++++++---- utils/MediaBase/src/MediaBaseImpl.h | 9 ++- utils/MediaBase/src/MediaBaseMakePtr.cpp | 4 +- utils/MediaBase/src/MediaBaseMakePtr.h | 2 +- utils/WebServer/CMakeLists.txt | 51 ++------------ utils/WebServer/build/webserver.cmake | 4 +- 19 files changed, 168 insertions(+), 79 deletions(-) create mode 100644 utils/MediaBase/build/mediabase.cmake diff --git a/external/ffmpeg/CMakeLists.txt b/external/ffmpeg/CMakeLists.txt index a18f0da6..ecc4f2fa 100644 --- a/external/ffmpeg/CMakeLists.txt +++ b/external/ffmpeg/CMakeLists.txt @@ -5,7 +5,7 @@ if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX}) --cxx=${CMAKE_CXX_COMPILER} \ --prefix=${EXTERNAL_LIBS_OUTPUT_PATH}/ffmpeg \ --enable-parsers --enable-decoder=h264 \ - --enable-ffmpeg --enable-shared --enable-static \ + --enable-ffmpeg --enable-static \ --enable-gpl --enable-nonfree --enable-version3 --enable-small \ --enable-muxer=mov --enable-muxer=mp4 \ --enable-decoder=aac \ diff --git a/external/ffmpeg/README.md b/external/ffmpeg/README.md index bb65b302..0415f121 100644 --- a/external/ffmpeg/README.md +++ b/external/ffmpeg/README.md @@ -1,8 +1,22 @@ # 1. ffmpeg开发文档 -## 1.1. 问题记录 +## 1.1. ffplay命令使用 -### 1.1.1. avformat_open_input执行失败 +* 播放G711a音频文件 + +```code +$ ffplay -i audio.g711a -f alaw -ac 1 -ar 8000 +``` + +* 播放h264视频文件 + +```code +$ ffplay video.h264 +``` + +## 1.2. 问题记录 + +### 1.2.1. avformat_open_input执行失败   在执行avformat_open_input时,返回-1094995529<0,错误 diff --git a/external/goahead-5.2.0/CMakeLists.txt b/external/goahead-5.2.0/CMakeLists.txt index b746ca48..9ad6b517 100644 --- a/external/goahead-5.2.0/CMakeLists.txt +++ b/external/goahead-5.2.0/CMakeLists.txt @@ -1,4 +1,30 @@ include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) include(${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/goahead.cmake) -set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) -set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) \ No newline at end of file +include(${UTILS_SOURCE_PATH}/WebServer/build/webserver.cmake) +add_custom_target( + goahead-5.2.0 + COMMAND test -f ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile || tar zxvf goahead-5.2.0.tar.gz + COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/modify/http.c ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/src + COMMAND chmod 777 -R GoAhead + COMMAND cd GoAhead && make CC=${CMAKE_C_COMPILER} ARCH=${SET_ARCH} PROFILE=${LIB_TYPE} ME_GOAHEAD_UPLOAD_DIR=\"${GOAHEAD_UPLOAD_TMP_PATH}\" + ME_GOAHEAD_SSL_KEY=\"${GOAHEAD_CONFIG_FILE_PATH}/self.key\" ME_GOAHEAD_SSL_CERTIFICATE=\"${GOAHEAD_CONFIG_FILE_PATH}/self.crt\" + ${ME_GOAHEAD_LIMIT_POST} -f ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/modify/goahead-linux-static-fancy.mk + COMMAND echo "Copy goahead lib to output path." + COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgo.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a + COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libmbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libmbedtls.a + COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgoahead-mbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgoahead-mbedtls.a + COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.crt ${PLATFORM_PATH}/cmake-shell/ + COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.key ${PLATFORM_PATH}/cmake-shell/ + COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/route.txt ${PLATFORM_PATH}/cmake-shell/ + COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/auth.txt ${PLATFORM_PATH}/cmake-shell/ + WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/ +) + +add_custom_target( + remove_goahead_source_files + COMMAND rm -rf GoAhead + WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/ +) + +# 将clean目标依赖于我们自定义的clean_script目标 +add_dependencies(sdk_clean remove_goahead_source_files) \ No newline at end of file diff --git a/test/application/HuntingCamera/CMakeLists.txt b/test/application/HuntingCamera/CMakeLists.txt index 1688924f..13820f2a 100644 --- a/test/application/HuntingCamera/CMakeLists.txt +++ b/test/application/HuntingCamera/CMakeLists.txt @@ -1,6 +1,8 @@ # include(${CMAKE_SOURCE_DIR}/build/independent_source.cmake) include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) include(${APPLICATION_SOURCE_PATH}/HuntingCamera/build/hunting_camera.cmake) +include(${UTILS_SOURCE_PATH}/WebServer/build/webserver.cmake) +include(${UTILS_SOURCE_PATH}/MediaBase/build/mediabase.cmake) set(EXECUTABLE_OUTPUT_PATH ${TEST_OUTPUT_PATH}/bin) include_directories( @@ -43,8 +45,11 @@ endif() set(TARGET_NAME HuntingCameraTest) add_executable(${TARGET_NAME} ${SRC_FILES_MAIN} ${SRC_FILES}) -target_link_libraries(${TARGET_NAME} HuntingMainLib MissionManagerTestTool McuManagerTestTool McuAskBaseTestTool - AppManagerTestTool HalTestTool DeviceManagerTestTool TestManager gtest gmock pthread) +target_link_libraries(${TARGET_NAME} -Wl,--start-group HuntingMainLib MissionManagerTestTool McuManagerTestTool McuAskBaseTestTool + AppManagerTestTool HalTestTool DeviceManagerTestTool TestManager + MediaBase avformat avcodec avutil swresample avdevice avfilter swscale postproc z + -Wl,--end-group + gtest gmock pthread) if(${TEST_COVERAGE} MATCHES "true") target_link_libraries(${TARGET_NAME} gcov) endif() diff --git a/test/hal/tool/src/CameraHalMock.cpp b/test/hal/tool/src/CameraHalMock.cpp index b8e124ab..d8679d48 100644 --- a/test/hal/tool/src/CameraHalMock.cpp +++ b/test/hal/tool/src/CameraHalMock.cpp @@ -19,19 +19,25 @@ #include "StatusCode.h" #include CameraHalTest::CameraHalTest(const CameraType &cameraType) - : mCameraType(cameraType), mReadH264File(nullptr), mTaskRuning(false) + : mCameraType(cameraType), mReadH264File(nullptr), mReadG711File(nullptr), mTaskRuning(false) { } void CameraHalTest::Init(void) { CameraHal::Init(); if (nullptr == mReadH264File) { - ReadVideoFileCallback callback = [](const void *stream, const unsigned int length, void *context) -> void { - // LogInfo("CameraHalTest::ReadVideoFileCallback.\n"); + ReadVideoFileCallback videCallback = [](const void *stream, const unsigned int length, void *context) -> void { ((CameraHalTest *)context)->ReadDataFromH264File(stream, length); }; mReadH264File = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_H264); - ISetReadVideoCallback(mReadH264File, callback, this); + ISetReadVideoCallback(mReadH264File, videCallback, this); + } + if (nullptr == mReadG711File) { + ReadAudioFileCallback audioCallback = [](const void *stream, const unsigned int length, void *context) -> void { + ((CameraHalTest *)context)->ReadDataFromH264File(stream, length); + }; + mReadG711File = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_H264); + ISetReadVideoCallback(mReadG711File, audioCallback, this); } } void CameraHalTest::UnInit(void) @@ -48,6 +54,12 @@ void CameraHalTest::UnInit(void) IMediaBaseFree(mReadH264File); mReadH264File = nullptr; } + if (mReadG711File) { + ISetReadAudioCallback(mReadG711File, nullptr, nullptr); + IStopReadFile(mReadG711File); + IMediaBaseFree(mReadG711File); + mReadG711File = nullptr; + } } void CameraHalTest::SetCameraMonitor(std::shared_ptr &monitor) { @@ -83,6 +95,9 @@ StatusCode CameraHalTest::StopTask(void) if (nullptr != mReadH264File) { IStopReadFile(mReadH264File); } + if (nullptr != mReadG711File) { + IStopReadFile(mReadG711File); + } mCv.notify_one(); return CameraHal::StopTask(); } @@ -97,6 +112,9 @@ void CameraHalTest::MockReportMediaStream(void) if (nullptr != mReadH264File) { IStartReadFile(mReadH264File, TEST_SOURCE_PATH "/support_test/video.h264"); } + if (nullptr != mReadG711File) { + IStartReadFile(mReadG711File, TEST_SOURCE_PATH "/support_test/audio.g711a"); + } while (mTaskRuning) { std::unique_lock lock(mMutex); mCv.wait(lock, [&] { diff --git a/test/hal/tool/src/CameraHalMock.h b/test/hal/tool/src/CameraHalMock.h index 2c1d7ddd..ec47ce8f 100644 --- a/test/hal/tool/src/CameraHalMock.h +++ b/test/hal/tool/src/CameraHalMock.h @@ -44,6 +44,7 @@ protected: std::weak_ptr mMonitor; std::shared_ptr mFastBootEvent; void *mReadH264File; + void *mReadG711File; std::mutex mMutex; std::condition_variable mCv; bool mTaskRuning; diff --git a/utils/FxHttpServer/CMakeLists.txt b/utils/FxHttpServer/CMakeLists.txt index 2f20c634..30cccdee 100644 --- a/utils/FxHttpServer/CMakeLists.txt +++ b/utils/FxHttpServer/CMakeLists.txt @@ -23,7 +23,7 @@ aux_source_directory(./src SRC_FILES) set(TARGET_NAME FxHttpServer) add_library(${TARGET_NAME} STATIC ${SRC_FILES}) -target_link_libraries(${TARGET_NAME} StatusCode Log -Wl,--start-group httpsrv -Wl,--end-group) +target_link_libraries(${TARGET_NAME} StatusCode Log httpsrv) add_custom_target( FxHttpServer_code_check diff --git a/utils/MediaBase/CMakeLists.txt b/utils/MediaBase/CMakeLists.txt index 070a87c3..130ed508 100644 --- a/utils/MediaBase/CMakeLists.txt +++ b/utils/MediaBase/CMakeLists.txt @@ -19,7 +19,7 @@ aux_source_directory(./src SRC_FILES) set(TARGET_NAME MediaBase) add_library(${TARGET_NAME} STATIC ${SRC_FILES}) -target_link_libraries(${TARGET_NAME} avformat avcodec avutil swresample StatusCode Log) +target_link_libraries(${TARGET_NAME} StatusCode Log) add_custom_target( MediaBase_code_check diff --git a/utils/MediaBase/build/mediabase.cmake b/utils/MediaBase/build/mediabase.cmake new file mode 100644 index 00000000..438146fd --- /dev/null +++ b/utils/MediaBase/build/mediabase.cmake @@ -0,0 +1,2 @@ + +set(FFMPEG_EXTERNAL_LIBS avformat avcodec avutil swresample avdevice avfilter swscale postproc z) \ No newline at end of file diff --git a/utils/MediaBase/include/MediaBase.h b/utils/MediaBase/include/MediaBase.h index 7ffda1bf..51275d7e 100644 --- a/utils/MediaBase/include/MediaBase.h +++ b/utils/MediaBase/include/MediaBase.h @@ -25,10 +25,12 @@ enum MediaHandleType MEDIA_HANDLE_TYPE_END }; typedef void (*ReadVideoFileCallback)(const void *, const unsigned int, void *); +typedef void (*ReadAudioFileCallback)(const void *, const unsigned int, void *); void *ICreateMediaBase(const MediaHandleType type); // StatusCode Init(void *object); // StatusCode UnInit(void *object); StatusCode ISetReadVideoCallback(void *object, ReadVideoFileCallback callback, void *context); +StatusCode ISetReadAudioCallback(void *object, ReadVideoFileCallback callback, void *context); StatusCode IStartReadFile(void *object, const char *path); StatusCode IStopReadFile(void *object); void IMediaBaseFree(void *object); diff --git a/utils/MediaBase/src/IMediaBase.cpp b/utils/MediaBase/src/IMediaBase.cpp index 6f15ddbf..7edeaa91 100644 --- a/utils/MediaBase/src/IMediaBase.cpp +++ b/utils/MediaBase/src/IMediaBase.cpp @@ -36,6 +36,11 @@ StatusCode IMediaBase::SetReadVideoCallback(ReadVideoFileCallback callback, void LogWarning("STATUS_CODE_VIRTUAL_FUNCTION\n"); return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } +StatusCode IMediaBase::SetReadAudioCallback(ReadVideoFileCallback callback, void *context) +{ + LogWarning("STATUS_CODE_VIRTUAL_FUNCTION\n"); + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} static const char *MEDIA_BASE_NAME = "media_adapter"; const char *GetMediaBaseModuleName(void) { @@ -48,6 +53,6 @@ std::shared_ptr *NewIMediaBase(const MediaHandleType &type) MeidaAdapter tmp; memcpy((void *)impl, (void *)&tmp, sizeof(MeidaAdapter)); impl->mHeader.mCheckName = MEDIA_BASE_NAME; - impl->mIMediaBase = MediaBaseMakePtr::GetInstance()->CreateMediaBase(); + impl->mIMediaBase = MediaBaseMakePtr::GetInstance()->CreateMediaBase(type); return (std::shared_ptr *)(((char *)impl) + sizeof(MediaBaseHeader)); } \ No newline at end of file diff --git a/utils/MediaBase/src/IMediaBase.h b/utils/MediaBase/src/IMediaBase.h index 8265a4de..aa450142 100644 --- a/utils/MediaBase/src/IMediaBase.h +++ b/utils/MediaBase/src/IMediaBase.h @@ -24,6 +24,7 @@ public: virtual StatusCode StartReadFile(const std::string &path); virtual StatusCode StopReadFile(void); virtual StatusCode SetReadVideoCallback(ReadVideoFileCallback callback, void *context); + virtual StatusCode SetReadAudioCallback(ReadVideoFileCallback callback, void *context); }; typedef struct media_base_header { diff --git a/utils/MediaBase/src/MediaBase.cpp b/utils/MediaBase/src/MediaBase.cpp index b12ace35..8b1c256f 100644 --- a/utils/MediaBase/src/MediaBase.cpp +++ b/utils/MediaBase/src/MediaBase.cpp @@ -42,6 +42,13 @@ StatusCode ISetReadVideoCallback(void *object, ReadVideoFileCallback callback, v } return CreateStatusCode(STATUS_CODE_OK); } +StatusCode ISetReadAudioCallback(void *object, ReadVideoFileCallback callback, void *context) +{ + if (ObjectCheck(object) == true) { + return (*(std::shared_ptr *)object)->SetReadAudioCallback(callback, context); + } + return CreateStatusCode(STATUS_CODE_OK); +} StatusCode IStartReadFile(void *object, const char *path) { if (ObjectCheck(object) == true) { diff --git a/utils/MediaBase/src/MediaBaseImpl.cpp b/utils/MediaBase/src/MediaBaseImpl.cpp index 2468a289..502334cc 100644 --- a/utils/MediaBase/src/MediaBaseImpl.cpp +++ b/utils/MediaBase/src/MediaBaseImpl.cpp @@ -14,6 +14,7 @@ */ #include "MediaBaseImpl.h" #include "ILog.h" +#include "MediaBase.h" #include "StatusCode.h" #include #include @@ -28,8 +29,10 @@ extern "C" { #ifdef __cplusplus } #endif -MediaBaseImpl::MediaBaseImpl() : mReadVideoCallback(nullptr), mReadVideoCallbackContext(nullptr), mTaskRuning(false) +MediaBaseImpl::MediaBaseImpl(const MediaHandleType &type) + : mType(type), mReadVideoCallback(nullptr), mReadVideoCallbackContext(nullptr), mTaskRuning(false) { + MediaTypeConvert(); } StatusCode MediaBaseImpl::StartReadFile(const std::string &path) { @@ -37,7 +40,10 @@ StatusCode MediaBaseImpl::StartReadFile(const std::string &path) int result = 0; AVFormatContext *pFormatCtx = nullptr; if ((result = avformat_open_input(&pFormatCtx, path.c_str(), nullptr, nullptr)) < 0) { - LogError("Couldn't open file: %s, result=%d\n", path.c_str(), result); + char error_str[AV_ERROR_MAX_STRING_SIZE]; + av_make_error_string(error_str, AV_ERROR_MAX_STRING_SIZE, result); + LogError("Couldn't open file: %s, result=%s\n", path.c_str(), error_str); + // LogError("Couldn't open file: %s, result=%s\n", path.c_str(), av_err2str(result)); return CreateStatusCode(STATUS_CODE_NOT_OK); } // LogInfo("File: %s\n", pFormatCtx->filename); @@ -50,20 +56,20 @@ StatusCode MediaBaseImpl::StartReadFile(const std::string &path) LogError("Couldn't find stream information.\n"); return CreateStatusCode(STATUS_CODE_NOT_OK); } - int video_stream_index = -1; + int mediaStreamIndex = -1; for (unsigned int i = 0; i < pFormatCtx->nb_streams; i++) { - if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { - video_stream_index = i; + if (pFormatCtx->streams[i]->codecpar->codec_type == mFFmpegMediaType) { + mediaStreamIndex = i; break; } } - if (video_stream_index == -1) { - LogError("Didn't find a video stream.\n"); + if (mediaStreamIndex == -1) { + LogError("Didn't find a stream.\n"); return CreateStatusCode(STATUS_CODE_NOT_OK); } auto taskTimerThread = [=](std::shared_ptr media) { LogInfo("ReadFileThread start.\n"); - media->ReadFileThread(pFormatCtx, video_stream_index); + media->ReadFileThread(pFormatCtx, mediaStreamIndex); }; std::shared_ptr media = shared_from_this(); mTaskTimerThread = std::thread(taskTimerThread, media); @@ -83,16 +89,25 @@ StatusCode MediaBaseImpl::SetReadVideoCallback(ReadVideoFileCallback callback, v mReadVideoCallbackContext = context; return CreateStatusCode(STATUS_CODE_OK); } +StatusCode MediaBaseImpl::SetReadAudioCallback(ReadVideoFileCallback callback, void *context) +{ + mReadAudioCallback = callback; + mReadAudioCallbackContext = context; + return CreateStatusCode(STATUS_CODE_OK); +} void MediaBaseImpl::InitFfmpeg(void) { } void MediaBaseImpl::UnInitFfmpeg(void) { } -void MediaBaseImpl::ReadFileThread(AVFormatContext *pFormatCtx, int video_stream_index) +void MediaBaseImpl::ReadFileThread(AVFormatContext *pFormatCtx, int mediaStreamIndex) { mTaskRuning = true; - if (nullptr == mReadVideoCallback) { + if (AVMEDIA_TYPE_VIDEO == mFFmpegMediaType && nullptr == mReadVideoCallback) { + LogWarning("ReadVideoCallback is null.\n"); + } + if (AVMEDIA_TYPE_AUDIO == mFFmpegMediaType && nullptr == mReadVideoCallback) { LogWarning("ReadVideoCallback is null.\n"); } AVPacket packet; @@ -108,12 +123,12 @@ void MediaBaseImpl::ReadFileThread(AVFormatContext *pFormatCtx, int video_stream break; } // Checks whether the packet belongs to a video stream. - if (packet.stream_index == video_stream_index) { - playTimeMs = (packet.duration * pFormatCtx->streams[video_stream_index]->time_base.num * 1000) / - pFormatCtx->streams[video_stream_index]->time_base.den; - LogInfo("Play time ms:%d\n", playTimeMs); + if (packet.stream_index == mediaStreamIndex) { + playTimeMs = (packet.duration * pFormatCtx->streams[mediaStreamIndex]->time_base.num * 1000) / + pFormatCtx->streams[mediaStreamIndex]->time_base.den; // LogInfo("Frame data address: %p, length: %zu\n", packet.data, packet.size); - mReadVideoCallback(packet.data, packet.size, mReadVideoCallbackContext); + // LogInfo("Play time ms:%d\n", playTimeMs); + ReadFrame(&packet); std::this_thread::sleep_for(std::chrono::milliseconds(playTimeMs)); } // Release the data packet. @@ -122,4 +137,27 @@ void MediaBaseImpl::ReadFileThread(AVFormatContext *pFormatCtx, int video_stream av_packet_unref(&packet); avformat_close_input(&pFormatCtx); +} +void inline MediaBaseImpl::ReadFrame(AVPacket *packet) +{ + if (AVMEDIA_TYPE_VIDEO == mFFmpegMediaType) { + mReadVideoCallback(packet->data, packet->size, mReadVideoCallbackContext); + } + else if (AVMEDIA_TYPE_AUDIO == mFFmpegMediaType) { + mReadVideoCallback(packet->data, packet->size, mReadVideoCallbackContext); + } +} +void MediaBaseImpl::MediaTypeConvert(void) +{ + switch (mType) { + case MediaHandleType::MEDIA_HANDLE_TYPE_READ_H264: + mFFmpegMediaType = AVMEDIA_TYPE_VIDEO; + break; + case MediaHandleType::MEDIA_HANDLE_TYPE_READ_G711: + mFFmpegMediaType = AVMEDIA_TYPE_AUDIO; + break; + default: + LogError("Unknown media type.\n"); + break; + } } \ No newline at end of file diff --git a/utils/MediaBase/src/MediaBaseImpl.h b/utils/MediaBase/src/MediaBaseImpl.h index 89014277..1f51eba4 100644 --- a/utils/MediaBase/src/MediaBaseImpl.h +++ b/utils/MediaBase/src/MediaBaseImpl.h @@ -30,20 +30,27 @@ extern "C" { class MediaBaseImpl : public IMediaBase, public std::enable_shared_from_this { public: - MediaBaseImpl(); + MediaBaseImpl(const MediaHandleType &type); virtual ~MediaBaseImpl() = default; StatusCode StartReadFile(const std::string &path) override; StatusCode StopReadFile(void) override; StatusCode SetReadVideoCallback(ReadVideoFileCallback callback, void *context) override; + StatusCode SetReadAudioCallback(ReadVideoFileCallback callback, void *context) override; private: void InitFfmpeg(void); void UnInitFfmpeg(void); void ReadFileThread(AVFormatContext *pFormatCtx, int video_stream_index); + void ReadFrame(AVPacket *packet); + void MediaTypeConvert(void); private: + const MediaHandleType &mType; + enum AVMediaType mFFmpegMediaType; ReadVideoFileCallback mReadVideoCallback; void *mReadVideoCallbackContext; + ReadVideoFileCallback mReadAudioCallback; + void *mReadAudioCallbackContext; bool mTaskRuning; std::thread mTaskTimerThread; }; diff --git a/utils/MediaBase/src/MediaBaseMakePtr.cpp b/utils/MediaBase/src/MediaBaseMakePtr.cpp index 5c3bf7e0..15a643a6 100644 --- a/utils/MediaBase/src/MediaBaseMakePtr.cpp +++ b/utils/MediaBase/src/MediaBaseMakePtr.cpp @@ -31,9 +31,9 @@ std::shared_ptr &MediaBaseMakePtr::GetInstance(std::shared_ptr } return instance; } -std::shared_ptr MediaBaseMakePtr::CreateMediaBase(void) +std::shared_ptr MediaBaseMakePtr::CreateMediaBase(const MediaHandleType &type) { LogInfo("MediaBaseMakePtr::CreateMediaBase.\n"); - auto tmp = std::make_shared(); + auto tmp = std::make_shared(type); return tmp; } \ No newline at end of file diff --git a/utils/MediaBase/src/MediaBaseMakePtr.h b/utils/MediaBase/src/MediaBaseMakePtr.h index 5f954aa2..fb6f59ff 100644 --- a/utils/MediaBase/src/MediaBaseMakePtr.h +++ b/utils/MediaBase/src/MediaBaseMakePtr.h @@ -23,6 +23,6 @@ public: MediaBaseMakePtr() = default; virtual ~MediaBaseMakePtr() = default; static std::shared_ptr &GetInstance(std::shared_ptr *impl = nullptr); - virtual std::shared_ptr CreateMediaBase(void); + virtual std::shared_ptr CreateMediaBase(const MediaHandleType &type); }; #endif \ No newline at end of file diff --git a/utils/WebServer/CMakeLists.txt b/utils/WebServer/CMakeLists.txt index 2782a27a..1dcc0cc0 100644 --- a/utils/WebServer/CMakeLists.txt +++ b/utils/WebServer/CMakeLists.txt @@ -40,7 +40,7 @@ aux_source_directory(./src SRC_FILES) set(TARGET_NAME WebServer) add_library(${TARGET_NAME} STATIC ${SRC_FILES}) -target_link_libraries(${TARGET_NAME} StatusCode Log -Wl,--start-group libgo.a libmbedtls.a libgoahead-mbedtls.a -Wl,--end-group) +target_link_libraries(${TARGET_NAME} libgo.a libmbedtls.a libgoahead-mbedtls.a libgo.a StatusCode Log) add_custom_target( WebServer_code_check @@ -72,56 +72,17 @@ add_custom_command( endif() # build goahead before make libgo.a -add_custom_command( - OUTPUT ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile - COMMAND echo "tar zxvf goahead-5.2.0.tar.gz" - COMMAND tar zxvf goahead-5.2.0.tar.gz - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/modify/http.c ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/src - WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/ -) add_custom_command( OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a - DEPENDS ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile - COMMAND make CC=${CMAKE_C_COMPILER} ARCH=${SET_ARCH} PROFILE=${LIB_TYPE} ME_GOAHEAD_UPLOAD_DIR=\"${GOAHEAD_UPLOAD_TMP_PATH}\" - ME_GOAHEAD_SSL_KEY=\"${GOAHEAD_CONFIG_FILE_PATH}/self.key\" ME_GOAHEAD_SSL_CERTIFICATE=\"${GOAHEAD_CONFIG_FILE_PATH}/self.crt\" - ${ME_GOAHEAD_LIMIT_POST} -f ../modify/goahead-linux-static-fancy.mk - # COMMAND make CC=${CMAKE_C_COMPILER} ARCH=${SET_ARCH} PROFILE=${LIB_TYPE} -f ../modify/goahead-linux-static-fancy.mk // TODO: - COMMAND echo "Copy goahead lib to output path." - COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgo.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a - COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libmbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libmbedtls.a - COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgoahead-mbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgoahead-mbedtls.a - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.crt ${PLATFORM_PATH}/cmake-shell/ - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.key ${PLATFORM_PATH}/cmake-shell/ - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/route.txt ${PLATFORM_PATH}/cmake-shell/ - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/auth.txt ${PLATFORM_PATH}/cmake-shell/ - WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead -) -add_custom_target( - libgo.a - DEPENDS ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a - # COMMAND mkdir ${GOAHEAD_UPLOAD_TMP_PATH} - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/modify/http.c ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/src - COMMAND touch ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/src/http.c + COMMAND echo "Did not found goahead libs in output_files, now compile goahead." + COMMAND make goahead-5.2.0 WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ ) add_custom_target( - goahead_compile - COMMAND test ! -f ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a || rm ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a - COMMAND test ! -f ${EXTERNAL_LIBS_OUTPUT_PATH}/libmbedtls.a || rm ${EXTERNAL_LIBS_OUTPUT_PATH}/libmbedtls.a - COMMAND test ! -f ${EXTERNAL_LIBS_OUTPUT_PATH}/libgoahead-mbedtls.a || rm ${EXTERNAL_LIBS_OUTPUT_PATH}/libgoahead-mbedtls.a - COMMAND make CC=${CMAKE_C_COMPILER} ARCH=${SET_ARCH} PROFILE=${LIB_TYPE} ME_GOAHEAD_UPLOAD_DIR=\"${GOAHEAD_UPLOAD_TMP_PATH}\" - ME_GOAHEAD_SSL_KEY=\"${GOAHEAD_CONFIG_FILE_PATH}/self.key\" ME_GOAHEAD_SSL_CERTIFICATE=\"${GOAHEAD_CONFIG_FILE_PATH}/self.crt\" - ${ME_GOAHEAD_LIMIT_POST} -f ../modify/goahead-linux-static-fancy.mk - COMMAND echo "Copy goahead lib to output path." - COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgo.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a - COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libmbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libmbedtls.a - COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgoahead-mbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgoahead-mbedtls.a - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.crt ${PLATFORM_PATH}/cmake-shell/ - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.key ${PLATFORM_PATH}/cmake-shell/ - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/route.txt ${PLATFORM_PATH}/cmake-shell/ - COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/auth.txt ${PLATFORM_PATH}/cmake-shell/ - WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead + compile_goahead + DEPENDS ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a ) +add_dependencies(${TARGET_NAME} compile_goahead) define_file_name(${TARGET_NAME}) diff --git a/utils/WebServer/build/webserver.cmake b/utils/WebServer/build/webserver.cmake index 9ff2327d..5a7fa842 100644 --- a/utils/WebServer/build/webserver.cmake +++ b/utils/WebServer/build/webserver.cmake @@ -8,4 +8,6 @@ if (NOT DEFINED GOAHEAD_CONFIG_FILE_PATH) else() add_definitions(-DGOAHEAD_CONFIG_FILE_PATH=\"${GOAHEAD_CONFIG_FILE_PATH}\") # 代码中使用该宏定义下的配置文件 endif() -add_definitions(-DGOAHEAD_DOCUMENTS_PATH=\"${GOAHEAD_DOCUMENTS_PATH}\") \ No newline at end of file +add_definitions(-DGOAHEAD_DOCUMENTS_PATH=\"${GOAHEAD_DOCUMENTS_PATH}\") + +set(GOAHEAD_EXTERNAL_LIBS go mbedtls goahead-mbedtls) \ No newline at end of file