- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在使用 Android (Jelly Bean) 中的媒体编解码器类将 PCM 格式编码为 AAC。该文件已编码,但没有音乐播放器能够播放该文件。我在网上找不到任何工作代码或适当的文档。
这是我的代码:
public void doConvert()
{
new AsyncTask<Void, Void, Void>()
{
@Override
protected Void doInBackground(Void... params)
{
try
{
int codecCount = MediaCodecList.getCodecCount();
for ( int i=0; i < codecCount; i++)
{
MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i);
Logger.getLogger(MainActivity.class.getSimpleName()).log(Level.INFO, info.getName());
for ( String type : info.getSupportedTypes() )
{
Logger.getLogger(MainActivity.class.getSimpleName()).log(Level.INFO, type);
}
}
File inputFile = new File( Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/Ghajini27_Mono_8Khz.wav");
//File inputFile = new File( sampleFD.get);
Log.e("File", String.valueOf(inputFile.length()));
FileInputStream fis = new FileInputStream(inputFile);
fis.skip(44);//remove wav header
File outputFile = new File( Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/out.m4a");
if ( outputFile.exists()) outputFile.delete();
FileOutputStream fos = new FileOutputStream(outputFile);
//BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(outputFile));
MediaCodec codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat outputFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", 22050, 1);
outputFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
// outputFormat.setInteger(MediaFormat.KEY_CHANNEL_MASK, AudioFormat.CHANNEL_CONFIGURATION_MONO);
outputFormat.setInteger(MediaFormat.KEY_BIT_RATE, 22050 );
outputFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
//outputFormat.setLong(MediaFormat.KEY_MAX_INPUT_SIZE, inputFile.length());
double durationInMs = (inputFile.length()/16000)*1000;
Log.e("duration",String.valueOf((long)durationInMs));
outputFormat.setLong(MediaFormat.KEY_DURATION, (long)durationInMs );
codec.configure(outputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE );
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffer = codec.getOutputBuffers();
boolean hasMoreData = true;
MediaCodec.BufferInfo outBuffInfo = new BufferInfo();
byte readBuffer[] = new byte[48000];
byte writeBuffer[] = new byte[48000];
do
{
int nextBuffer = codec.dequeueInputBuffer(5000);
Log.e("NextBuffer","nextInputBuffer = "+nextBuffer);
if ( nextBuffer >= 0 )
{
ByteBuffer inBuf = inputBuffers[nextBuffer];
inBuf.clear();
int bytesRead = fis.read( readBuffer,0, inBuf.capacity() );
Log.e("bytesread","Read = "+bytesRead);
if ( bytesRead < inBuf.capacity() )
{
hasMoreData = false;
}
inBuf.put(readBuffer, 0, bytesRead);
codec.queueInputBuffer(nextBuffer, 0, bytesRead, 0, hasMoreData?0:MediaCodec.BUFFER_FLAG_END_OF_STREAM);
}
int outputBufferIndex = codec.dequeueOutputBuffer( outBuffInfo, 3000);
/* logger.log(Level.INFO,"nextOutputBuffer = "+outputBufferIndex);
logger.log(Level.INFO,"outBuffInfo offset = "+outBuffInfo.offset);
logger.log(Level.INFO,"outBuffInfo size = "+outBuffInfo.size);
logger.log(Level.INFO,"outBuffInfo flags = "+outBuffInfo.flags);*/
//while ( outputBufferIndex > -1 )
//{
outputBuffer[outputBufferIndex].position(outBuffInfo.offset);
outputBuffer[outputBufferIndex].get(writeBuffer,0,outBuffInfo.size);
fos.write(writeBuffer,0, outBuffInfo.size);
// logger.log(Level.INFO,"Writing = "+outBuffInfo.size+" bytes");
outputBuffer[outputBufferIndex].clear();
codec.releaseOutputBuffer(outputBufferIndex, false);
if ( outBuffInfo.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM )
{
codec.flush();
codec.stop();
codec.release();
break;
}
//outputBufferIndex = codec.dequeueOutputBuffer( outBuffInfo, 1000 );
//logger.log(Level.INFO,"nextOutputBuffer = "+outputBufferIndex);
//}
} while (outBuffInfo.flags != MediaCodec.BUFFER_FLAG_END_OF_STREAM);
fis.close();
fos.flush();
fos.close();
}
catch ( Exception e)
{
//Logger.getLogger(MainActivity.class.getSimpleName()).log(Level.INFO, "Codec Error",e);
}
//logger.log(Level.INFO,"Done");
return null;
}
}.execute();
}
最佳答案
您需要为其选择一个容器。我更喜欢广告。
将有效负载数据复制到一个对您的容器足够大的数组中,只需添加您的位即可。所以在网上搜索了我的解决方案后,我做了一些 fragment
方法'fillInADTSHeader'
profile =( configParams[0]>>3 )&0x1f;
frequency_index = (this.configParams[0]&0x7) <<1 | (this.configParams[1]>>7) &0x1;
channel_config = (this.configParams[1]>>3) &0xf;
int finallength = encoded_length + 7;
ENCodedByteArray[0] = (byte) 0xff;
ENCodedByteArray[1] = (byte) 0xf1;
ENCodedByteArray[2] = (byte) ( ((profile - 1) << 6) + (frequency_index << 2) +(channel_config >> 2));
ENCodedByteArray[3] = (byte) (((channel_config & 0x3) << 6) + (finallength >> 11));
ENCodedByteArray[4] = (byte)( (finallength & 0x7ff) >> 3);
ENCodedByteArray[5] = (byte) (((finallength & 7) << 5) + 0x1f) ;
ENCodedByteArray[6] = (byte) 0xfc;
使用类似的东西
byte chunkADTS[]=new byte[info.size + 7];
fillInADTSHeader(chunkADTS,info.size);
outputBuffers[bR].get(chunkADTS,7,info.size);
buffer.pushData(chunkADTS);
应该在广播等中播放...
关于android - 使用媒体编解码器将 PCM 转换为 AAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14934305/
我是 iphone 开发人员,现在正在开发一款 mac 应用程序。这是我在 mac 平台上的第一个项目。 我必须分析歌曲文件的 BPM。我已经使用 FMOD 和 SoundTouch 库为 MP3 完
我正在尝试使用 libavcodec/ffmpeg API 以 AAC-LC、AAC-HE-V1、AAC-HE-V2 编码音频。 但是当我使用以下配置和 API 调用时。它显示“无效的 AAC 配置文
我正在尝试使以下截屏命令起作用: avconv -f alsa -ar 44100 -ac 2 -i default -acodec aac -strict experimental -ab 320k
我想使用 ffmpeg 将 mp3 转换为 aac 并将其流式传输到我的节点应用程序中的 s3。我的代码如下。现在,当我尝试将 audioCodec 用作“aac”或“libfdk-aac”时。它抛出
我设法记录了 mp3 与 VLC 2.1.5 在 MacOSX 10.9.2 通过使用这个命令: ./VLC -vvv qtsound://AppleHDAEngineInput:1B,0,1,0:1
我正在尝试将原始 PCM 转换为 aac。所以我试图通过 ffmpeg 来实现它。 我的 ffmepg 配置 --enable-cross-compile --arch=arm --cpu=armv6
您好,我出于非营利目的运行流式编码器。选择 FFMPEG 是因为它非常简单并且几乎可以完美地完成工作,但是音频会发出嘈杂的爆裂声。视频非常清晰。 ffmpeg 版本 N-86950-g1bef008
如果我有一个包含视频流和音频流的 .mp4 文件。如果我执行这个命令: ffmpeg -i input.mp4 -ss 00:00:14.000 -t 00:00:01.000 -vn -c:a li
我想将 WAV 格式的音频流编码为 AAC 格式,并将 AAC 音频流解码为 WAV。我可以使用 SharpDX 的 MediaFoundation DLL 实现吗?那我该如何使用呢? 最佳答案 也许
如果你只做 ffmpeg -i aFile.ts aFile.m4a 会发生什么?而不是 ffmpeg -i aFile.ts -codec copy aFile.m4a ,当 TS 文件只包含一个流
我正在开发一个 MP3 播放器,我想添加 radio 功能。几乎所有关于此的 StackOverflow 帖子都来自 2010 年。这对于这个主题来说非常烦人,因为我找不到解决方案。我知道这是商业解决
我可能听起来太菜鸟请原谅我。当我在 Matlab 中使用 读取 .AAC 音频文件时有声读物 函数输出是一个 256000x6 矩阵。我怎么知道每列的内容是什么? filename = 'sample
有什么提示吗?我正在尝试:http://www.jplayer.org/结果不佳。 错误的结果意味着它不起作用,也完全没有错误。 因此,我正在寻找一种支持.aac文件的替代方案。 最佳答案 试试这个
我确实有一个非常特殊的问题,我希望我能找到答案。 我正在尝试使用 NAudio 库从 URL(在线流广播,例如 live.noroc.tv:8000/radionoroc.aacp)读取 AAC 流并
我目前正在尝试开发视频/音频编码管道。 我的目标是对包含 h264 视频轨道和 AAC 音频轨道的 mp4 文件进行编码。这些文件应该一个接一个地播放,中间没有任何间隙。 目前我正在使用 ffmpeg
我目前正在使用RTP传输音频(8kHz的AAC-HBR)和视频(H264)。两种供稿都可以单独正常工作,但是放在一起时,它们的同步速度非常快(不到15秒)。 我不确定如何增加音频RTP报头上的时间戳,
我正在尝试将3gpp中打包的AAC-LC数据编码为RTP。我已经通过了rfc 3640,但我仍然不知道从哪里开始。我将在AAC数据中找到什么?如果我没记错的话,前40个字节将是MP4 header ,
我正在处理具有以下元数据的 M4a 文件: Metadata: major_brand : M4A minor_version : 0 compatible_bra
在使用 FFMPEG android java 库时发生以下异常的视频播放速度(使视频变慢)。 [aac @ 0x416c26f0] The encoder 'aac' is experimental
我无法让 FFmpeg 将 AAC 文件转换为 HLS block : cat file.m4a | ffmpeg -y -i pipe:0 -c:a libmp3lame -q:a 0 -map 0
我是一名优秀的程序员,十分优秀!