我正在编写一个应用程序来操作音频,我首先需要将文件(wav、MP3 等)转换为原始数据(样本显示为浮点数)。
我在 cmd 中使用 ffmpeg:
ffmpeg -i test.wav -f s16le -acodec pcm_s16le output.dat
Run Code Online (Sandbox Code Playgroud)
样本如何在 output.dat文件中?我知道一个样本在 S16 下需要两个字节,双通道意味着它存储为 L1 R1 L2 R2 ...但是这个文件是否带有帧演示或 dat 文件中的所有字节都是样本值?两种方法转换后的test.wav文件大小不一样。一个是通过libav使用ffmpeg网站上的示例代码,另一个是上面提到的,直接在cmd中使用ffmpeg.exe,前一种方法给我的文件大小略小。当我发现有人说pcm使用框架演示时我很困惑(每帧 2048 个样本)。
我实际上不需要任何代码,但希望有人可以详细解释原始 pcm 格式。
非常感谢
为了处理mutagen,.ogg,.apev2,.wma,flac,mp4和asf所接受的每种文件类型,我需要做什么?(我排除了mp3,因为它上面有最多的文档)
如果知道如何完成这项工作的人可以提供一些伪代码来解释所使用的技术,我将不胜感激.我想要提取的主要标签是标题,文件的艺术家,专辑(如果有).
从哪儿开始?
我在解析基于其字节数的mp3文件中的数据时遇到问题。
第一部分输出正确,我有一个254秒长的mp3文件,我从Github的mp3解析库mp3agic获取了它的信息。
但是,有关帧长度和持续时间的信息的第二部分是不正确的。
Length of this mp3 is: 254 seconds
Bitrate: 320 kbps (CBR)
Sample rate: 44100 Hz
Has ID3v1 tag?: NO
Has ID3v2 tag?: YES
Has custom tag?: NO
framelength -1
framerate 38.28125
duration -271265.06
Run Code Online (Sandbox Code Playgroud)
我用来获取帧长,帧率和持续时间的代码是:
File file = musicFile.getFileValue();
this.audioStream.startMusicStream(file);
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
AudioFormat format = audioInputStream.getFormat();
long audioFileLength = file.length();
int frameSize = format.getFrameSize();
float frameRate = format.getFrameRate();
float durationInSeconds = (audioFileLength / (frameSize * frameRate));
System.out.println("framelength "+frameSize);
System.out.println("framerate "+frameRate);
System.out.println("duration "+durationInSeconds);
this.setDurationLabel(durationInSeconds);
} …Run Code Online (Sandbox Code Playgroud) 如何从AMR-NB文件中提取采样率,比特率等信息.严格来说,我想要采样率或任何其他可能改变其音高或节奏的数据.
WAV文件很容易,但在这里我受限于AMR-NB格式(J2me设备)
我在谷歌上搜索了很多但却无法得到任何东西......
AMR-NB固定在8Khz?或者每个样品都有所不同?
在 safari 5 中,不支持新音频,因此错误控制台显示:
TypeError : 'undefined' is not a constructor (evaluating 'new Audio')
Run Code Online (Sandbox Code Playgroud)
我如何以编程方式知道浏览器是否支持新音频?
我知道在线有很多资源可以解释如何对PCM数据进行解交织.在我的当前项目的过程中,我已经看过他们大多......但我在音频处理没有背景,我有一个很很难找到如何详细的解释正是音频的这种常见的形式被存储.
我明白我的音频将有两个通道,因此样本将以[左] [右] [左] [右]的格式存储...我不明白的是这究竟是什么意思.我还读过每个样本以[左MSB] [左LSB] [右MSB] [右LSB]的格式存储.这是否意味着每个16位整数实际上编码两个8位帧,或者每个16位整数它自己的帧是指向左还是右通道?
谢谢大家.任何帮助表示赞赏.
方法上下文
具体来说,我要做的是将交错的short []转换为两个float [],每个float []代表左或右通道.我将用Java实现它.
public static float[][] deinterleaveAudioData(short[] interleavedData) {
//initialize the channel arrays
float[] left = new float[interleavedData.length / 2];
float[] right = new float[interleavedData.length / 2];
//iterate through the buffer
for (int i = 0; i < interleavedData.length; i++) {
//THIS IS WHERE I DON'T KNOW WHAT TO DO
}
//return the separated left and right channels
return new float[][]{left, right};
}
Run Code Online (Sandbox Code Playgroud)
我目前的实施
我试过播放由此产生的音频.它非常接近,足够接近,你可以理解一首歌的词,但显然仍然不是正确的方法.
public …Run Code Online (Sandbox Code Playgroud) 我一直在努力弄清楚如何在一天的大部分时间内做到这一点,但我找不到多少帮助.我们有这个多媒体应用程序,允许用户查看有关特定主题的图片,视频和音乐/铃声.我知道您可以使用保存图像UIImageWriteToSavedPhotosAlbum,您可以使用保存视频文件UISaveVideoAtPathToSavedPhotosAlbum.但我无法弄清楚如何允许用户保存音频文件.所有文件都存储在应用程序中,因此它不像我正在尝试从Internet上流式传输或下载它们.有没有人有关于如何做到这一点的任何指示?
我有一个奇怪的问题.我的代码在iOS 5和6上运行良好,但在iOS 7上运行时,我在AudioQueue回调上获得了空缓冲区.
可能的相关代码:
- (void)setUpAudioFormat
{
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mSampleRate = SAMPLE_RATE;//16000.0;
audioFormat.mChannelsPerFrame = CHANNELS;//1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mFramesPerPacket = 1;
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(SInt16);
audioFormat.mBytesPerPacket = audioFormat.mBytesPerFrame * audioFormat.mFramesPerPacket;
audioFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger
| kLinearPCMFormatFlagIsPacked;
bufferNumPackets = 2048; // must be power of 2 for FFT!
bufferByteSize = [self byteSizeForNumPackets:bufferNumPackets];
}
- (UInt32)numPacketsForTime:(Float64)seconds
{
return (UInt32) (seconds * audioFormat.mSampleRate / audioFormat.mFramesPerPacket);
}
- (UInt32)byteSizeForNumPackets:(UInt32)numPackets
{
return numPackets * audioFormat.mBytesPerPacket;
}
- (void)setUpRecordQueue
{
NSLog(@"\n+++ setUpRecordQueue");
OSStatus errorStatus = …Run Code Online (Sandbox Code Playgroud) 我正在使用Apple的MixerHost示例项目,该项目设置了一个音频单元处理图,其中包含一个连接到远程I/O音频单元的多声道混音器音频单元.我试图在两者之间放置一个格式转换器音频单元,这样我就可以转换混音器输出的格式.
复制两个现有音频单元的设置似乎很简单,当我输出图形设置时,它看起来是正确的:
Member Nodes:
node 1: 'auou' 'rioc' 'appl', instance 0x1cdf10 O
node 2: 'aufc' 'conv' 'appl', instance 0x1ce890 O
node 3: 'aumx' 'mcmx' 'appl', instance 0x1ceba0 O
Connections:
node 3 bus 0 => node 2 bus 1
node 2 bus 0 => node 1 bus 0 [ 2 ch, 0 Hz, 'lpcm' (0x0000000C) 16-bit little-endian signed integer]
Run Code Online (Sandbox Code Playgroud)
但是,当我初始化图形时,我得到错误-10877,无效元素,图形无法启动.任何人都可以看到什么是错的?这是完整的设置代码:
NSLog (@"Configuring and then initializing audio processing graph");
OSStatus result = noErr;
//............................................................................
// Create a new audio processing graph.
result …Run Code Online (Sandbox Code Playgroud) public TargetDataLine targetDataLine;
private static AudioFormat getAudioFormat()
{
return new AudioFormat(16000, 16, 2, true, false);
}
AudioFormat a = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, a);
targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(a);
targetDataLine.start();
AudioInputStream ais = new AudioInputStream(targetDataLine);
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, new File("record.wav"));
Run Code Online (Sandbox Code Playgroud)
audioformat ×11
audio ×6
java ×4
ios ×2
iphone ×2
pcm ×2
wav ×2
amr ×1
audioqueue ×1
audiounit ×1
c# ×1
core-audio ×1
decibel ×1
ffmpeg ×1
html5-audio ×1
interleave ×1
ios7 ×1
ipad ×1
javascript ×1
mp3 ×1
mutagen ×1
python ×1
save ×1