首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >利用MP4 AutoGen FFmpeg库同步音频/视频

利用MP4 AutoGen FFmpeg库同步音频/视频
EN

Stack Overflow用户
提问于 2016-07-04 23:54:04
回答 2查看 3K关注 0票数 1

我目前有问题,使我的音频和视频流保持同步。

这些是我正在使用的AVCodecContexts:

视频:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AVCodec* videoCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264)
AVCodecContext* videoCodecContext = ffmpeg.avcodec_alloc_context3(videoCodec);
videoCodecContext->bit_rate = 400000;
videoCodecContext->width = 1280;
videoCodecContext->height = 720;
videoCodecContext->gop_size = 12;
videoCodecContext->max_b_frames = 1;
videoCodecContext->pix_fmt = videoCodec->pix_fmts[0];
videoCodecContext->codec_id = videoCodec->id;
videoCodecContext->codec_type = videoCodec->type;
videoCodecContext->time_base = new AVRational
{
    num = 1,
    den = 30
};

关于音频:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AVCodec* audioCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_AAC)
AVCodecContext* audioCodecContext = ffmpeg.avcodec_alloc_context3(audioCodec);
audioCodecContext->bit_rate = 1280000;
audioCodecContext->sample_rate = 48000;
audioCodecContext->channels = 2;
audioCodecContext->channel_layout = ffmpeg.AV_CH_LAYOUT_STEREO;
audioCodecContext->frame_size = 1024;
audioCodecContext->sample_fmt = audioCodec->sample_fmts[0];
audioCodecContext->profile = ffmpeg.FF_PROFILE_AAC_LOW;
audioCodecContext->codec_id = audioCodec->id;
audioCodecContext->codec_type = audioCodec->type;

在编写视频帧时,我将PTS的位置设置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
outputFrame->pts = frameIndex;  // The current index of the image frame being written

然后使用avcodec_encode_video2()对框架进行编码。在此之后,我调用以下代码来设置时间戳:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ffmpeg.av_packet_rescale_ts(&packet, videoCodecContext->time_base, videoStream->time_base);

这个弹奏得很完美。

但是,当我对音频做同样的处理时,视频以慢动作播放,首先播放音频,然后在没有声音的情况下继续播放视频。

我在任何地方都找不到如何在MP4文件中为视频/音频设置pt/dts位置的例子。任何帮助的例子都是很棒的!

另外,我首先要写视频帧,然后(一旦它们都写好了)我就会写音频。我用评论中建议的调整值更新了这个问题。

我上传了一个测试视频,在这里显示我的结果:124

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-12 02:31:35

解决了问题。我增加了一个新的功能来设置视频/音频位置后,设置帧PTS位置。

视频只是通常的增量(每帧加1),而音频是按以下方式完成的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
outputFrame->pts = ffmpeg.av_rescale_q(m_audioFrameSampleIncrement, new AVRational { num = 1, den = 48000 }, m_audioCodecContext->time_base);

m_audioFrameSampleIncrement += outputFrame->nb_samples;

在帧被编码后,我调用我的新函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static void SetPacketProperties(ref AVPacket packet, AVCodecContext* codecContext, AVStream* stream)
{
    packet.pts = ffmpeg.av_rescale_q_rnd(packet.pts, codecContext->time_base, stream->time_base, AVRounding.AV_ROUND_NEAR_INF | AVRounding.AV_ROUND_PASS_MINMAX);
    packet.dts = ffmpeg.av_rescale_q_rnd(packet.dts, codecContext->time_base, stream->time_base, AVRounding.AV_ROUND_NEAR_INF | AVRounding.AV_ROUND_PASS_MINMAX);
    packet.duration = (int)ffmpeg.av_rescale_q(packet.duration, codecContext->time_base, stream->time_base);
    packet.stream_index = stream->index;
}
票数 1
EN

Stack Overflow用户

发布于 2016-07-06 10:01:20

PS:查看这篇关于带FFmpeg的A/V同步的文章/教程。如果下面没有的话可能会对你有帮助。

1)关于视音频时间戳的.

而不是使用当前的frameIndex作为时间戳,然后再使用重新标度。如果可能的话就跳过重放。

