Macos 从视频文件中提取音频并在OpenAL中播放
我希望能够从视频文件中提取音频并将其加载到OpenAL播放的缓冲区中,但我不知道从何开始 AVFoundation似乎是最简单的方法(与FFMPEG相比,不是吗?),但我找不到方法让缓冲区可以用OpenAL播放。我在MacOSX上使用,效果非常好Macos 从视频文件中提取音频并在OpenAL中播放,macos,audio,video,avfoundation,openal,Macos,Audio,Video,Avfoundation,Openal,我希望能够从视频文件中提取音频并将其加载到OpenAL播放的缓冲区中,但我不知道从何开始 AVFoundation似乎是最简单的方法(与FFMPEG相比,不是吗?),但我找不到方法让缓冲区可以用OpenAL播放。我在MacOSX上使用,效果非常好 我正在寻找有关它的建议、代码示例或教程 对于可能感兴趣的人,我是这样做的。它采用AVFoundation输入的所有格式 在AVAsset中加载我的文件(视频或音频) 获取音频曲目(AVAssetTrack) 在NSData中转换PCM中的曲目 添加W
我正在寻找有关它的建议、代码示例或教程 对于可能感兴趣的人,我是这样做的。它采用AVFoundation输入的所有格式
- 在AVAsset中加载我的文件(视频或音频)李>
- 获取音频曲目(AVAssetTrack)李>
- 在NSData中转换PCM中的曲目李>
- 添加WAV头(可选->ALBuffer需要不带头的数据)李>
- 向ALBuffer(from)提供数据李>
// ---- Creates the WAV data header and returns it
//
- (NSMutableData *) wavHeaderWithDataLength:(NSUInteger)length channels:(int)channels bitDepth:(int)bitDepth sampleRate:(long)sampleRate byteRate:(long)byteRate
{
// ---- The WAV header is 44 bytes long
//
long totalAudioLen = length;
long totalDataLen = totalAudioLen + 44;
// ---- The WAV header
//
Byte *header = (Byte*)malloc(44);
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (Byte) (totalDataLen & 0xff);
header[5] = (Byte) ((totalDataLen >> 8) & 0xff);
header[6] = (Byte) ((totalDataLen >> 16) & 0xff);
header[7] = (Byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = bitDepth; // 16; // 4 bytes: size of 'fmt ' chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1; // format = 1
header[21] = 0;
header[22] = (Byte) channels;
header[23] = 0;
header[24] = (Byte) (sampleRate & 0xff);
header[25] = (Byte) ((sampleRate >> 8) & 0xff);
header[26] = (Byte) ((sampleRate >> 16) & 0xff);
header[27] = (Byte) ((sampleRate >> 24) & 0xff);
header[28] = (Byte) (byteRate & 0xff);
header[29] = (Byte) ((byteRate >> 8) & 0xff);
header[30] = (Byte) ((byteRate >> 16) & 0xff);
header[31] = (Byte) ((byteRate >> 24) & 0xff);
header[32] = (Byte) (2 * 8 / 8); // block align
header[33] = 0;
header[34] = bitDepth; // 16; // bits per sample
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (Byte) (totalAudioLen & 0xff);
header[41] = (Byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (Byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (Byte) ((totalAudioLen >> 24) & 0xff);
// ---- The header NSData
//
NSMutableData *headerData = [NSMutableData dataWithBytes:header length:44];
free(header);
return headerData;
}
希望它能对别人有用 您对处理哪类文件感兴趣?就MP4?可能是AVI、WMV或其他?能够读取所有文件将是最好的…这是大量的工作,因为所有类型都是唯一的。
// ---- Creates the WAV data header and returns it
//
- (NSMutableData *) wavHeaderWithDataLength:(NSUInteger)length channels:(int)channels bitDepth:(int)bitDepth sampleRate:(long)sampleRate byteRate:(long)byteRate
{
// ---- The WAV header is 44 bytes long
//
long totalAudioLen = length;
long totalDataLen = totalAudioLen + 44;
// ---- The WAV header
//
Byte *header = (Byte*)malloc(44);
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (Byte) (totalDataLen & 0xff);
header[5] = (Byte) ((totalDataLen >> 8) & 0xff);
header[6] = (Byte) ((totalDataLen >> 16) & 0xff);
header[7] = (Byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = bitDepth; // 16; // 4 bytes: size of 'fmt ' chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1; // format = 1
header[21] = 0;
header[22] = (Byte) channels;
header[23] = 0;
header[24] = (Byte) (sampleRate & 0xff);
header[25] = (Byte) ((sampleRate >> 8) & 0xff);
header[26] = (Byte) ((sampleRate >> 16) & 0xff);
header[27] = (Byte) ((sampleRate >> 24) & 0xff);
header[28] = (Byte) (byteRate & 0xff);
header[29] = (Byte) ((byteRate >> 8) & 0xff);
header[30] = (Byte) ((byteRate >> 16) & 0xff);
header[31] = (Byte) ((byteRate >> 24) & 0xff);
header[32] = (Byte) (2 * 8 / 8); // block align
header[33] = 0;
header[34] = bitDepth; // 16; // bits per sample
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (Byte) (totalAudioLen & 0xff);
header[41] = (Byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (Byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (Byte) ((totalAudioLen >> 24) & 0xff);
// ---- The header NSData
//
NSMutableData *headerData = [NSMutableData dataWithBytes:header length:44];
free(header);
return headerData;
}