- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不能使用 Fraunhofer 获得专利的任何 mp3 代码,因此没有编码器或解码器(例如 ffmpeg、lame、MAD 等),而且它太大了。
我在 Windows 上执行此操作,但 DirectShow 的 IMediaDet 似乎随着时间的推移变慢,调用它几百次使我的系统陷入爬行,甚至重新使用相同的接口(interface)对象并且只是输入文件名并获取持续时间!
那么,是否有一些代码可以使用 C/C++ 读取 VBR 文件并获取持续时间?
这里有另一篇文章用 C++ 做 CBR,但是代码做了很多假设,当然不适用于 VBR。
最佳答案
大多数 MP3 文件都有一个 ID3 header .解码并获得持续时间并不难。
这里有一些非常基本和丑陋的代码来说明该技术。
#include <iostream>
#include <iomanip>
size_t GetMP3Duration(const std::string sFileName);
int main(int argc, char* argv[])
{
try
{
size_t nLen = GetMP3Duration(argv[1]);
if (nLen==0)
{
std::cout << "Not Found" << std::endl;
}
else
{
std::cout << nLen << " miliseconds" << std::endl;
std::cout << nLen/60000 << ":";
nLen %= 60000;
std::cout << nLen/1000 << ".";
std::cout << std::setw(3) << std::setfill('0') << nLen%1000 << std::endl;
}
}
catch (std::exception &e)
{
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}
#include <cstring>
#include <vector>
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstdlib>
unsigned DecodeMP3SafeInt(unsigned nVal)
{
// nVal has 4 bytes (8-bits each)
// - discard most significant bit from each byte
// - reverse byte order
// - concatenate the 4 * 7-bit nibbles into a 24-bit size.
unsigned char *pValParts = reinterpret_cast<unsigned char *>(&nVal);
return (pValParts[3] & 0x7F) |
((pValParts[2] & 0x7F) << 7) |
((pValParts[1] & 0x7F) << 14) |
((pValParts[0] & 0x7F) << 21);
}
#pragma pack(1)
struct MP3Hdr {
char tag[3];
unsigned char maj_ver;
unsigned char min_ver;
unsigned char flags;
unsigned int size;
};
struct MP3ExtHdr {
unsigned int size;
unsigned char num_flag_bytes;
unsigned char extended_flags;
};
struct MP3FrameHdr {
char frame_id[4];
unsigned size;
unsigned char flags[2];
};
#pragma pack()
size_t GetMP3Duration(const std::string sFileName)
{
std::ifstream fin(sFileName.c_str(), std::ifstream::binary);
if (!fin)
throw std::invalid_argument("Cannot open file");
// Read Header
MP3Hdr hdr = { 0 };
fin.read(reinterpret_cast<char *>(&hdr), sizeof(hdr));
if (!fin.good())
throw std::invalid_argument("Error reading file");
if (0 != ::memcmp(hdr.tag, "ID3", 3))
throw std::invalid_argument("Not an MP3 File");
// Read extended header, if present
if (0 != (hdr.flags&0x40))
{
fin.seekg(sizeof(MP3ExtHdr), std::ifstream::cur);
if (!fin.good())
throw std::invalid_argument("Error reading file");
}
// read a chunk of file.
const size_t nDefaultSize(2048);
std::vector<char> vBuff(nDefaultSize);
fin.read(&vBuff[0], vBuff.size());
size_t nSize = fin.gcount();
if (!nSize)
throw std::invalid_argument("Error reading file");
vBuff.resize(nSize);
size_t nUsed = 0;
while (nSize-nUsed > sizeof(MP3FrameHdr))
{
MP3FrameHdr *pFrame = reinterpret_cast<MP3FrameHdr *>(&vBuff[nUsed]);
nUsed += sizeof(MP3FrameHdr);
size_t nDataLen = DecodeMP3SafeInt(pFrame->size);
if (nDataLen > (nSize-nUsed))
throw std::invalid_argument("Corrupt file");
if (!::isupper(pFrame->flags[0])) // past end of tags
return 0;
if (0 == ::memcmp(pFrame->frame_id, "TLEN", 4))
{
// skip an int
nUsed += sizeof(int);
// data is next
return atol(&vBuff[nUsed]);
}
else
{
nUsed += nDataLen;
}
}
return 0;
}
关于c++ - 如何使用非常小的库或 native 代码 c/c++ 获取 MP3 文件(CBR 或 VBR)的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3505575/
这是关于将视频实时流式传输到 STEAM... 使用 ffmpeg 我有这个命令 ffmpeg -re -i file-from-webcam.webm -deinterlace -c:v libx2
我正在尝试将“Windows Media Audio Standard”DMO 编解码器配置为以单 channel 、恒定比特率模式 (CBR) 进行压缩。不幸的是,我在 MSDN 文档中找不到如何将
我想用 FFMPEG 转换 mp4 格式的视频,同时保持源视频的比特率(CBR 模式)和质量, 我尝试了一些在这里找到的命令: https://trac.ffmpeg.org/wiki/Encode/
输出应该是: - 2,5 Mbit/s CBR H.264/mpeg4 - 音频 128kbit/s 联合立体声 mpeg2 我最后使用的命令看起来像这样,并且流不是 CBR。 ffmpeg.ex
我遇到了这个奇怪的问题,一旦我将 CBR 添加到我的流程中,它就会突然停止工作,即使一切似乎都正确设置。 我想要做的是使用 JIRA 连接器从我的 JIRA 服务器获取数据。然后我使用这些数据通过一个
我有以下 POJO: public class MyPOJO { private Fizz fizz; private Buzz buzz; // ctor, getters,
我有超过 400 个 CBR 文件,需要删除每个文件中包含的第一个图像,其文件名的格式为 XXX-000a.gif,其中 XXX 与包含的 CBR 文件的名称 XXX.cbr 匹配。我将如何在 Pyt
我尝试使用 FFMPEG 库将比特率模式从 VBR 转换为 CBR,但比特率模式无法改变。 我的命令行: ffmpeg -i -f mpegts -acodec libmp3lame -ar 480
我尝试使用 FFProbe 的命令,但不足以确定音频是 CBR 还是 VBR。ffprobe -v error -show_format -show_streams 123_1429602551009
我正在努力在一个 UDP 输出 (MPTS) 中混合几个 UDP 输入(来自文件的 SPTS)。 当我使用以下命令时 ffmpeg -thread_queue_size 2048 -i "udp://
我希望在 iOS6 中集成打开/查看 CBZ/CBR 文件(像 UIWebView 这样读取 PDF 文件的简单查看器也可以)。 是否有任何库(商业或免费)可用于打开这些文件类型? 提前致谢 最佳答案
我正在尝试使用 ffmpeg 将源 VBR SPTS MPEG-2 TS 文件转换为 CBR。我正在使用的代码如下: #!/bin/bash pkill ffmpeg ffmpeg \
我需要转码一些视频以便将它们与 Mpeg-dash 一起使用,对于比特率,我使用可变比特率 (VBR) 或恒定比特率 (CBR)。 它们中的哪一个与 Mpeg-dash 配合得更好? 最佳答案 两者各
我正在尝试将带有 ffmpeg 的视频编码为具有恒定比特率的 H.264(通过 libx264 库)。我知道,我知道,VBR 通常是首选,但对于这个特定的工作,我需要使用 CBR(只要它每秒这么多千字
我曾经使用 ffmpeg 在服务器端计算 MP3 文件的持续时间 - 这似乎工作正常。今天我发现有些计算是错误的。不知何故,由于某种原因,ffmpeg 会错误计算持续时间,而且它似乎只发生在可变比特率
我有一个正在路由 Order 实例的 Camel 路由: from("direct:start") .choice() .when(order.getProduct() ==
我知道有许多实用程序可以告诉我 MP3 文件的比特率,但我从未见过可以告诉我 MP3 文件是否为 VBR(可变比特率 - 比特率在文件内波动)的实用程序) 或 CBR(恒定比特率 - 比特率在文件中保
第一次发帖,大家好!首先让我说我是编程方面的菜鸟。我了解非常基本的东西,但是在检查退出代码或适当的术语时,我不知所措。显然我的 searchfoo 在这方面真的很弱,我想这是一个术语问题。 预先感谢您
我不能使用 Fraunhofer 获得专利的任何 mp3 代码,因此没有编码器或解码器(例如 ffmpeg、lame、MAD 等),而且它太大了。 我在 Windows 上执行此操作,但 Direct
我是一名优秀的程序员,十分优秀!