我有一个AudioFileStream_PacketsProc回调设置,AudioFileStreamOpen用于处理将音频数据包转换为PCM AudioConverterFillComplexBuffer.我遇到的问题是我在AudioConverterFillComplexBuffer调用后得到-50 OSStatus(paramErr).下面是使用了哪些参数AudioConverterFillComplexBuffer以及如何制作参数的片段:
audioConverterRef = AudioConverterRef()
// AudioConvertInfo is a struct that contains information
// for the converter regarding the number of packets and
// which audiobuffer is being allocated
convertInfo? = AudioConvertInfo(done: false, numberOfPackets: numberPackets, audioBuffer: buffer,
packetDescriptions: packetDescriptions)
var framesToDecode: UInt32 = pcmBufferTotalFrameCount! - end
var localPcmAudioBuffer = AudioBuffer()
localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!))
var localPcmBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil))
localPcmAudioBuffer = localPcmBufferList.mBuffers …Run Code Online (Sandbox Code Playgroud) 我是新手ffmpeg,我试图找出如何将音频或视频文件从一种格式转换为另一种格式.我不想使用CLI,我只是想知道我是否可以ffmpeg用作库并调用函数将文件从一种格式转换为另一种格式.我浏览了文档并找到了函数avcodec_encode_audio,avcodec_encode_video但不清楚我如何使用它来转换.教程或示例将非常有用.
我正在为一个名为XAL的音频库编写CoreAudio后端.输入缓冲区可以具有各种采样率.我正在使用单个音频单元进行输出.想法是转换缓冲区并在将它们发送到音频单元之前将它们混合.
只要输入缓冲区具有与输出音频单元相同的属性(采样率,通道数等),一切都有效.因此,混合部分起作用.
但是,我坚持采样率和通道数转换.根据我的想法,这对于Audio Converter Services API来说是最容易的.我设法建造了一个转换器; 我们的想法是输出格式与输出单元格式相同,但可能会根据转换器的目的进行调整.
音频转换器已成功构建,但在调用时AudioConverterFillComplexBuffer(),我得到输出状态错误-50.
如果我能在这段代码上获得另一组眼球,我会很高兴.问题可能在下面的某个地方AudioConverterNew().变量stream包含传入(和传出)缓冲区数据,并包含传入(和传出)缓冲区数据的streamSize字节大小.
我做错了什么?
void CoreAudio_AudioManager::_convertStream(Buffer* buffer, unsigned char** stream, int *streamSize)
{
if (buffer->getBitsPerSample() != unitDescription.mBitsPerChannel ||
buffer->getChannels() != unitDescription.mChannelsPerFrame ||
buffer->getSamplingRate() != unitDescription.mSampleRate)
{
printf("INPUT STREAM SIZE: %d\n", *streamSize);
// describe the input format's description
AudioStreamBasicDescription inputDescription;
memset(&inputDescription, 0, sizeof(inputDescription));
inputDescription.mFormatID = kAudioFormatLinearPCM;
inputDescription.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger;
inputDescription.mChannelsPerFrame = buffer->getChannels();
inputDescription.mSampleRate = buffer->getSamplingRate();
inputDescription.mBitsPerChannel = buffer->getBitsPerSample();
inputDescription.mBytesPerFrame = (inputDescription.mBitsPerChannel …Run Code Online (Sandbox Code Playgroud) 我使用基于Matt Gallagher 经典示例的 AudioUnits在iPhone上生成音调.为了避免开始/结束时的唧唧声和咔嗒声,我在回调中淡入/淡出幅度RenderTone.我希望在淡出结束时摧毁ToneUnit,也就是说,在振幅达到零之后.我能想到的唯一方法就是从回调中调用实例方法:
if (PlayerState == FADING_OUT) {
amplitude -= stepsize;
if (amplitude <= 0) {
amplitude = 0;
PlayerState = OFF;
[viewController destroyToneUnit];
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这比我想象的更具挑战性.首先,我仍然得到了fadeout应该消除的最后点击.另一方面,我收到此日志通知:
<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use.
Run Code Online (Sandbox Code Playgroud)
这条消息意味着什么,为什么我得到它?
如何应我杀ToneUnit?我怀疑发生了点击,因为RenderTone它destroyToneUnit在不同的线程上运行.如何让这些同步?
如果它有用,这是我的destroyToneUnit实例方法:
- (void) destroyToneUnit {
AudioOutputUnitStop(toneUnit);
AudioUnitUninitialize(toneUnit);
AudioComponentInstanceDispose(toneUnit);
toneUnit = nil;
}
Run Code Online (Sandbox Code Playgroud)
如果我在之前和之后的NSLog消息AudioUnitUninitialize(toneUnit);,通知出现在它们之间.
我正在编写一个命令行工具,将具有各种格式的输入音乐库(flac/ogg/mp3/...)转换为给定格式的输出音乐库(flac/ogg/mp3).我将它基于avconv(或ffmpeg,如果avconv不可用),因为它是我发现的最完整的命令行转换器.我的脚本可从此URL(GitHub)获得:
https://github.com/biapy/howto.biapy.com/blob/master/various/mussync-tools
我正在尝试将元数据从输入库文件传递到输出/转换的库文件.
我想出了这段代码:
local MAP_METADATA=' 0:g'
# Specific needs for some input formats/
case "${INPUT_FILE_MIMETYPE}" in
'application/ogg' )
# Get input metadata from first audio stream and direct it to global.
MAP_METADATA=' 0:s:0'
;;
* )
# Do nothing.
# MAP_METADATA=' 0:g'
;;
esac
# Specific needs for some output formats/
local OUTPUT_OPTIONS=""
case "${OUTPUT_FORMAT}" in
'flac' )
# No encoding options needed.
ENCODING_OPTIONS=""
;;
'ogg' )
# Set vorbis as default codec for ogg.
OUTPUT_OPTIONS="-codec:a libvorbis -f ${OUTPUT_FORMAT}" …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个全面的Java API,可以转换各种格式和比特率的音频.
例如WAV(6kHz至48kHz)L16 /音频--- TO --- WAV(RIFF标题)8KHz 8位单声道A-law/U-law AIFF(6kHz至48kHz)L16 /音频--- TO-- - WAV(RIFF标头)8KHz 8位单声道A-law/U-law
和其他语音音频格式.
关于音频转换的类似Java库的任何其他建议也受到欢迎.
我正在研究从媒体选择器中挑选歌曲并将数据发送到服务器的项目.我正在转换这首歌.它适用于普通歌曲(即不属于购买的歌曲的歌曲),对于购买的歌曲我收到错误.我整合了这个由apple(iPhoneExtAudioFileConvertTest)给出的样本.请帮我解决这个问题.
我正在尝试使用适用于iOS应用的LAME将Linear PCM音频文件(.wav)转换为MP3。我成功地做到了,除了一个问题,创建的MP3文件比原始的.wav文件小。对于30秒的wav文件,创建的MP3文件为27秒,最后3秒的音频被切掉。在5分钟的音频中,约30秒的音频被截断,生成MP3。
我不太确定是什么引起了这个问题,我已经尝试了一些更改,但没有任何效果。有人可以帮助我,将我推向正确的方向吗?
这是我为此使用的代码。
int read, write;
FILE *pcm = fopen([mergeFile cStringUsingEncoding:1], "rb"); //source
fseek(pcm, 4*1024, SEEK_CUR); //skip file header
FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb"); //output
const int PCM_SIZE = 8192;
const int MP3_SIZE = 8192;
short int pcm_buffer[PCM_SIZE*2];
unsigned char mp3_buffer[MP3_SIZE];
lame_t lame = lame_init();
lame_set_in_samplerate(lame, 44100);
lame_set_VBR(lame, vbr_default);
lame_init_params(lame);
do {
read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
NSLog(@"");
if (read == 0)
write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
else
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
} …Run Code Online (Sandbox Code Playgroud) 我可以找到的所有示例代码都AudioConverterRef集中在我预先拥有所有数据的用例(例如在磁盘上转换文件).它们通常调用AudioConverterFillComplexBufferPCM进行转换,然后将其inInputDataProcUserData填入回调中.(这真的是它应该如何使用?为什么它需要回调呢?)对于我的用例,我试图从麦克风流式传输aac音频,所以我没有文件,我的PCM缓冲区正在实时填写.
由于我没有*ioNumberDataPackets = 0预先拥有所有数据,所以我在输入数据输出后尝试进行回调,但这只是将AudioConverter置于需要进行AudioConverterReset()ted 的死亡状态,而我不会从中获取任何数据.
我在网上看到的一种方法是,如果我存储的数据太小,就会从回调中返回错误,只要我有更多数据就再试一次,但这似乎是浪费资源,我不能让自己尝试一下.
我真的需要做"重试,直到我的输入缓冲区足够大",还是有更好的方法?
在 iOS 中使用 Swift 将音频 mp3 文件转换为具有以下特征的音频类型 raw 的最有效方法是什么?
single-channel (monaural)
little-endian
unheadered
16-bit signed
PCM
sampled at 16000 Hz
Run Code Online (Sandbox Code Playgroud) 我正在用 Java 创建一个小型音频播放器,可以很好地播放某些格式(例如 WAV)。我发现这是因为javax.sound不支持MP4。但根据我所读到的内容,从 MP4 转换为 WAV 是无损的,所以我相信这应该不会那么困难。我知道有很多第三方库可以做到这一点,但我对下载一个应该相当简单的东西不感兴趣。我研究了每个 ISO 的具体情况,试图了解数据是如何存储的,以便能够创建一个 ISO BufferedReader,并BufferedWritter查看是否可以手动转换它,但我无法找到我正在寻找的信息。在纯 Java 1.7.0 中执行此操作的方法是什么(我知道 JavaFX 有一个 MediaPlayer,但不幸的是我无法使用 1.8.0)。
或者如果有人知道我可以在哪里找到组成 MP4 和 WAV 的每个特定容器信息(例如标头大小/信息、数据、ACK/NACK 等)。
我有一个 wav 文件,需要将其转换为我们的应用程序之一可以读取的格式。我要转换的文件格式为:
我想要转换成的可读文件格式是:
为了实现这一点,我使用NAudio库。我用于转换的代码大致如下:
using (WaveFileReader reader = new WaveFileReader(inputWavFilePath))
{
WaveFormat newFormat = WaveFormat.CreateMuLawFormat(8000, 1);
using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
{
WaveFileWriter.CreateWaveFile(outputWavFilePath, conversionStream);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的转换会引发错误
AcmNotPossible 调用 acmStreamOpen
我已经看到了一些从 u-law 转换为 PCM 的链接,但在反向操作时遇到了麻烦。
我很难理解的是为什么当我转换时不会抛出PCM/48kHz/16bit -> uLaw/48kHz/8bit异常。但是,当我尝试将结果文件转换为抛出异常时。uLaw/8kHz/8bit
我是处理音频文件和不同格式的新手,所以如果我错过了一些简单的东西,我很抱歉。
有人可以解释一下为什么转换只在采样率转换时抛出异常,而不是在其他两个转换(编码PCM -> uLaw&& 16bit -> 8bit)时抛出异常吗?