当前位置: 首页 > news >正文

新郑网站优化烟台莱州网站建设

新郑网站优化,烟台莱州网站建设,做网站开专票税钱是多少个点,效果图制作合同范本最近在做UAC的项目,大概就是接收内核UAC的事件,也就是声音相关事件。然后就是pcm_read和AudioTrackr->write之间互传。感觉略微有点奇怪,所以简单总结一下。 1 UAC的简要流程 open_netlink_socket 打开内核窗口,类似于ioctl。…

最近在做UAC的项目,大概就是接收内核UAC的事件,也就是声音相关事件。然后就是pcm_read和AudioTrackr->write之间互传。感觉略微有点奇怪,所以简单总结一下。

1 UAC的简要流程

open_netlink_socket 打开内核窗口,类似于ioctl。

recvfrom 接收数据。

UAC_CAP_START 处理开始播放事件。
    host_to_device
        tracker_data_thread 播放线程。
            pcm_read->(AudioTrackr->write)
        pcm_open
        pcm_read
        pcm_close
        
UAC_CAP_STOP 处理停止播放事件。
    
UAC_PLAY_START 处理开始录音事件。
    device_to_host
        recorder_data_thread
            (AudioRecord->read)<-pcm_write
        pcm_open
        pcm_write
        pcm_close
    
UAC_PLAY_STOP 处理停止录音事件。

2 安卓音频系统

https://source.android.com/docs/core/audio?hl=zh-cn

关于UAC的内容,居然也有说:

https://source.android.com/docs/core/audio/usb?hl=zh-cn

不过下面这两个图我觉得直观一丢丢。

下面这个都包浆了。。。

大致就是几层:

1 Java App层,这一层封装最完善,但是只有最常规的操作,给开发app的帅哥做傻瓜式操作的。使用android.media.MediaPlayer。

2 Framework层,这一层可以使用AudioTracker和AudioRecorder,这一层接口比较底层一点,提供的功能比较多。可以实现实时处理和一些特效。Java和C++都可以用。下面还有个AudioFlinger,是用来做混音的。也是上下层的分隔。所以绕过Framework层,直接用HAL的接口,可能就有问题。

3 HAL接口。有HIDL和AIDL的,这一层理论上可以用,但是貌似比较少,起码我们公司的大神都不在这层搞事。

4 ALSA接口,这一层是标准Linux的,花样也是非常多。

3 App接口

没啥好说的,这部分我也不是太熟悉,直接怼media.MediaPlayer即可。代码说明一切吧。

package com.example.audioplayer;import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button playButton = findViewById(R.id.play_button);Button stopButton = findViewById(R.id.stop_button);// 播放本地音频文件mediaPlayer = MediaPlayer.create(this, R.raw.example_audio);// 如果你想播放网络音频流,可以使用下面的代码// mediaPlayer = new MediaPlayer();// try {//     mediaPlayer.setDataSource("http://your-audio-url.com/audio.mp3");//     mediaPlayer.prepare(); // 同步准备,可能会阻塞主线程,建议使用异步准备// } catch (IOException e) {//     e.printStackTrace();// }playButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer != null && !mediaPlayer.isPlaying()) {mediaPlayer.start();}}});stopButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.stop();// 重新准备MediaPlayermediaPlayer.prepareAsync();}}});}@Overrideprotected void onDestroy() {super.onDestroy();if (mediaPlayer != null) {mediaPlayer.release();mediaPlayer = null;}}
}

4 AudioTracker和AudioRecorder

我这次项目用的就是这两个,其实还是挺简单,看个例子就够了。。。

#include <android/media/AudioTrack.h>// 假设audioBuffer是一个已经加载好的音频数据的short数组
short audioBuffer[]; // 音频数据填充到这个数组中
int bufferSize = audioTrack->frameCount() * audioTrack->channelCount(); // 计算缓冲区大小// 创建一个AudioTrack实例
auto audioTrack = new android::media::AudioTrack(android::media::AudioTrack::STREAM_MUSIC, // 音频流类型44100, // 采样率44.1kHzandroid::media::AudioTrack::CHANNEL_OUT_STEREO, // 立体声输出android::media::AudioTrack::TRANSFER_MODE_STATIC, // 静态模式bufferSize, // 缓冲区大小android::media::AudioTrack::MODE_STATIC // 静态播放模式
);// 开始播放音频
audioTrack->start();// 写入数据到AudioTrack缓冲区
audioTrack->write(audioBuffer, bufferSize);// 播放完毕,暂停并释放资源
audioTrack->stop();
delete audioTrack;

5 HAL

