我发现很多关于使用ffmpeg创建DVD菜单的问题,但我没有发现任何关于以编程方式访问DVD结构信息的问题.当我使用libav(或FFmpeg)库时,我可以打开DVD映像(iso文件)并访问视频,音频和字幕流.但我找不到任何API.
我可以使用VLC播放器(以及libvlc库)播放视频和查找信息.但我需要在程序上对音频和字幕流进行一些处理.我不想使用像SmartRipper这样的工具拆分VOB,然后才进行处理.
libav(ffmpeg)是否包含用于处理DVD菜单的任何API?如果没有,您能否推荐任何其他库,可用于获取有关标题(章节)开始和结束时间的信息,一帧(样本,AVPacket)准确度?
我听说过libdvdnav库,但我不知道它是否适合我.我是libav和DVD格式内部的新手.
从维基,我读到了
FFmpeg是一个自由软件项目,可生成用于处理多媒体数据的库和程序.FFmpeg最值得注意的部分是libavcodec,一个由其他几个项目使用的音频/视频编解码器库,libavformat,音频/视频容器mux和demux库,以及用于转码多媒体文件的ffmpeg命令行程序.
那么ffmpeg是avcodec的包装器?我经常听到人们使用ffmpeg用x264编码视频.那么ffmpeg也是x264的包装器?
它们有什么关系?
我想首先解码MP3音频文件,然后增加音频的音量,然后再将其编码为新的MP3文件.我想为此使用libavformat或libavcodec.你能帮我解决这个问题吗?任何例子?
我有项目(ASP.NET Core,在 Linux 上),其中有几个任务与视频转换和从视频文件中提取帧有关。
我考虑了两种可能的选择:
ffmpeg控制台实用程序P/Invoke与libavcodec图书馆和其他人,其ffmpeg用途第二种选择更难,可能非常不切实际,因为它提醒我开发新的包装器/库,而不是使用现成的产品。
我已经完成了谷歌搜索,但没有针对 Linux 平台上的 C#/ASP.NET Core 做好的项目。有一些适用于 C++ 和 Python,但不适用于 Linux/.NET Core 上的 C#。
我决定看第一个选项,我认为它会更容易和实用。但是,也有一些薄弱的地方,这会产生很多问题。我们理解(我想),使用第一个选项,最终开发人员应使用进程分叉。因此,进程空闲和其他可能的问题可能存在问题......
我问的是你的做法,因为这是我第一次在 Linux 平台上使用 C# 进行视频转换/采样。我已经在 Windows 平台上使用了Expression Encoder .NET 库,但它是另一回事,现在没有任何意义。
可能还有其他选项,我目前看不到。我不喜欢第一个选项,因为可能存在未处理的异常,因为ffmpeg这样的角色成为 ASP.NET Core 后端的黑匣子。
而不是调用av_register_all(),是否有一个选择使用单个解码器的例子?我想我必须调用avcodec_register(),av_register_codec_parser()等...
问题是,应该调用哪些函数,因为如果我不使用av_register_all(),av_open_input_file()将失败-2.
我正在尝试捕获相机输出并使用 libavcodec 制作视频。作为如何完成此操作的示例,我使用了ffmpeg muxing 示例。
问题是 4 秒视频的大小为 ~15mb,比特率为 ~30000 kb/s,尽管我已将 AVCodecContext 上的比特率设置为 400000(我认为该值以比特/秒为单位,而不是 kb/s) .
我还尝试从命令行使用 ffmpeg 录制视频,它的比特率约为 700 kb/s。
有人知道为什么不保留比特率从而导致生成的文件非常大吗?我用来初始化编解码器上下文的代码如下:
初始化部分:
avformat_alloc_output_context2(&m_formatContext, NULL, NULL, filename);
outputFormat = m_formatContext->oformat;
codec = avcodec_find_encoder(outputFormat->video_codec);
m_videoStream = avformat_new_stream(m_formatContext, codec);
m_videoStream->id = m_formatContext->nb_streams - 1;
codecContext = m_videoStream->codec;
codecContext->codec_id = outputFormat->video_codec;
codecContext->width = m_videoResolution.width();
codecContext->height = m_videoResolution.height();
int m_bitRate = 400000;
codecContext->bit_rate = m_bitRate;
codecContext->rc_min_rate = m_bitRate;
codecContext->rc_max_rate = m_bitRate;
codecContext->bit_rate_tolerance = 0;
codecContext->time_base.den = 20;
codecContext->time_base.num = 1;
codecContext->pix_fmt = …Run Code Online (Sandbox Code Playgroud) 我想构建静态链接到libavcodec和libavformat的静态链接可执行文件.静态ffmpeg库是用以下代码构建的:
./configure --enable-static --enable-gpl --enable-nonfree --disable-vaapi
--disable-libopus --prefix=myBuild --disable-swresample
Run Code Online (Sandbox Code Playgroud)
接头设置如下:
g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a
-L/ffmpeg/myBuild/lib -lavformat -lavcodec -lavutil -lrt -lm -lpthread -lz
Run Code Online (Sandbox Code Playgroud)
编译时,我只收到一条错误消息>: - /
src/ffmpeg/myProgram.cpp:115: error: undefined reference to 'avcodec_alloc_context'
Run Code Online (Sandbox Code Playgroud)
输出nm /ffmpeg/myBuild/lib/libavcodec.a | grep avcodec_alloc_context:
U avcodec_alloc_context3
U avcodec_alloc_context3
000003c0 T avcodec_alloc_context3
U avcodec_alloc_context3
Run Code Online (Sandbox Code Playgroud)
我包含带有extern"C"{}的libavcodec.h,我相信我的静态链接器顺序是正确的.为什么我会收到此错误?是因为这个方法已被弃用了吗?我怎么解决这个问题?
解:
不要用
avCtx = avcodec_alloc_context()
Run Code Online (Sandbox Code Playgroud)
从可能较旧的代码片段,但使用
codec = avcodec_find_decoder(CODEC_ID_XYZ);//for completeness but should be the same as before
avCtx = avcodec_alloc_context3(codec)
Run Code Online (Sandbox Code Playgroud) 我正在使用 ffmpeg 库对 MPEG 传输流中的视频进行解码、缩放和重新编码。我刚刚从源代码重新编译到 v3.3.2,并从旧的 avcodec_decode_video2() API 更改为新的发送/接收 API。
旧的和新的 API 都非常缓慢地解码视频。
25 fps 视频 = 每 40 毫秒 1 帧。但是,我看到每帧要解码 70 到 120 毫秒。这是一个文件翻译器,因此需要它比实时运行得更快。
代码大纲如下。有人对如何提高解码速度有任何想法吗?还有其他关于弃用avcodec_decode_video2()缓慢的帖子;这些都没有得到解决。新的 API 没有运行得更快...
gettimeofday(&tv1, NULL);
int rc = av_read_frame(pFormatContext, pESPacket);
gettimeofday(&tv2, NULL);
int ret = avcodec_send_packet(pDecoderContext, pESPacket);
if (ret < 0)
continue;
ret = avcodec_receive_frame(pDecoderContext, pFrameDec);
if (ret != 0)
{
printf("avcodec_receive_frame error: %d\n", ret);
continue;
}
gettimeofday(&tv3, 0);
u_long twoMinusOne = (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - …Run Code Online (Sandbox Code Playgroud) 就目前而言,我的项目正确使用 libavcodec 解码视频,其中每一帧都被操纵(无论如何)并输出到新视频。我从网上找到的例子拼凑起来,它的工作原理。结果是处理过的帧的完美 .mp4,减去音频。
我的问题是,当我尝试将音频流添加到输出容器时,我在 mux.c 中遇到了无法解释的崩溃。它在static int compute_muxer_pkt_fields(AVFormatContext *s, AVStream *st, AVPacket *pkt). 当st->internal->priv_pts->val = pkt->dts;尝试,priv_pts是nullptr。
我不记得版本号,但这是 2020 年 11 月 4 日 ffmpeg 从 git 构建的。
我的MediaContentMgr比我在这里的要大得多。我正在剥离与帧操作有关的所有内容,因此如果我遗漏了任何内容,请告诉我,我会进行编辑。
添加时触发 nullptr 异常的代码被内联调用
.h:
#ifndef _API_EXAMPLE_H
#define _API_EXAMPLE_H
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include "glm/glm.hpp"
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#include <libavutil/opt.h>
#include <libswscale/swscale.h>
}
#include "shader_s.h"
class MediaContainerMgr {
public:
MediaContainerMgr(const std::string& infile, const std::string& vert, const std::string& frag, …Run Code Online (Sandbox Code Playgroud) libavcodec ×10
ffmpeg ×9
libavformat ×5
libav ×4
c++ ×2
asp.net-core ×1
audio ×1
avcodec ×1
c# ×1
crash ×1
linux ×1
nullptr ×1
x264 ×1