另一种方法是首先通过使用视频的帧每秒(FPS)来确保PTS值(在outputFrame->pts中)被正确创建。做这个..。

每个视频帧的:outputFrame->pts = (1000 / FPS) * frameIndex;

(对于30 FPS视频,帧1有0时间,到帧30“时钟”达到1秒。

因此,1000 / 30现在给每个视频帧一个33.333毫秒的表示间隔。当frameIndex为30时,我们可以说33.333 x 30 = 1000 m.secs (或1秒,确认每秒30帧)。

每个音频帧的:outputFrame->pts = ((1024 / 48000) * 1000) * frameIndex;

(由于48 the AAC帧的持续时间为21.333 m.secs,时间戳增加了该时间量。公式为:(1024 PCM / SampleRate) x 1000 ms/perSec,然后乘以帧索引)。

2)关于音频设置的.

位速率:

如果你的audioCodecContext->bit_rate = 64000;是48000赫兹(我想,你的位深是16位?)

尝试将96000128000作为最低起始值。

帧大小:

int AVCodecContext::frame_size的意思是“音频帧中每个频道的样本数”。

考虑到以上引用的Docs,并且MPEG AAC不做“每个通道”(因为两个L/R通道的数据包含在每个帧中)。每个AAC帧包含1024个PCM样本。

audioCodecContext->frame_size = 88200;的大小,您可以尝试= 1024;

配置文件:

我注意到你用MAIN作为AAC的配置文件。我习惯在视频里看到Low Complexity。我尝试了一些随机的MP4文件从不同的来源在我的硬盘,我找不到一个使用“主要”配置文件。作为最后的手段,测试“低复杂度”不会有什么影响。

尝试使用audioCodecContext->profile = ffmpeg.FF_PROFILE_AAC_LOW;

PS:检查这个可能的审咨委问题 (取决于您的FFmpeg版本)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38198052