这部分位于vendor,上面的是位于system,所以还是区别很大。如果要在vendor搞事情,还是要用这个部分。

定义是在这个地方:https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/master/audio/

但是比较疑惑的一点是单位有大神说直接调用Hal,会碰坏系统。。。存疑中。。。

用的话直接用hardware/audio.h就可以。

#include <jni.h>
#include <string>
#include <android/log.h>
#include <hardware/hardware.h>
#include <hardware/audio.h>#define LOG_TAG "NativeAudio"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)extern "C" JNIEXPORT void JNICALL
Java_com_example_audioplayer_MainActivity_nativeInitAudio(JNIEnv *env, jobject thiz) {LOGD("Initializing Audio HAL");hw_module_t *module = nullptr;hw_device_t *device = nullptr;// Load the audio hardware moduleif (hw_get_module(AUDIO_HARDWARE_MODULE_ID, (const hw_module_t **)&module) == 0) {LOGD("Audio module loaded");// Open the audio hardware deviceif (module->methods->open(module, AUDIO_HARDWARE_INTERFACE, &device) == 0) {LOGD("Audio device opened");audio_hw_device_t *audioDevice = (audio_hw_device_t *)device;if (audioDevice && audioDevice->init_check(audioDevice) == 0) {LOGD("Audio device initialized");// Set up and start playback using audio_stream_outaudio_stream_out_t *streamOut = nullptr;audioDevice->open_output_stream(audioDevice, 0, AUDIO_DEVICE_OUT_SPEAKER,AUDIO_OUTPUT_FLAG_NONE, nullptr, &streamOut, nullptr);if (streamOut) {LOGD("Audio stream out opened");// Simplified example to play a buffer (should use actual audio data)size_t bufferSize = streamOut->common.get_buffer_size(&streamOut->common);uint8_t *buffer = new uint8_t[bufferSize];memset(buffer, 0, bufferSize);  // Fill buffer with silence or actual audio datastreamOut->write(streamOut, buffer, bufferSize);delete[] buffer;audioDevice->close_output_stream(audioDevice, streamOut);} else {LOGD("Failed to open audio stream out");}} else {LOGD("Audio device initialization failed");}device->close(device);} else {LOGD("Failed to open audio device");}} else {LOGD("Failed to load audio module");}
}

6 ALSA

这个部分有点略大,看看下次写吧。。。还有一个OMX,以后有心情再写吧。。。

最后回到一开始说的UAC,应该是新生成了音频的节点,然后可以从这个节点读取音频数据,但是最后要将声音从Android的接口放出去,所以那么搞。之前调试的时候,在UAC的模式下,好像也确实是生成了两张声卡。这部分感觉内容也挺多了,下次再总结。

参考:

https://source.android.com/docs/core/audio?hl=zh-cn

Android系统Audio框架介绍_android audio-CSDN博客

Android系统Audio框架介绍_android audio-CSDN博客

http://www.yayakq.cn/news/765188/

相关文章:

  • 汽车网站更新怎么做如何增加网站转化率
  • 扬中网站优化公司怎么注册官方网站
  • 网站能需要怎么做才不会被攻击五屏网站建设品牌
  • 音乐中文网站模板网站里的横幅广告怎么做
  • 成都电子商城网站开发榆中县城乡建设局网站
  • 中学网站建设工作实施方案百度学术论文查重入口
  • 别人给我们做的网站如何关闭学校网站模板下载
  • 做网站首页图的规格网络服务主要包括哪几项
  • 地方门户网站的出路和平手机网站建设
  • 火狐浏览器网站开发人员小程序开发平台找哪家好
  • 改版网站收费网站中转页怎么做
  • 温州网站设计工作室西安短视频运营公司
  • 南京企业网站做优化建设一个功能简单的网站
  • 平面设计工作室网站做茶歇的网站
  • 上海微信网站公司做电影网站赚钱的方法
  • 手机开源网站代码律师微网站制作
  • 单页网站在线生成电子商务网站html模板
  • 网站开发需要哪些人员python做网站有什么优势
  • 建站总结报告pr模板免费下载网站
  • 忘记网站后台地址外链生成
  • 深圳分销网站设计价格WordPress开启邮件服务
  • 广州做网站app网站建设技术网站
  • 网站外链 快速建设视频怎么下载
  • 做店铺图片什么网站手机微信官方网站首页
  • vs 2012网站开发wordpress sae svn
  • 网站外链是友情连接吗协会网站建设的作用
  • 还有哪些网站做产品众筹wordpress 引入文件
  • 如何做网站监控山西大同最新通告今天
  • 做网站点击挣钱不?网站开发与规划就业前景
  • 网站利用e4a做app舆情分析案例