- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 SDL2 和 FFmpeg 播放 mp4 文件中的音频,并使用 SDL_QueueAudio
似乎比设置回调容易得多。
我找到的所有解决方案,无论是在这里还是在 dranger tutorials , 已弃用或使用回调。我尝试使用 ffmpeg 和 sdl 标签(没有很多)浏览所有问题,但无济于事。我尝试将 dranger 教程转换为使用未弃用的调用,但遇到了同样的问题。我正在使用 C、FFmpeg 4.1 和 SDL 2.0.9。
这是 AVCodecContext 和 AVCodec 的设置:
int audioStream = -1;
for (i = 0; i < formatContext->nb_streams; i++) {
if (audioStream < 0 && formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
audioStream = i;
}
}
AVCodecParameters *audioParams = formatContext->streams[audioStream]->codecpar;
AVCodec *audioCodec = avcodec_find_decoder(audioParams->codec_id);
AVCodecContext *audioCodecCtx = avcodec_alloc_context3(NULL);
avcodec_open2(audioCodecCtx, audioCodec, NULL);
SDL_Init(SDL_INIT_AUDIO)
SDL_AudioSpec desired, obtained;
SDL_zero(desired);
SDL_zero(obtained);
desired.freq = audioCodecCtx->sample_rate;
desired.format = AUDIO_F32SYS;
desired.channels = audioCodecCtx->channels;
desired.silence = 0;
desired.samples = AUDIO_BUFFER_SIZE;
SDL_AudioDeviceID audioDevice = SDL_OpenAudioDevice(NULL, 0, &desired, &obtained, SDL_AUDIO_ALLOW_ANY_CHANGE);
while (av_read_frame(formatContext, &packet) >= 0) {
if (packet.stream_index == audioStream) {
if (!avcodec_send_packet(audioCodecCtx, &packet)) {
avcodec_receive_frame(audioCodecCtx, audioFrame);
SDL_QueueAudio(audioDevice, audioFrame->data[0], audioFrame->linesize[0]);
}
}
}
audioFrame.data[0]
,我认为这意味着我只播放一个 channel 。我试过排队
audioFrame.data[1]
它也有数据,但它没有解决问题。我是正确的,如果是,我如何播放两个 channel ?
最佳答案
回答这个问题可能为时已晚,但我遇到了同样的问题,现在我找到了适合我的解决方案,所以我发布了这个。
这里的问题可能是,FFmpeg 解码的音频格式是 AV_SAMPLE_FMT_FLTP (float planer) 格式,其中 channel 单独存储,如 frame->data[0]
和 frame->data[1]
.
我们需要使用 swr_convert() 将其转换为将这些 channel 打包成一个数组的格式
这是我的解决方案。
SwrContext *resampler = swr_alloc_set_opts(NULL,
audioCodecCtx->channel_layout,
AV_SAMPLE_FMT_S16,
44100,
audioCodecCtx->channel_layout,
audioCodecCtx->sample_fmt,
audioCodecCtx->sample_rate,
0,
NULL);
swr_init(resampler);
SDL_AudioDeviceID dev;
SDL_AudioSpec want, have;
SDL_zero(want);
SDL_zero(have);
want.freq = 44100;
want.channels = audioCodecCtx->channels;
want.format = AUDIO_S16SYS;
dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0);
SDL_PauseAudioDevice(dev, 0);
最后是解码循环
int ret = 0;
AVPacket *packet = av_packet_alloc();
AVFrame *frame = av_frame_alloc();
AVFrame *audioframe = av_frame_alloc();
while (true){
ret = av_read_frame(formatContext, packet);
if (ret < 0) break;
AVStream *stream = formatContext->streams[packet->stream_index];
if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){
ret = avcodec_send_packet(audioCodecCtx, packet);
while (ret >= 0){
ret = avcodec_receive_frame(audioCodecCtx, frame);
if (ret >= 0){
int dst_samples = frame->channels * av_rescale_rnd(
swr_get_delay(resampler, frame->sample_rate)
+ frame->nb_samples,
44100,
frame->sample_rate,
AV_ROUND_UP);
uint8_t *audiobuf = NULL;
ret = av_samples_alloc(&audiobuf,
NULL,
1,
dst_samples,
AV_SAMPLE_FMT_S16,
1);
dst_samples = frame->channels * swr_convert(
resampler,
&audiobuf,
dst_samples,
(const uint8_t**) frame->data,
frame->nb_samples);
ret = av_samples_fill_arrays(audioframe->data,
audioframe->linesize,
audiobuf,
1,
dst_samples,
AV_SAMPLE_FMT_S16,
1);
SDL_QueueAudio(dev,
audioframe->data[0],
audioframe->linesize[0]);
}
}
}
}
关于ffmpeg - 使用 FFmpeg 和 SDL_QueueAudio 播放视频中的声音会产生高音调的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55438697/
我正在寻找一种方法来创建根据价格选择我的产品的过滤器(选择下拉菜单)。 我知道这样的查询是完全可能的: SELECT * FROM products ORDER BY price ASC SELECT
函数参数中或显示尺寸时(高度,宽度)的顺序是否有约定? 最佳答案 我不知道大量的语言,但我使用过的语言(宽度,高度)。它更适合沿着 (x, y) 坐标线。 关于language-agnostic -
在我的表单中,我让用户输入房间的长度高度和宽度以获得 m2、m3 和瓦特的计算值。但是用户也应该能够直接输入 height 和 m2 来获取值。我尝试了很多语法,但 if else 不能正常工作。我知
我在 Elasticsearch 中创建了一个索引,看起来像 {"amazingdocs":{"aliases":{},"mappings":{"properties":{"Adj Close":{"
我有以下功能,我需要清除数据库中的所有图片列并移动到文件系统。当我一次性完成这一切时,内存太多并且会崩溃。我切换到递归函数并执行 20 次写入和批量操作。 我需要为大约 6 个表执行此操作。我的 Re
我正在编写一个函数来计算 PI 的值,并将其作为 double 值返回。到目前为止,一切都很好。但是一旦函数到达小数点后14位,它就不能再保存了。我假设这是因为 double 有限。我应该怎么做才能继
2020年是中国CDN行业从98年诞生到今天快速发展的第二十四年,相关数据显示,全国感知网速持续上扬,达到了3.29兆/秒,标志着在宽带中国的政策指导下,中国的网速水平正在大步赶上世界发达国家的水平
在 aerospike 集合中,我们有四个 bin userId、adId、timestamp、eventype,主键是 userId:timestamp。在 userId 上创建二级索引以获取特定用
$('#container').highcharts('Map', { title : { text : 'Highmaps basic demo'
有没有办法显示自定义宽度/高度的YouTube视频? 最佳答案 在YouTube网站上的this link中: You can resize the player by editing the obj
我使用 Highcharts ,我想在 Highcharts 状态下悬停时制作动态不同的颜色。 正如你可以看到不同的颜色,这就是我做的 var usMapChart , data = [] ; va
在所有节点上运行 tpstats 后。我看到很多节点都有大量的 ALL TIME BLOCKED NTR。我们有一个 4 节点集群,NTR ALL TIME BLOCKED 的值为: 节点 1:239
我发现 APC 上存在大量碎片 (>80%),但实际上性能似乎相当不错。我有 read another post这建议在 wordpress/w3tc 中禁用对象缓存,但我想知道减少碎片是否比首先缓存
对于我的脚本类(class),我们必须制作更高/更低的游戏。到目前为止,这是我的代码: import random seedVal = int(input("What seed should be u
我发现 APC 上存在大量碎片 (>80%),但实际上性能似乎相当不错。我有 read another post这建议在 wordpress/w3tc 中禁用对象缓存,但我想知道减少碎片是否比首先缓存
对于我的脚本类(class),我们必须制作更高/更低的游戏。到目前为止,这是我的代码: import random seedVal = int(input("What seed should be u
我已经 seen >2 字节的 unicode 代码点,如 U+10000 可以成对编写,如 \uD800\uDC00。它们似乎以半字节 d 开头,但我只注意到了这一点。 这个 split Actio
有人可以帮我理解为什么我的饼图百分比计算不正确吗?看截图: 根据我的计算,如 RHS 上所示,支出百分比应为 24.73%。传递给 Highcharts 的值如下:- 花费:204827099.36-
我阅读了有关该问题的所有答案,但我还没有找到任何解决方案。 我有一个应用程序,由我的 api 服务器提供。 Wildfly 8.1 和 Mysql 5.6。当查看时间到来时(Wildfly 服务器连接
我正在用选定的项目创建圆形导航。当用户单击任何项目时,它将移动到定义的特定点。一切都很好,除了当你继续点击项目时,当动画表现不同并且项目在 360 度圆中移动并且它被重置直到你重复场景时,我希望它
我是一名优秀的程序员,十分优秀!