- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将多个 ogg vorbis 文件连接成一个。
我知道理论上应该足够了:
cat 1.ogg 2.ogg > combined.ogg
#include <ogg/ogg.h>
#include <vorbis/codec.h>
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <time.h>
int read_page(int fd, ogg_sync_state *state, ogg_page *page)
{
int ret;
ssize_t bytes;
while(ogg_sync_pageout(state, page) != 1) {
char *buffer = ogg_sync_buffer(state, 4096);
if (buffer == NULL) {
fprintf(stderr, "ogg_sync_buffer failed\n");
return -1;
}
bytes = read(fd, buffer, 4096);
if (bytes == 0) {
return -1;
}
ret = ogg_sync_wrote(state, bytes);
if (ret != 0) {
fprintf(stderr, "ogg_sync_wrote failed\n");
return -1;
}
}
return 0;
}
int main(int argc, char *argv[])
{
int ret;
ogg_sync_state state;
ogg_page page;
int serial;
ogg_stream_state sstate;
bool found_bos;
ogg_packet packet;
int fd;
int i;
vorbis_info info;
vorbis_comment comment;
int vorbis_header_read;
ssize_t bytes;
ogg_stream_state out_stream;
ogg_page out_page;
if (argc < 2) {
fprintf(stderr, "usage: %s file.ogg\n", argv[0]);
return 1;
}
srand(time(NULL));
ogg_stream_init(&out_stream, rand());
// go through all input files
for (i = 1; i < argc; i++) {
vorbis_header_read = 0;
found_bos = false;
fd = open(argv[i], O_RDONLY);
if (fd < 0) {
fprintf(stderr, "cannot open %s\n", argv[1]);
return 1;
}
ret = ogg_sync_init(&state);
if (ret != 0) {
fprintf(stderr, "ogg_sync_init failed\n");
return 1;
}
vorbis_info_init(&info);
vorbis_comment_init(&comment);
// go through all ogg pages
while (read_page(fd, &state, &page) == 0) {
serial = ogg_page_serialno(&page);
if (ogg_page_bos(&page)) {
if (found_bos) {
fprintf(stderr, "cannot handle more than one stream\n");
return 1;
}
ret = ogg_stream_init(&sstate, serial);
if (ret != 0) {
fprintf(stderr, "ogg_stream_init failed\n");
return 1;
}
found_bos = true;
}
if (!found_bos) {
fprintf(stderr, "cannot continue without bos\n");
return 1;
}
ret = ogg_stream_pagein(&sstate, &page);
if (ret != 0) {
fprintf(stderr, "ogg_stream_pagein failed\n");
return 1;
}
// if this is the last page, then only write it if we are in the
// last file
if (ogg_page_eos(&page) && i != argc - 1) {
continue;
}
// go through all (hopefully vorbis) packets
while((ret = ogg_stream_packetout(&sstate, &packet)) != 0) {
if (ret != 1) {
fprintf(stderr, "ogg_stream_packetout failed\n");
return 1;
}
// test if this stream is vorbis
if (vorbis_header_read == 0) {
ret = vorbis_synthesis_idheader(&packet);
if (ret == 0) {
fprintf(stderr, "stream is not vorbis\n");
return 1;
}
}
// read exactly three vorbis headers
if (vorbis_header_read < 3) {
ret = vorbis_synthesis_headerin(&info, &comment, &packet);
if (ret != 0) {
fprintf(stderr, "vorbis_synthesis_headerin failed\n");
return 1;
}
// if this is the first file, copy the header packet to the
// output
if (i == 1) {
ret = ogg_stream_packetin(&out_stream, &packet);
if (ret != 0) {
fprintf(stderr, "ogg_stream_packetin failed\n");
return 1;
}
}
vorbis_header_read++;
continue;
}
// if this is the first file, write a page to the output
if (vorbis_header_read == 3 && i == 1) {
while ((ret = ogg_stream_flush(&out_stream, &out_page)) != 0) {
bytes = write(STDOUT_FILENO, out_page.header, out_page.header_len);
if (bytes != out_page.header_len) {
fprintf(stderr, "write failed\n");
return 1;
}
bytes = write(STDOUT_FILENO, out_page.body, out_page.body_len);
if (bytes != out_page.body_len) {
fprintf(stderr, "write failed\n");
return 1;
}
}
vorbis_header_read++;
}
ogg_stream_packetin(&out_stream, &packet);
do {
ret = ogg_stream_pageout(&out_stream, &out_page);
if (ret == 0) break;
bytes = write(STDOUT_FILENO, out_page.header, out_page.header_len);
if (bytes != out_page.header_len) {
fprintf(stderr, "write failed\n");
return 1;
}
bytes = write(STDOUT_FILENO, out_page.body, out_page.body_len);
if (bytes != out_page.body_len) {
fprintf(stderr, "write failed\n");
return 1;
}
} while (!ogg_page_eos(&out_page));
}
}
vorbis_info_clear(&info);
vorbis_comment_clear(&comment);
ret = ogg_sync_clear(&state);
if (ret != 0) {
fprintf(stderr, "ogg_sync_clear failed\n");
return 1;
}
ret = ogg_stream_clear(&sstate);
if (ret != 0) {
fprintf(stderr, "ogg_stream_clear failed\n");
return 1;
}
close(fd);
}
ogg_stream_clear(&out_stream);
return 0;
}
最佳答案
这是一个有趣的... :)
如果你能承受文件之间几毫秒的静默/倾斜,只需在两个流之间放置几个静默数据包(我必须检查每个数据包中确切位模式的规范,但这应该不难以确定您是否可以访问解码器的源代码)。
如果您负担不起静音/歪斜,您可能需要重新编码,因为唯一的其他选择是旋转压缩数据以更改波形连接部分的斜率......
编辑
另一种选择是在文件连接点对 PCM 数据应用平滑算法。这并不容易做到,但其想法是您希望波形在文件之间“平滑”。这就是我所拥有的......
编辑 2
为了清楚起见,假设源文件使用相同的参数,问题的示例代码几乎可以完美运行。它缺少的一件事是一种防止接缝被听到的方法。我建议放入几个无声包可以处理它,但对于那些负担不起的人,可以(作为纯粹的猜测)考虑将接缝周围两个包的地板上的乘数减少 1,以使接缝不太明显。
关于audio - 如何无损连接 ogg vorbis 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27980960/
我正在使用 libogg 和 libogg,我已成功将这些库添加到我的 iPhone xCode 项目并使用 Speex 对我的声音进行编码。问题是我不知道如何用 ogg 打包这些音频数据包。有人知道
我正在使用 libogg 和 libogg,我已成功将这些库添加到我的 iPhone xCode 项目并使用 Speex 对我的声音进行编码。问题是我不知道如何用 ogg 打包这些音频数据包。有人知道
我正在使用 Ogg Vorbis SPI作为解码 .ogg 文件的一种方式。 我用于加载 .ogg 文件并转换为 PCM 的代码片段与文档中建议的代码片段没有太大的不同: // The streams
您好,我一直在尝试使用本教程安装带有一些库的 FFmpeg https://trac.ffmpeg.org/wiki/CompilationGuide/Centos?version=85 使用此命令安
我正在尝试更改我的视频的帧速率。下面是示例输入和输出。我自己构建了 ffmpeg,我很确定我错过了正确的解码器/解复用器,但我不知道我需要什么。我认为 --enable-libtheora 足以启用多
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我有一个名为setSound()的方法,该方法设置队列并向其中添加轨道,然后播放。我在simpleInitGame()中调用该方法。但是没有声音播放,eclipse中的控制台说: Mar 13, 20
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
最近我试图了解如何ogg vorbis在里面工作,所以我为 ogg vorbis 编写了简单的编码器/解码器.现在我试图了解所有互联网 ogg 广播电台是如何工作的。我不明白的事情:如果您需要处理所有
有时音乐甚至没有开始播放,但是当开始播放时,它会在几秒钟后停止。文件长 2 分钟。我真的不知道是什么问题。 @Override public void onCreate(Bundle savedIns
当我看到 http://www.vorbis.com/music/Hydrate-Kenny_Beltrey.ogg 时,我感到非常惊讶链接没有给我下载选项,但有一个播放器不是 flash 播放音频。
我尝试使用标签音频。将 mp3 转换为 ogg 使用 ffmpeg -i "123.mp3" "1234.ogg" .ogg 的服务器响应内容类型,例如 video/ogg。我尝试了内容类型的 au
现在我正在制作一个服务器,用 HTML 显示视频。我尝试在我的计算机上使用 ..mp4 和 .ogg 视频,效果非常好。但是当我尝试使用移动设备时,只显示 .mp4,而 .ogg 没有显示。移动设备无
我正在尝试将章节添加到包含 vorbis 音频的 ogg 文件中。 来自 this link我复制了以下 ffmpeg 命令。 ffmpeg -threads auto -y -i in.ogg -i
如果我将带有专辑封面的音频文件转换为: ffmpeg -i sample1.flac -ar 48000 -vn -c:a libvorbis -b:a 320k sample1.ogg 我的 sam
回答问题 "How-to make a silent mp3 or wav-file" on ubuntuforums.org FakeOutdoorsman 提供了以下配方: Another met
我正在尝试从浏览器捕获用户的音频输入。我已经用 WAV 完成了,但是文件真的很大。我的一个 friend 告诉我,OGG 文件要小得多。 有谁知道如何将WAV转换为OGG? 我也有原始数据缓冲区,我真
是否有一个模块支持在 Windows 上的 Python 2.6 中播放 Ogg/Speex(不是 Ogg/Vorbis)编码文件的音频? 最佳答案 到目前为止,VLC Python 绑定(bind)
我有三个声音文件:sound1.ogg,sound2.ogg和sound3.ogg。每个文件的长度都是几秒钟,并存储在我项目的/res/raw文件夹中。 我希望它们在我的main_activity上的
我正在尝试从远程服务器获取ogg音频文件,并将播放器呈现给用户。我正在使用下面的代码。 这导致没有输出。但是检查代码可以发现音频标签在容器中: 但是,它在Firefox的检查器中显示为灰色。 DOM
我是一名优秀的程序员,十分优秀!