- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我的目标:我想将 .3gp 电影文件加载到 AVURLAsset 中。然后我想获取视频轨道并将输出帧泵入 OpenGL ES 纹理。这将是视频播放。然后我想继续利用 AVFoundation 来播放音频。该框架非常庞大,因此我希望在这方面得到一些资深人士的帮助。
我实际上让这两个部分分开工作,但是当我尝试同时执行这两个部分时,总会出错。简而言之,这是我目前的尝试(为简洁起见省略了所有错误处理):
我将 .3gp 文件加载到 AVURLAsset 中并加载轨道:
NSURL* fileURL = [[NSBundle mainBundle] URLForResource:someName withExtension:someExtension];
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^ {/* More Code */}];
在完成处理程序中,我获得了对音频和视频轨道的引用:
// Tracks loaded, grab the audio and video tracks.
AVAssetTrack* videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack* audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
接下来,我创建单独的 AVMutableComposition ,其中只包含音轨和视频轨。我不确定这是否完全有必要,但这似乎是个好主意,而且似乎也有效:
// Make a composition with the video track.
AVMutableComposition* videoComposition = [AVMutableComposition composition];
AVMutableCompositionTrack* videoCompositionTrack = [videoComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[videoCompositionTrack insertTimeRange:[videoTrack timeRange] ofTrack:videoTrack atTime:CMTimeMake(0, 1) error:nil];
// Make a composition with the audio track.
AVMutableComposition* audioComposition = [AVMutableComposition composition];
AVMutableCompositionTrack* audioCompositionTrack = [audioComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[audioCompositionTrack insertTimeRange:[audioTrack timeRange] ofTrack:audioTrack atTime:CMTimeMake(0, 1) error:nil];
现在我将详细介绍如何处理每条轨道。我相当有信心我有处理视频轨道的唯一方法,即为视频合成创建一个 AVAssetReader,并添加一个使用视频合成轨道创建的 AVAssetTrackReaderOutput。通过保留对该轨道输出的引用,我可以调用它的 -copyNextSampleBuffer
方法来获取将视频输出泵入 OpenGL ES 纹理所需的信息。这本身就足够了:
// Create Asset Reader and Output for the video track.
NSDictionary* settings = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(NSString *)kCVPixelBufferPixelFormatTypeKey];
_assetReader = [[AVAssetReader assetReaderWithAsset:vComposition error:nil] retain];
_videoTrackOutput = [[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:vCompositionTrack outputSettings:settings] retain];
[_assetReader addOutput:_videoTrackOutput];
[_assetReader startReading];
似乎破坏了整个事情的是试图以任何方式播放音频。我不太确定对剩余的音轨采用哪种方法。仅坚持 AVFoundation 领域,我看到两种可能的方法。第一种是使用 AVPlayer 来播放音频组合:
// Create a player for the audio.
AVPlayerItem* audioPlayerItem = [AVPlayerItem playerItemWithAsset:aComposition];
AVPlayer* audioPlayer = [[AVPlayer playerWithPlayerItem:audioPlayerItem] retain];
[audioPlayer play];
这行得通,因为我可以听到所需的音频。不幸的是,创建此播放器会保证视频组合的 AVAssetReaderTrackOutput 在调用 -copyNextSampleBuffer
时失败并出现神秘错误:
AVAssetReaderStatusFailed
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x456e50 {NSLocalizedFailureReason=An unknown error occurred (-12785), NSUnderlyingError=0x486570 "The operation couldn’t be completed. (OSStatus error -12785.)", NSLocalizedDescription=The operation could not be completed}
我对它们如何相互干扰感到困惑,但无论如何,这种方法似乎是死胡同。
我考虑用于音频播放的另一个选项是 AVAudioPlayer 类,但我无法将它与 AVAsset 作为起点一起使用。我试图将其 -initWithData:error:
方法与 NSData 一起使用,该方法通过聚合 CMSampleBufferRefs 的内容构建,采用的方法与我在视频轨道上使用的方法相同,但它似乎不是格式正确。
在这一点上,我觉得自己在盲目地四处乱窜,如果有人能告诉我这种方法是否可行,我会非常高兴。如果不是,我当然会感激一个可行的。
最佳答案
为每个音轨创建 AVMutableCompositions(基本上是新的 AVAssets)对我来说似乎是迂回的,我只是在音轨上使用 AVAssetReader。此外,您的 videoComposition 似乎没有在任何地方使用,那么为什么要创建它?
在任何情况下,要使任一解决方案都起作用,请将 Audio Session 类别设置为 kAudioSessionCategory_MediaPlayback
并启用 kAudioSessionProperty_OverrideCategoryMixWithOthers
。
我从未找到任何文档来解释为什么这是必要的。
关于objective-c - 如何独立处理 AVURLAsset 的单独轨道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038951/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!