- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了适用于 Android 的开源视频播放器,它使用 ffmpeg 来解码视频。
我的音频有一些问题,有时会出现 SCSS ,但视频图像显示得很好。播放器的基本思想是音频和视频在两个不同的流中解码,然后在第三个流中传回,视频图片显示在SurfaceView上,视频声音以字节数组传递给AudioTrack然后播放。但有时声音会丢失或与 SCSS 一起玩。谁能给我做什么的起点(一些基本概念)。可能我应该更改 AudioTrack 的缓冲区大小或添加一些标志。这是一段代码,其中创建了 AudioTrack 类。
private AudioTrack prepareAudioTrack(int sampleRateInHz,
int numberOfChannels) {
for (;;) {
int channelConfig;
if (numberOfChannels == 1) {
channelConfig = AudioFormat.CHANNEL_OUT_MONO;
} else if (numberOfChannels == 2) {
channelConfig = AudioFormat.CHANNEL_OUT_STEREO;
} else if (numberOfChannels == 3) {
channelConfig = AudioFormat.CHANNEL_OUT_FRONT_CENTER
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
| AudioFormat.CHANNEL_OUT_FRONT_LEFT;
} else if (numberOfChannels == 4) {
channelConfig = AudioFormat.CHANNEL_OUT_QUAD;
} else if (numberOfChannels == 5) {
channelConfig = AudioFormat.CHANNEL_OUT_QUAD
| AudioFormat.CHANNEL_OUT_LOW_FREQUENCY;
} else if (numberOfChannels == 6) {
channelConfig = AudioFormat.CHANNEL_OUT_5POINT1;
} else if (numberOfChannels == 8) {
channelConfig = AudioFormat.CHANNEL_OUT_7POINT1;
} else {
channelConfig = AudioFormat.CHANNEL_OUT_STEREO;
}
try {
Log.d("MyLog","Creating Audio player");
int minBufferSize = AudioTrack.getMinBufferSize(sampleRateInHz,
channelConfig, AudioFormat.ENCODING_PCM_16BIT);
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC, sampleRateInHz,
channelConfig, AudioFormat.ENCODING_PCM_16BIT,
minBufferSize, AudioTrack.MODE_STREAM);
return audioTrack;
} catch (IllegalArgumentException e) {
if (numberOfChannels > 2) {
numberOfChannels = 2;
} else if (numberOfChannels > 1) {
numberOfChannels = 1;
} else {
throw e;
}
}
}
}
int player_write_audio(struct DecoderData *decoder_data, JNIEnv *env,
int64_t pts, uint8_t *data, int data_size, int original_data_size) {
struct Player *player = decoder_data->player;
int stream_no = decoder_data->stream_no;
int err = ERROR_NO_ERROR;
int ret;
AVCodecContext * c = player->input_codec_ctxs[stream_no];
AVStream *stream = player->input_streams[stream_no];
LOGI(10, "player_write_audio Writing audio frame")
jbyteArray samples_byte_array = (*env)->NewByteArray(env, data_size);
if (samples_byte_array == NULL) {
err = -ERROR_NOT_CREATED_AUDIO_SAMPLE_BYTE_ARRAY;
goto end;
}
if (pts != AV_NOPTS_VALUE) {
player->audio_clock = av_rescale_q(pts, stream->time_base, AV_TIME_BASE_Q);
LOGI(9, "player_write_audio - read from pts")
} else {
int64_t sample_time = original_data_size;
sample_time *= 1000000ll;
sample_time /= c->channels;
sample_time /= c->sample_rate;
sample_time /= av_get_bytes_per_sample(c->sample_fmt);
player->audio_clock += sample_time;
LOGI(9, "player_write_audio - added")
}
enum WaitFuncRet wait_ret = player_wait_for_frame(player,
player->audio_clock + AUDIO_TIME_ADJUST_US, stream_no);
if (wait_ret == WAIT_FUNC_RET_SKIP) {
goto end;
}
LOGI(10, "player_write_audio Writing sample data")
jbyte *jni_samples = (*env)->GetByteArrayElements(env, samples_byte_array,
NULL);
memcpy(jni_samples, data, data_size);
(*env)->ReleaseByteArrayElements(env, samples_byte_array, jni_samples, 0);
LOGI(10, "player_write_audio playing audio track");
ret = (*env)->CallIntMethod(env, player->audio_track,
player->audio_track_write_method, samples_byte_array, 0, data_size);
jthrowable exc = (*env)->ExceptionOccurred(env);
if (exc) {
err = -ERROR_PLAYING_AUDIO;
LOGE(3, "Could not write audio track: reason in exception");
// TODO maybe release exc
goto free_local_ref;
}
if (ret < 0) {
err = -ERROR_PLAYING_AUDIO;
LOGE(3,
"Could not write audio track: reason: %d look in AudioTrack.write()", ret);
goto free_local_ref;
}
free_local_ref:
LOGI(10, "player_write_audio releasing local ref");
(*env)->DeleteLocalRef(env, samples_byte_array);
end: return err;
最佳答案
我有同样的问题。问题在于写入音频播放器的音频数据的起点。在 PCM 数据中,每 2 个字节的数据基于 little_endian 转换创建一个音频样本。为了正确播放 PCM 数据样本,必须正确创建对音频播放器的写入。如果读取缓冲区的起点不是样本的第一个字节,则音频样本无法正确创建,声音将被破坏。在我的情况下,我从文件中读取样本。在某些时候,从文件中读取数据的起点是样本的第二个字节,然后我从文件中读取的所有数据都被错误解码。我通过检查起点来解决问题,如果起点是奇数,我将其增加并将其更改为偶数。
请原谅我的英语不好。
关于安卓。 AudioTrack 类的问题。声音有时会丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431319/
我发现很多教程和帖子展示了如何使用 AudioTrack 在 AudioTrack.MODE_STREAM 中播放 wav 文件,我已经成功实现了 this example . 但是,我在一次播放多个
我正在试验 AudioTrack 类。基本上,当用户触摸屏幕上的特定对象时,我的应用程序必须发出声音。我用过 this example作为指南。 我的应用程序似乎可以正常运行,但通常在触摸屏幕大约一分
我有一个带有 AudioTrack 的线程,我在向下按钮上调用它,在向上按钮上我想停止音频。到目前为止,一切都很好。我的应用程序有 Activity A 和 Activity B。 Activity
我正在开发一个音频播放器,其中包含向 AudioTrack 提供的内容, 在 native 的帮助下,我从音轨中获得了声音,但事情是经过一段时间后,我的 AudioTrack 类中出现堆栈溢出错误。
文档说:sessionId-必须将AudioTrack附加到音频 session 的ID 我可以用这样的东西吗: MediaPlayer mp = MediaPlayer.create(this, R
我有一个 Android AudioTrack,例如: private AudioTrack mAudioTrack; int min = AudioTrack.getMinBufferSize(sa
我想在 android 中使用带有 PCM 16 位 channel 的立体声播放带有 AudioTrack 类的音乐轨道。这是我的 的代码MusicListFragment.java import
我正在尝试使用 AudioTrack 播放原始声音数据Android 中的类,我使用 write方法,但我注意到在 write 方法返回和播放实际声音之间存在延迟,为简单起见,让我们使用 AudioR
我有以下代码: public class MainActivity extends Activity { private int freq = 8000; private AudioR
我正在尝试在 Android 中播放一些循环声音,这对我来说效果很好。不过,所有美好的事情都必须结束,我希望这包括我的音频循环。但是,如果我调用 AudioTrack.release()在这个循环之后
我目前正在流模式下使用 AudioTrack 来播放一些预先录制的轨道。播放和停止机制正常工作。但是,当我按下暂停并尝试在之后恢复时,缓冲区只读取 -1,表明已达到 EOF。 我尝试标记并重置输入流,
我试图以 600hz 播放 10 秒的声音,但我得到 600hz 的播放时间不超过 3 秒。有人可以指出我做错了什么吗? int minBuffersize = AudioTrack.getM
我正在尝试使用 AudioTrack 播放音乐。轨道播放,但音频播放速度减半。就好像这首歌变成了慢动作。 try{ AudioTrack track= new AudioTrack( Audi
我已经像这样设置了一个 AudioTrack: public NoiseThread(byte[] data) { rawData = data; bufferSize = 2* Au
我遇到了一个问题,我想在静态模式下反复播放半秒长的 AudioTrack,但声音断断续续。但是,我注意到当 TransitionDrawable 并行运行时,声音非常清晰。 我的代码的简化框架是: t
我生成一个 PCM 并想要循环播放声音。我遵循文档,但 Eclipse 一直告诉我 08-05 15:46:26.675: E/AudioTrack(27686): setLoop invalid v
我正在尝试播放连续的正弦波流。当我按住按钮时,正弦波的频率会发生变化。一旦我松开按钮,它就会恢复正常频率。 当我运行以下代码时,输出声音会定期出现“咔嗒声”(尖锐的声压变化)——每秒大约 5 次咔
我想知道哪个版本的 SDK 支持“AudioTrack”类?是否可以从 1.5 SDK、1.6 SDK 和 2.0 SDK 使用“AudioTrack”? 谢谢。 最佳答案 我相信 AudioTrac
我在静态模式下使用 AudioTrack 一遍又一遍地再现相同的信号。 我按照这里的示例进行操作,有时效果很好,但有时会抛出此错误并且没有声音: AudioTrack: start called fr
我在初始化 android AudioTrack 时遇到问题。我有带 android 2.3.3 的 Nexus One。 这是我的代码: int _rate = AudioTrack.getNati
我是一名优秀的程序员,十分优秀!