- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
ffmpeg avformat_open_input()
需要流的文件名才能打开。
但是我的程序生成了自己的 SDP 文件,其中包含所有需要的信息到一个字符串中。
是否有任何类似的函数可以用于字符串而不是文件?因为我不想为此创建文件。
或者我必须为它创建自己的解析器?
最佳答案
来自俄罗斯 StackOverflow 的示例(非常感谢 Monah Tuk):
#include <iostream>
#include <vector>
#include <cassert>
extern "C" {#include <libavformat/avformat.h>}
using namespace std;
static const char* SDP_DATA = R"(
v=0
o=- 1376063087593 1 IN IP4 127.0.0.1
s=-
t=0 0
m=audio 50008 RTP/AVP 0
c=IN IP4 192.168.2.196
a=rtcp:50009 IN IP4 192.168.2.196
a=rtpmap:0 PCMU/8000
a=sendrecv
m=video 50010 RTP/AVP 120
c=IN IP4 192.168.2.196
a=rtcp:50011 IN IP4 192.168.2.196
a=rtpmap:120 VP8/90000
a=sendrecv
a=rtcp-fb:* nack
a=rtcp-fb:* ccm fir
)";
struct SdpOpaque
{
using Vector = std::vector<uint8_t>;
Vector data;
Vector::iterator pos;
};
int sdp_read(void *opaque, uint8_t *buf, int size)
{
assert(opaque);
assert(buf);
auto octx = static_cast<SdpOpaque*>(opaque);
if (octx->pos == octx->data.end()) {
return 0;
}
auto dist = static_cast<int>(std::distance(octx->pos, octx->data.end()));
auto count = std::min(size, dist);
std::copy(octx->pos, octx->pos + count, buf);
octx->pos += count;
return count;
}
int sdp_open(AVFormatContext **pctx, const char *data, AVDictionary **options)
{
assert(pctx);
*pctx = avformat_alloc_context();
assert(*pctx);
const size_t avioBufferSize = 4096;
auto avioBuffer = static_cast<uint8_t*>(av_malloc(avioBufferSize));
auto opaque = new SdpOpaque();
opaque->data = SdpOpaque::Vector(data, data + strlen(data));
opaque->pos = opaque->data.begin();
auto pbctx = avio_alloc_context(avioBuffer, avioBufferSize, 0, opaque, sdp_read, nullptr, nullptr);
assert(pbctx);
(*pctx)->pb = pbctx;
auto infmt = av_find_input_format("sdp");
return avformat_open_input(pctx, "memory.sdp", infmt, options);
}
void sdp_close(AVFormatContext **fctx)
{
assert(fctx);
auto ctx = *fctx;
// Opaque can be non-POD type, free it before and assign to null
auto opaque = static_cast<SdpOpaque*>(ctx->pb->opaque);
delete opaque;
ctx->pb->opaque = nullptr;
avio_close(ctx->pb);
avformat_close_input(fctx);
}
int main()
{
av_register_all();
avformat_network_init();
AVFormatContext *sdpctx = nullptr;
sdp_open(&sdpctx, SDP_DATA, nullptr);
av_dump_format(sdpctx, 0, "memory.sdp", 0);
// Copy settings to target context from SDP context:
/*
for (size_t i = 0; i < sdpctx->nb_streams; ++i) {
AVStream *st = avformat_new_stream(otherctx, nullptr);
st->id = i;
avcodec_copy_context(st->codec, sdpctx->streams[i]->codec);
st->time_base = sdpctx->streams[i]->time_base;
}
*/
sdp_close(&sdpctx);
return 0;
}
除了 std::copy
之外,它在 VS2013 中完全有效。
关于c++ - 带字符串输入的 ffmpeg avformat_open_input 模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132647/
抱歉,我不得不问这个问题,但我找不到对 avformat_open_input 的返回码的引用,也找不到任何人询问/回答我的问题。 在这个函数调用之后 err = avformat_open_inpu
尝试打开包含 的二进制文件时遇到问题原始音频数据 在 opus格式。当我尝试打开此文件时,库返回错误:未知输入格式:opus . 我怎样才能打开这个文件? 我需要打开它并将所有原始音频数据写入音频容器
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
我正在尝试使用 avformat_open_input 打开一个文件,即使该文件存在,它也会崩溃。 av_register_all(); AVFormatContext *avFormatContex
我正在关注 this在 C 中使用 FFmpeg 库的代码。FFmpeg 库的文档很少,很难理解每个函数的确切作用。 我理解代码(正在做什么)。但我不清楚。谁能帮帮我吗? Q1) 一个**struct
我的部分命令如下所示: ffmpeg -hide_banner -f avfoundation -framerate 30 -video_size 3840x2160 -c:v -pix_fmt
我正在尝试使用字典选项向函数 avformat_open_input 添加超时。 这是我的代码。 AVDictionary *dict = NULL; // "create" an empty dic
我想为 raw(LINEAR16,48000khz) 填写 ffmpeg.formatCtx使用 avformat_open_input() 的音频文件. 我试图通过自己的AVInputFormat
我在 iOS 项目中有一个调用 avformat_open_input() 的方法,它在模拟器中运行得很好,但是,当我尝试在设备上运行它时,它会挂起并停留在那里. 有没有人以前见过这个?非常感谢任何帮
我目前正在尝试使用 ffmpeg 的库为 SFML 编写自定义 SoundFileReader。我唯一可以与 avcodec 和 avformat 一起使用的是下面的类 InputStream,它是
我想解码互联网音频流,但我不想将数据写入磁盘,因此数据仅位于内存中。 但是当我想将数据解码为原始数据时,我必须初始化格式上下文,所以我需要使用 avformat_open_input。但是这些功能需要
我正在尝试对 RTP 流的视频播放器进行编程。我正在使用 Visual Studio 2010。执行 avformat_open_input 命令时会生成异常(ntdll.dll!774b70f4()
android 4.4 上的 FFMpeg 版本 2.1.4 给了我以下错误 10-21 18:13:33.191: E/FFMPEGCLIENT(2561): avformat_open_input
我正在尝试通过 Android NDK 打开现有的 Mp3 文件,但无法打开。 java private static String FILENAME = "/mnt/sdcard/My Audios
我正在尝试将 FFmpeg 移植到我的 NaCl 模块中。 到目前为止,我的模块链接了 ffmpeg 和 SDL 库。 它已经可以播放 YUV 格式的视频,直接加载到内存并复制到 YUVOverlay
avformat_open_input 遇到一个奇怪的问题,它失败了: Invalid data found when processing input 但这只发生在我尝试使用自定义 AVIOCont
我正在使用 this适用于 Android 的 FFMPEG 端口。我的目标是最终读取 RTSP 流。 我可以从本地文件(位于"/storage/emulated/0/bunny.mp4")打开流,使
我买了一台高清HDMI转UVC设备,它有HDMI视频源输入和UVC视频输出here . 我将它从笔记本电脑 A(输入源 HDMI)连接到笔记本电脑 B(输出 USB)。 我在笔记本电脑 B 上安装了
ffmpeg avformat_open_input() 需要流的文件名才能打开。 但是我的程序生成了自己的 SDP 文件,其中包含所有需要的信息到一个字符串中。 是否有任何类似的函数可以用于字符串而
我正在使用 Vitamio 构建一个 android 流播放器。 这是我的代码: mVideoView = (VideoView) findViewById(R.id.videoView);
我是一名优秀的程序员,十分优秀!