【问题标题】:Writing multithreaded video and audio packets with FFmpeg使用 FFmpeg 编写多线程视频和音频数据包
【发布时间】:2017-07-12 07:35:21
【问题描述】:

我找不到任何有关av_interleaved_write_frame 处理视频和音频数据包方式的信息。

我有来自 2 个线程的多个音频和视频数据包。每个线程调用write_video_framewrite_audio_frame,锁定互斥体,初始化 AVPacket 并将数据写入 .avi 文件。

AVCodecContext 和 AVFOrmatContext 的初始化没问题。

-- 编辑 1--

音频和视频来自外部来源(麦克风和摄像头),并被捕获为未经任何压缩的原始数据(即使是视频)。 我使用 h264 对视频进行编码,对音频 (PCM) 不进行压缩。

捕获的音频为:16 位、44100khz、立体声

拍摄的视频为 25FPS

问题:

1) 如果我一次写入多个视频数据包(比如说 25 个数据包/秒)和一个音频数据包/秒,会不会有问题。

答案:显然不是,只要 pts 和 dts 管理好,函数 av_interleaved_write_frame 应该能够管理那种数据

这意味着我每秒拨打av_interleaved_write_frame 25 次进行视频写作,而仅拨打 1 次进行音频写作。这可能是个问题吗?如果是我该如何处理这种情况?

2) 在这种情况下如何管理 pts 和 dts ?这似乎是我的应用程序中的一个问题,因为我无法正确呈现 .avi 文件。我可以对视频和音频使用实时时间戳吗?

回答:这里最好的做法是使用在捕获音频/视频时给出的时间戳作为此类应用程序的 pts 和 dts。所以这些不完全是实时时间戳(来自挂钟),而是媒体捕获时间戳。

感谢您的宝贵建议。

【问题讨论】:

    标签: c++ windows multithreading audio ffmpeg


    【解决方案1】:

    av_interleaved_write_frame 以这种方式写入 otput 数据包,以便它们正确交错(可能在内部对它们进行排队)。 “正确交错”取决于容器格式,但通常意味着输出文件中数据包的 DTS 标记是单调递增的。

    av_interleaved_write_frame 与大多数 FFmpeg API 一样,不应由具有相同 AVFormatContext 的两个线程同时调用。我假设您使用互斥锁来确保这一点。如果你这样做了,那么它是多线程应用程序还是现在都没有关系。

    如果我一次写入多个视频数据包(比如说 25 个数据包/秒)和一个音频数据包/秒,会不会有问题

    这通常不是问题,但大多数音频编解码器无法输出 1 秒长的音频数据包。您使用哪种编解码器?

    在这种情况下如何管理 pts 和 dts?我可以同时为视频和音频使用实时时间戳吗?

    与在单线程应用程序中的方式相同。 Dts 通常由 pts 的编解码器生成。 Pts 通常来自捕获设备/解码器以及相应的音频/视频数据。

    实时时间戳可能可以使用,但这实际上取决于您获取它们的方式和时间。请详细说明您到底要做什么。音频/视频数据来自哪里?

    【讨论】:

    • 我添加了一些关于视频和音频源的信息。我确实使用互斥锁来保证线程安全,而且效果很好。如上所述,我没有对音频使用任何压缩,我正在捕获 1 秒的数据包,这意味着每秒 176400 字节的数据。 av_interleaved_write_frame 使用的数据太多了吗?如果是这样,我应该如何处理这种情况?
    • 我明白了。 av_interleaved_write_frame一般可以处理这种数据包;也许 avi 格式/复用器在这方面有一些限制?可能不是。关于时间戳 - 如果您使用例如捕获 A/V DirectShow 然后它为您提供时间戳,您应该将它们用作 pts 源;只需确保它们具有相同的参考时间(即在同一时刻捕获的样本将具有相同的时间戳)。使用挂钟时间可能是个问题,因为它会导致时间戳出现大量抖动,除非得到补偿。
    • 感谢您的回答,这给了我一些想法,因为我在捕获时有时间戳,可用于 pts / dts。另一个问题是,当我将音频捕获为原始数据时,我可以直接使用av_interleaved_write_frame 还是必须使用 PCM_S16LE 对数据进行编码然后写入数据?
    • 您不必使用编解码器,但您需要正确设置复用器的流和每个 AVPacket。在 little-endian 机器上模拟 pcm16le 之类的编解码器几乎是微不足道的。
    猜你喜欢
    • 2018-12-22
    • 2017-05-05
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多