[*] 音频采集

This commit is contained in:
acgist
2024-05-06 08:58:29 +08:00
parent 6085696aeb
commit 8f5cb55479
6 changed files with 61 additions and 12 deletions

View File

@@ -61,6 +61,7 @@ target_link_libraries(
libhilog_ndk.z.so
# 媒体
libohaudio.so
libohcamera.so
libnative_media_aenc.so
libnative_media_venc.so
libnative_media_core.so

View File

@@ -5,8 +5,10 @@
*
* https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/media/audio-encoding.md
* https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/media/video-encoding.md
* https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/media/media/avscreen-capture.md
* https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/media/obtain-supported-codecs.md
* https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/media/using-ohaudio-for-recording.md
* https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/media/camera/native-camera-recording.md
* https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/media/audio/using-ohaudio-for-recording.md
* https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/native-lib/third_party_opengl/opengles.md
* https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/native-lib/third_party_opensles/opensles.md
*/
@@ -16,6 +18,9 @@
#include <map>
#include "ohcamera/camera.h"
#include "ohcamera/video_output.h"
#include "api/media_stream_track.h"
#include <ohaudio/native_audiocapturer.h>
@@ -57,7 +62,6 @@ public:
// 音频采集器
OH_AudioCapturer* audioCapturer = nullptr;
public:
AudioCapturer();
virtual ~AudioCapturer();
@@ -73,6 +77,13 @@ public:
*/
class VideoCapturer: public Capturer<rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame>> {
public:
Camera_Device* camera_Device;
Camera_Manager* camera_Manager;
Camera_VideoOutput* camera_VideoOutput;
Camera_VideoProfile* camera_VideoProfile;
Camera_OutputCapability* camera_OutputCapability;
public:
VideoCapturer();
virtual ~VideoCapturer();

View File

@@ -1,7 +1,9 @@
/**
* 播放器
*
* https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/media/using-ohaudio-for-playback.md
* https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/media/media/video-playback.md
* https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/media/audio/audio-playback-overview.md
* https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/media/media/using-ndk-avplayer-for-playerback.md
*/
#ifndef TAOYAO_PALYER_H

View File

@@ -4,9 +4,6 @@
#include "rtc_base/time_utils.h"
#include <ohaudio/native_audiocapturer.h>
#include <ohaudio/native_audiostreambuilder.h>
// 采样率
static int32_t samplingRate = 48000;
// 声道数
@@ -16,8 +13,8 @@ static OH_AudioStream_LatencyMode latencyMode = OH_AudioStream_LatencyMode::AU
// 音频格式
static OH_AudioStream_SampleFormat sampleFormat = OH_AudioStream_SampleFormat::AUDIOSTREAM_SAMPLE_S16LE;
static int32_t OnReadData(OH_AudioCapturer* capturer, void* userData, void* buffer, int32_t length);
static int32_t OnError(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_Result error);
static int32_t OnReadData(OH_AudioCapturer* capturer, void* userData, void* buffer, int32_t length);
static int32_t OnStreamEvent(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_Event event);
static int32_t OnInterruptEvent(OH_AudioCapturer* capturer, void* userData, OH_AudioInterrupt_ForceType type, OH_AudioInterrupt_Hint hint);
@@ -42,8 +39,8 @@ bool acgist::AudioCapturer::start() {
OH_LOG_DEBUG(LOG_APP, "配置音频格式:%d %d %o %o", samplingRate, channelCount, latencyMode, sampleFormat);
// 设置回调函数
OH_AudioCapturer_Callbacks callbacks;
callbacks.OH_AudioCapturer_OnReadData = OnReadData;
callbacks.OH_AudioCapturer_OnError = OnError;
callbacks.OH_AudioCapturer_OnReadData = OnReadData;
callbacks.OH_AudioCapturer_OnStreamEvent = OnStreamEvent;
callbacks.OH_AudioCapturer_OnInterruptEvent = OnInterruptEvent;
OH_AudioStream_Result ret = OH_AudioStreamBuilder_SetCapturerCallback(builder, callbacks, this);
@@ -54,6 +51,7 @@ bool acgist::AudioCapturer::start() {
// 开始录制
ret = OH_AudioCapturer_Start(audioCapturer);
OH_LOG_DEBUG(LOG_APP, "开始录制:%o", ret);
return ret == OH_AudioStream_Result::AUDIOSTREAM_SUCCESS;
}
bool acgist::AudioCapturer::stop() {
@@ -64,6 +62,12 @@ bool acgist::AudioCapturer::stop() {
ret = OH_AudioCapturer_Release(audioCapturer);
audioCapturer = nullptr;
OH_LOG_DEBUG(LOG_APP, "释放音频采集器:%o", ret);
return ret == OH_AudioStream_Result::AUDIOSTREAM_SUCCESS;
}
static int32_t OnError(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_Result error) {
OH_LOG_ERROR(LOG_APP, "音频采集发生异常:%o", error);
return 0;
}
static int32_t OnReadData(OH_AudioCapturer* capturer, void* userData, void* buffer, int32_t length) {
@@ -76,16 +80,15 @@ static int32_t OnReadData(OH_AudioCapturer* capturer, void* userData, void* buff
) {
iterator->second->OnData(buffer, 16, samplingRate, channelCount, sizeof(buffer) / 2, timeMillis);
}
}
static int32_t OnError(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_Result error) {
OH_LOG_ERROR(LOG_APP, "音频采集发生异常:%o", error);
return 0;
}
static int32_t OnStreamEvent(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_Event event) {
OH_LOG_DEBUG(LOG_APP, "音频采集事件:%o", event);
return 0;
}
static int32_t OnInterruptEvent(OH_AudioCapturer* capturer, void* userData, OH_AudioInterrupt_ForceType type, OH_AudioInterrupt_Hint hint) {
OH_LOG_DEBUG(LOG_APP, "音频采集打断:%o %o", type, hint);
return 0;
}

View File

@@ -0,0 +1,8 @@
#include "../include/Capturer.hpp"
#include "hilog/log.h"
#include "ohcamera/camera_input.h"
#include "ohcamera/camera_manager.h"
#include "ohcamera/capture_session.h"

View File

@@ -36,18 +36,42 @@
"requestPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "视频",
"usedScene": {
"when": "always"
}
},
{
"name": "ohos.permission.INTERNET",
"reason": "网络",
"usedScene": {
"when": "always"
}
},
{
"name": "ohos.permission.MICROPHONE",
"reason": "音频",
"usedScene": {
"when": "always"
}
},
{
"name": "ohos.permission.READ_MEDIA",
"reason": "录制文件",
"usedScene": {
"when": "always"
}
},
{
"name": "ohos.permission.WRITE_MEDIA",
"reason": "录制文件",
"usedScene": {
"when": "always"
}
},
{
"name": "ohos.permission.MEDIA_LOCATION",
"reason": "地理位置",
"usedScene": {
"when": "always"
}