复制
相关文章
03——FFmpeg分离音频视频
哈哈,期待已久,终于开始干活了,本期开始,我们就要玩转ffmpeg命令行了,今天,我们首先来看看如何分离音视频!
视界音你而不同
2020/04/10
5.7K0
NDK--利用FFmpeg进行音频解码
1.WAV编码 特点:音质非常好,大量软件都支持。 适用场合:多媒体开发的中间文件、保存音乐和音效素材。 2.MP3编码 特点:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。 适用场合:高比特率下对兼容性有要求的音乐欣赏。 3.AAC编码 特点:在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。 适用场合:128Kbit/s以下的音频编码,多用于视频中音频轨的编码。 4.Ogg编码 特点:可以用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。 适用场合:语音聊天的音频消息场景。
aruba
2020/07/02
6900
FFMPEG音频视频开发: VS2010+QT4.8.5引用FFMPEG库
QT版本: 4.8.5 (qt-win-opensource-4.8.5-vs2010.exe)
DS小龙哥
2022/01/12
5200
FFMPEG音频视频开发: VS2010+QT4.8.5引用FFMPEG库
通过WebAssembly在移动端解码H.265
随着音视频业务的快速发展,作为前端工程师,我们团队也逐步深入到音视频编解码领域,涉及到流媒体技术中的文本、图形、图像、音频和视频多种理论知识的学习,并有机会大规模应用到具体实践中。
LiveVideoStack
2019/07/01
7.3K0
通过WebAssembly在移动端解码H.265
玩转音频、视频的利器:FFmpeg
腾讯云开发者社区
2017/06/13
6.5K0
C# 使用ffmpeg视频提取音频和音频转码
在工作中我们需要对手机的录音再网页上播放,手机录音文件格式有以下几种:amr|mp3|m4a|wav|wma|FLAC|AAC|MMF|M4R|OGG|MP2|WV,需要对其转换为网页能播放的格式mp3。我们可以使用ffmpeg.exe进行处理。
爱上歆随懿恫
2022/08/10
3K0
C# 使用ffmpeg视频提取音频和音频转码
FFMPEG音视频开发: Linux下采集音频(alsa-lib库)与视频(V4L2框架)实时同步编码保存为MP4文件(视频录制)
参考这篇文章: https://blog.csdn.net/xiaolong1126626497/article/details/104919095
DS小龙哥
2022/01/12
2.2K0
FFMPEG音视频开发:  Linux下采集音频(alsa-lib库)与视频(V4L2框架)实时同步编码保存为MP4文件(视频录制)
FFMPEG音频视频开发: 使用FFMPEG给视频帧添加水印
参考链接: https://blog.csdn.net/xiaolong1126626497/article/details/104919095
DS小龙哥
2022/01/12
2K0
FFMPEG音频视频开发: 使用FFMPEG给视频帧添加水印
音频帧、视频帧及其同步
音频帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单的认为一帧就是编码后的一副图像,而音频帧会因编码格式的不同而不同,如 PCM 音频流可以直接进行播放,下面以 MPEG 音频帧格式为例介绍音频帧。
刘盼
2021/02/08
4.2K0
Android FFmpeg系列02--音视频基础
软编(解)的时候CPU负载重,性能比硬编(解)低,但是通用性更好;硬编(解)性能高但是兼容性问题比较突出,特别是在Android平台,碎片化严重,MediaCodec的坑也是不少
雪月清
2022/09/08
1K0
FFmpeg 使用教程
默认的编译会生成4个可执行文件和8个静态库。可执行文件包括用于转码、推流、Dump媒体文件的ffmpeg、用于播放媒体文件的ffplay、
派大星在吗
2021/12/06
1.5K0
使用FFmpeg将视频转换成音频
整理移动硬盘,发现了一段2017年,在西安回民街青旅,素昧平生的三人闲谈,当时为视频录制,时长近一小时40分钟,超过10G.
fliter
2023/06/18
6110
使用FFmpeg将视频转换成音频
FFmpeg常见的音视频处理方法
FFmpeg可使用众多参数,参数内容会根据ffmpeg版本而有差异 这里不再赘述,使用前建议先参考参数及编解码器的叙述。此外参数明细可用ffmpeg -h显示;编解码器名称等明细可用ffmpeg -formats显示。一些常用的参数也可以通过网上查找相关资料获取。
cohen
2020/12/25
3K0
FFmpeg常见的音视频处理方法
Nginx流媒体服务器搭建「建议收藏」
Nginx安装方面可以看我的另一篇文章Nginx笔记 注意各个组件版本,可能会产生一些版本冲突
全栈程序员站长
2022/11/01
3.1K0
FFmpeg 工具:音视频开发都用它,快@你兄弟来看丨音视频工具
(本文基本逻辑:ffmpeg 常用命令介绍 → ffplay 常用命令介绍 → ffprobe 常用命令介绍)
关键帧
2022/06/13
2.2K0
FFmpeg 工具:音视频开发都用它,快@你兄弟来看丨音视频工具
FFMPEG音频视频开发: 命令行方式给视频添加音频数据
ubuntu系统下编译安装ffmpeg: https://blog.csdn.net/xiaolong1126626497/article/details/104919095
DS小龙哥
2022/01/12
8440
音视频开发常用工具
我们在进行音视频开发过程中不可避免的需要使用一些工具进行协助开发,本文重点讲解音视频开发过程中常用工具以及常用功能。
Gnep@97
2023/09/03
1.1K0
音视频开发常用工具
使用ffmpeg提取视频文件中的音频
最近需要要提取视频音轨,结果一搜索发现好麻烦啊,还要装个会声会影,装个PR?我就觉得至于吗?我就提取一个音频而已啊。突然能想到了ffmpeg这玩意好像可干这个事情,看了下确实可以。正好博客好久没更新了,发出来凑个数吧,也算是一个备忘。
Balliol Chen
2022/04/22
4K0
手把手帮你视频转文本(1-视频转音频)
我们这里实现的是将 《托马斯和他的朋友们第18季》20集MP4视频,最终转换为一个word故事文档:
技术路漫漫
2020/06/10
2.4K0
手把手帮你视频转文本(1-视频转音频)
音视频初探
码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。
甜哈哈
2021/07/01
1.6K0
音视频初探

相似问题

FFMpeg将AVI转换为MP4 -音频/视频脱离同步

28

ffmpeg视频-串联-音频/视频轨道同步

13

利用PTS同步FFMPEG视频帧

10

FFMPEG Concat视频、音频同步问题

23

ffmpeg音频和视频同步错误

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文