- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于 OSX 和 IOS,我有实时编码的视频 (h.264) 和音频 (AAC) 数据流传入,我希望能够将它们混合到一个 mp4 中。
我正在使用 AVAssetWriter
执行复用。
我可以正常播放视频,但我的音频听起来仍然像混杂的静电噪音。这是我现在正在尝试的(为简洁起见跳过一些错误检查):
我初始化编写器:
NSURL *url = [NSURL fileURLWithPath:mContext->filename];
NSError* err = nil;
mContext->writer = [AVAssetWriter assetWriterWithURL:url fileType:AVFileTypeMPEG4 error:&err];
我初始化音频输入:
NSDictionary* settings;
AudioChannelLayout acl;
bzero(&acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
settings = nil; // set output to nil so it becomes a pass-through
CMAudioFormatDescriptionRef audioFormatDesc = nil;
{
AudioStreamBasicDescription absd = {0};
absd.mSampleRate = mParameters.audioSampleRate; //known sample rate
absd.mFormatID = kAudioFormatMPEG4AAC;
absd.mFormatFlags = kMPEG4Object_AAC_Main;
CMAudioFormatDescriptionCreate(NULL, &absd, 0, NULL, 0, NULL, NULL, &audioFormatDesc);
}
mContext->aacWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:settings sourceFormatHint:audioFormatDesc];
mContext->aacWriterInput.expectsMediaDataInRealTime = YES;
[mContext->writer addInput:mContext->aacWriterInput];
然后启动编写器:
[mContext->writer startWriting];
[mContext->writer startSessionAtSourceTime:kCMTimeZero];
然后,我有一个回调,我收到一个带有时间戳(毫秒)和 std::vector<uint8_t>
的数据包。数据包含 1024 个压缩样本。我确定isReadyForMoreMediaData
是真的。然后,如果这是我们第一次收到回调,我会设置 CMAudioFormatDescription:
OSStatus error = 0;
AudioStreamBasicDescription streamDesc = {0};
streamDesc.mSampleRate = mParameters.audioSampleRate;
streamDesc.mFormatID = kAudioFormatMPEG4AAC;
streamDesc.mFormatFlags = kMPEG4Object_AAC_Main;
streamDesc.mChannelsPerFrame = 2; // always stereo for us
streamDesc.mBitsPerChannel = 0;
streamDesc.mBytesPerFrame = 0;
streamDesc.mFramesPerPacket = 1024; // Our AAC packets contain 1024 samples per frame
streamDesc.mBytesPerPacket = 0;
streamDesc.mReserved = 0;
AudioChannelLayout acl;
bzero(&acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
error = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &streamDesc, sizeof(acl), &acl, 0, NULL, NULL, &mContext->audioFormat);
最后,我创建了一个 CMSampleBufferRef
并一起发送:
CMSampleBufferRef buffer = NULL;
CMBlockBufferRef blockBuffer;
CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault, NULL, packet.data.size(), kCFAllocatorDefault, NULL, 0, packet.data.size(), kCMBlockBufferAssureMemoryNowFlag, &blockBuffer);
CMBlockBufferReplaceDataBytes((void*)packet.data.data(), blockBuffer, 0, packet.data.size());
CMTime duration = CMTimeMake(1024, mParameters.audioSampleRate);
CMTime pts = CMTimeMake(packet.timestamp, 1000);
CMSampleTimingInfo timing = {duration , pts, kCMTimeInvalid };
size_t sampleSizeArray[1] = {packet.data.size()};
error = CMSampleBufferCreate(kCFAllocatorDefault, blockBuffer, true, NULL, nullptr, mContext->audioFormat, 1, 1, &timing, 1, sampleSizeArray, &buffer);
// First input buffer must have an appropriate kCMSampleBufferAttachmentKey_TrimDurationAtStart since the codec has encoder delay'
if (mContext->firstAudioFrame)
{
CFDictionaryRef dict = NULL;
dict = CMTimeCopyAsDictionary(CMTimeMake(1024, 44100), kCFAllocatorDefault);
CMSetAttachment(buffer, kCMSampleBufferAttachmentKey_TrimDurationAtStart, dict, kCMAttachmentMode_ShouldNotPropagate);
// we must trim the start time on first audio frame...
mContext->firstAudioFrame = false;
}
CMSampleBufferMakeDataReady(buffer);
BOOL ret = [mContext->aacWriterInput appendSampleBuffer:buffer];
我想我最怀疑的部分是我对 CMSampleBufferCreate 的调用。看来我必须传入一个样本大小数组,否则在检查作者状态时我会立即收到此错误消息:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-12735), NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x604001e50770 {Error Domain=NSOSStatusErrorDomain Code=-12735 "(null)"}}
潜在错误似乎是 kCMSampleBufferError_BufferHasNoSampleSizes
.
我确实注意到 Apple 文档中的一个使用 AAC 数据创建缓冲区的示例: https://developer.apple.com/documentation/coremedia/1489723-cmsamplebuffercreate?language=objc
在他们的示例中,他们指定了一个长 sampleSizeArray,每个样本都有一个条目。那有必要吗?我没有这个回调的信息。在我们的 Windows 实现中,我们不需要这些数据。所以我尝试将 packet.data.size() 作为样本大小发送,但这似乎不正确,而且它肯定不会产生令人愉悦的音频。
有什么想法吗?在此处调整我的调用或我应该使用不同的 API 将编码数据流混合在一起。
谢谢!
最佳答案
如果您不想转码,请不要传递 outputSetting 字典。你应该在那里传递 nil : mContext->aacWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:nil sourceFormatHint:audioFormatDesc];
关于ios - 使用 AVFoundation 将 AAC 音频和 h.264 视频流复用到 mp4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50142384/
我是 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
我是一名优秀的程序员,十分优秀!