- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Bento4库将 Annex B TS(MPEG-2 传输流)文件与分别从 VideoToolbox 和 AVFoundation 生成的 h264 视频和 AAC 音频流复用,作为 HLS(HTTP 直播流)流的源数据。这个问题不一定是特定于 Bento4 的:我正在尝试理解基本概念以便完成任务,最好是使用 Apple 库。
到目前为止,我已经弄清楚了如何通过从我的 CMVideoFormatDescriptionRef
中获取各种数据来创建 AP4_AvcSampleDescription
,最重要的是通过生成 SPS 和 PPS分别使用 CMVideoFormatDescriptionGetH264ParameterSetAtIndex
的索引 0 和 1,我可以将其作为字节缓冲区粘贴到 Bento4 中。太好了,这就是我需要的所有 header 信息,这样我就可以让 Bento4 将视频混合到 ts 文件中!
现在我正在尝试将音频混合到同一个文件中。我正在使用我的 CMAudioFormatDescriptionRef
获取构建我的 AP4_MpegAudioSampleDescription
所需的信息,Bento4 使用它来制作必要的 QT 原子和 header 。但是,如果字段是“解码器信息”字节缓冲区,则没有解释它是什么,也没有代码从数据生成一个。我希望有一个 CMAudioFormatDescriptionGetDecoderInfo
或其他东西,但我找不到类似的东西。任何Apple库中都有这样的功能吗?或者是否有一个很好的规范,但我还没有找到关于如何生成这些数据的规范?
或者,我是不是走错了路?有没有更简单的方法从 Mac/iOS 代码库 mux ts 文件?
最佳答案
将音频混合到 MPEG-TS 中非常容易,并且不需要像视频流那样的复杂 header !在将其写入 PES 之前,它只需要在每个样本缓冲区之前有一个 7 字节的 ADTS header 。
Bento4 仅使用“DecoderInfo”缓冲区将其解析为 AP4_Mp4AudioDecoderConfig
实例,以便它可以提取 ADTS header 所需的信息。我没有在获取这些数据时如此迂回,而是复制粘贴了 AP4_Mpeg2TsAudioSampleStream::WriteSample
以写入 CMSampleBufferRef
。它可以很容易地推广到其他音频框架,但我将按原样粘贴在这里以供引用:
// These two functions are copy-pasted from Ap4Mpeg2Ts.cpp
static unsigned int GetSamplingFrequencyIndex(unsigned int sampling_frequency) { ... }
static void
MakeAdtsHeader(unsigned char *bits,
size_t frame_size,
unsigned int sampling_frequency_index,
unsigned int channel_configuration) { ... }
static const size_t kAdtsHeaderLength = 7;
- (void)appendAudioSampleBuffer2:(CMSampleBufferRef)sampleBuffer
{
// Get the actual audio data from the block buffer.
CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
size_t blockBufferLength = CMBlockBufferGetDataLength(blockBuffer);
// Get the audio meta-data from its AudioFormatDescRef
CMAudioFormatDescriptionRef audioFormat = CMSampleBufferGetFormatDescription(sampleBuffer);
const AudioStreamBasicDescription *asbd = CMAudioFormatDescriptionGetStreamBasicDescription(audioFormat);
// These are the values we will need to build our ADTS header
unsigned int sample_rate = asbd->mSampleRate;
unsigned int channel_count = asbd->mChannelsPerFrame;
unsigned int sampling_frequency_index = GetSamplingFrequencyIndex(sample_rate);
unsigned int channel_configuration = channel_count;
// Create a byte buffer with first the header, and then the sample data.
NSMutableData *buffer = [NSMutableData dataWithLength:kAdtsHeaderLength + blockBufferLength];
MakeAdtsHeader((unsigned char*)[buffer mutableBytes], blockBufferLength, sampling_frequency_index, channel_configuration);
CMBlockBufferCopyDataBytes(blockBuffer, 0, blockBufferLength, ((char*)[buffer mutableBytes])+kAdtsHeaderLength);
// Calculate a timestamp int64 that Bento4 can use, by converting our CMTime into an Int64 in the timescale of the audio stream.
CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
AP4_UI64 ts = CMTimeConvertScale(presentationTime, _audioStream->m_TimeScale, kCMTimeRoundingMethod_Default).value;
_audioStream->WritePES(
(const unsigned char*)[buffer bytes],
(unsigned int)[buffer length],
ts,
false, // don't need a decode timestamp for audio
ts,
true, // do write a presentation timestamp so we can sync a/v
*_output
);
}
关于ios - 多路复用 Annex B MPEG-TS 时 SPS 和 PPS 的音频等效?什么是 "DecoderInfo"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203441/
我得到了很多作为 .dat 到达的数据集带有用于转换为 SPSS 的语法文件的文件 ( .sps )。我是 R 用户,所以我需要转换 .dat文件变成 .sav R 可以读取。 过去,我使用 PSPP
大家好,我一直在试图找出如何从 SPS 最终单位计算宽度和高度。我有具有这些参数的 H264 视频 h264 (High), yuvj420p(pc), 1280x720 [SAR 1:1 DAR 1
我有一个提供 H264 编码帧的设备。那些我想使用 LIVE555 通过网络传输的。 问题:这些帧不包括 SPS 和 PPS NAL 单元。但是,我可以访问一个函数,该函数在设备对第一帧进行编码后为我
我有两个视频流单元能够流式传输实时视频输入: AXIS Q7424-R 视频编码器 EPIPHAN VGADVI 广播器 99460 - 我正在使用 gstreamer 在运行 Linux 的客户端终
我正在尝试初始化一个 FFMPEG H264 编解码器上下文,用 SPS 帧填充额外数据字段,如下所示: #include #include int main() { const ch
我正在使用 gstreamer 摄取不同类型的安全摄像头 RTSP 流。在大多数情况下,我使用与此类似的管道 gst-launch-1.0 rtspsrc location=rtsp:// proto
我编写了一个 RTP 服务器来接收通过命令 ffmpeg -i test.mp4 rtp rtp://ip:port(客户端)发送的 RTP 数据包,服务器可以获得最终类型 24(STAP-A)。 我
我使用新 API 将图像从相机推送到 videoToolBox 编码器并从编码器回调中获取编码的 CMSampleBufferRef 我需要这些 sps 和 pts 用于 CMVideoFormatD
我正在尝试使用 MediaCodec NDK 解码具有非默认比色法的视频。我将 SPS 和 PPS 分别提供给 csd-0 和 csd-1 缓冲区,但这些信息似乎不会影响解码视频的外观。 首先,我初始
谁能给我指点文档,帮助我获得 iPhone 的正确 SPS 和 PPS 值。 最佳答案 问题有点不清楚... Picture Parameter Set 描述在最新的ITU-T release 7.3
我正在尝试将一个大文件 (1 GB) 从代码上传到 SharePoint 2013 on prem。我关注了this tutorial ,我从 NuGet 下载包“Microsoft.SharePoi
我对图像进行编码以供视频捕获器使用,并通过 ffmpeg 将其编码为 h264 并发送到我的客户端 pc 。 我的客户端电脑解码并显示它。它可以很好地解码和显示。 但我将这些压缩图像保存在一个文件中。
我使用 ffmpeg 和 libx264 对我的视频进行编码,当我打印 AVPacket 数据时,我发现有些东西只存在于第一个 IDR 之前。有人可以告诉我那是什么,谢谢。 0 0 1 6 5 ff
对于我的硬件解码器,我需要了解有关视频编解码器(如 h264)的其他编解码器规范?如何使用 libav ffmpeg 提取低级编解码器信息? 我需要的数据:https://www.ffmpeg.org
我正在尝试在 h.264 中编码视频,当使用 Apples HTTP Live Streaming 工具拆分时,媒体文件分段器将通过媒体文件验证器我在拆分的 MPEG-TS 文件上遇到两个错误 WAR
我使用英特尔硬件 MFT 将 NV12 帧编码为 H264 流,并使用 Live555 通过 LAN 上的 RTP 流式传输编码帧,并在另一端设置 ffplay 来解码和显示相同的帧。该设置与软件编码
我有一个来自 IP 摄像机的原始 H.264 流,它被打包在 RTP 帧中。我想将原始 H.264 数据放入一个文件中,以便我可以使用 ffmpeg 对其进行转换。 因此,当我想将数据写入原始 H.2
我需要将输出表导出为 *.sps(SPSS 语法)格式。 我使用的代码 80% 的时间都有效: Sub Print_CM_to_sps() Dim FSO As Object Set FSO =
我有一个大的 CSV 文件,它附带两个元数据描述文件。一个扩展名为 .sas,另一个扩展名为 .sps。打开它们,它们描述了 CSV 数据格式和类别。这些文件描述了数据格式和每列可能的类别。例如,值为
我有一台 AXIS IP 摄像机 (M1054),它通过 RTSP 发送 H264/RTP 流。 不幸的是,他们根本不发送 SPS 和 PPS NALU,他们只传输(分段的)编解码器切片。 我正在尝试
我是一名优秀的程序员,十分优秀!