我通过v4l从相机抓取视频帧,我需要用mpeg4格式对它们进行转码,然后通过RTP连续流式传输.
一切都"有效",但重新编码时我没有:输入流产生15fps,输出为25fps,每个输入帧都在一个视频对象序列中转换(我通过简单的检查验证了这一点)在输出比特流上).我猜接收器正在正确解析mpeg4比特流,但RTP分组化在某种程度上是错误的.我应该如何在一个或多个AVPacket中拆分编码比特流?也许我错过了明显的,我只需要寻找B/P帧标记,但我想我没有正确使用编码API.
以下是我的代码的摘录,它基于可用的ffmpeg示例:
// input frame
AVFrame *picture;
// input frame color-space converted
AVFrame *planar;
// input format context, video4linux2
AVFormatContext *iFmtCtx;
// output codec context, mpeg4
AVCodecContext *oCtx;
// [ init everything ]
// ...
oCtx->time_base.num = 1;
oCtx->time_base.den = 25;
oCtx->gop_size = 10;
oCtx->max_b_frames = 1;
oCtx->bit_rate = 384000;
oCtx->pix_fmt = PIX_FMT_YUV420P;
for(;;)
{
// read frame
rdRes = av_read_frame( iFmtCtx, &pkt );
if ( rdRes >= 0 && pkt.size > 0 )
{
// decode it
iCdcCtx->reordered_opaque …Run Code Online (Sandbox Code Playgroud) 我将感谢您对以下方面的建议。我正在开发一个基于FFmpeg的libavformat的视频转换器,我需要实现一个精确的查找API。首先,我开发了一个视频流索引器,它只保存每个数据包的呈现时间戳(PTS)。然后我的编码器使用这个索引来寻找视频文件。例如,在此操作之前,我将文件重新混合到 mp4 容器。对于内部没有正确索引或视频根本没有索引的视频,需要进行 Remux。我需要实现按字节查找,当然需要使用之前构建的索引。我尝试了很多方法来实现这一点,但没有成功。也许你知道如何在FFmpeg中实现按字节精确查找?此致。
我正在使用最近的 Windows(2011 年 1 月)ffmpeg 构建并尝试以 H264 录制视频。使用以下设置可以很好地录制 MPEG4:
c->codec_id = CODEC_ID_MPEG4;
c->codec_type = AVMEDIA_TYPE_VIDEO;
c->width = VIDEO_WIDTH;
c->height = VIDEO_HEIGHT;
c->bit_rate = c->width * c->height * 4;
c->time_base.den = FRAME_RATE;
c->time_base.num = 1;
c->gop_size = 12;
c->pix_fmt = PIX_FMT_YUV420P;
Run Code Online (Sandbox Code Playgroud)
仅将 CODEC Id 更改为 H264 会导致 avcodec_open() 失败 (-1)。我找到了可能的设置列表如何使用 libavcodec/x264 编码 h.264?。我已经尝试过这些,没有设置 pix_fmt,avcodec_open() 仍然失败,但如果我另外设置 c->pix_fmt = PIX_FMT_YUV420P; 然后我得到除以零的异常。
然后我在这里看到了一些帖子,说我不应该设置任何内容(除了 code_id、codec_type、宽度、高度,也许还有 bit_rate 和 pix_fmt),因为库现在会自行选择最佳设置。我尝试了各种组合, avcode_open() 仍然失败。
有人对该怎么做或一些当前的设置有一些建议吗?
谢谢。
以下是一组 H264 设置,它们给出了我所描述的问题:
static AVStream* AddVideoStream(AVFormatContext *pOutputFmtCtx,
int frameWidth, int frameHeight, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用 ffmpeg 的 libav* 库的 C 程序,并使用Dranger 的教程,我可以正确解码音频和视频。目前,我正在尝试提取字幕。我实际上不想按时解码它们并将它们显示在视频上,而是实际上从容器中提取字幕文本。
例如,在 cli 上,
ffmpeg -i video.mkv -map 0:4 -scodec copy out.ass
Run Code Online (Sandbox Code Playgroud)
会把屁股档案还给我。(由于某种原因,srts 只返回文本。)
我试过搞乱 AVSubtitle、avcodec_decode_subtitle2 等,但它们逐行返回字幕。我想要 srts 中的时间码、ass 中的标题信息等。我想要的只是混合到容器中的整个字幕文本文件。
我有一个编码的视频.3gp h.264,我希望在 C 中获得它的帧率和持续时间。这是我在打开文件并找到合适的编解码器后使用的代码:
AVRational rational = gVideoCodecCtx->time_base;
LOGI(10, "numerator is %i", rational.num);
LOGI(10, "denominator is %i", rational.den);
LOGI(10, "duration is %d", gFormatCtx->duration);
LOGI(10, "fps is %d", (double)av_q2d(rational));
Run Code Online (Sandbox Code Playgroud)
这是输出:
12-02 12:30:19.819: I/FFmpegTest(23903): numerator is 1
12-02 12:30:19.819: I/FFmpegTest(23903): denominator is 180000
12-02 12:30:19.819: I/FFmpegTest(23903): duration is 6594490
12-02 12:30:19.819: I/FFmpegTest(23903): fps is 1692926992
Run Code Online (Sandbox Code Playgroud)
从文档中我了解到持续时间是“duration/time_base”,它给了我6594490 / 180000 = 36.6. 我的视频文件的持续时间是6 seconds,我不知道这个因素6来自哪里。
此外,帧率似乎完全关闭。
目前很难找到帮助,因为很多教程使用不推荐使用的方法,并且文档没有给出示例。
任何帮助,将不胜感激。
谢谢
编辑: 感谢下面的评论,我设法打印了以下内容
12-02 18:59:36.279: I/FFmpegTest(435): numerator is 1 …Run Code Online (Sandbox Code Playgroud) 我将代码 avcodec_decode_audio3 更改为 avcodec_decode_audio4 并添加了帧处理。但现在我不能再解码 AAC 帧了。
为什么 avcodec_decode_audio4 返回-22(无效参数)?按照下面的回答,这和AVContext中需要设置的参数有关系吗?
我不得不使用 avcodec_decode_audio4 因为我更新了我的 ffmpeg 然后出现以下错误:
[NULL @ 0xb14f020] Custom get_buffer() for use withavcodec_decode_audio3() detected.
Overriding with avcodec_default_get_buffer
[NULL @ 0xb14f020] Please port your application to avcodec_decode_audio4()
Run Code Online (Sandbox Code Playgroud)
根据avcodec_decode_audio4() 中的缓冲区错误,这是一个回归,除了回到 ffmpeg < 0.8 之外,还有其他解决方案吗?
使用 avcodec_decode_audio4 的解码器:
AVCodec *codec;
AVCodecContext *avCtx;
AVFrame * decoded_frame = NULL;
uint8_t *outbuf = static_cast<uint8_t *>(malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE));
AVPacket avPacket;
main(){
av_register_all();
codec = avcodec_find_decoder(CODEC_ID_AAC);
//set parameters
avCtx = avcodec_alloc_context3(codec);
avCtx->channels = 1; …Run Code Online (Sandbox Code Playgroud) 我正在尝试(以编程方式)使用 DirectShow 屏幕驱动程序记录屏幕。我根据 ffmpeg 示例编写了一些快速且(非常)脏的代码来尝试使其工作(http://pastebin.com/ZJuhZRCz),但我在弄清楚要使用的 time_base/framerate 时遇到很多麻烦。如果我将 time_base/framerate 部分留空,我只会得到一个静止帧。如果我将它们更改为任何值,视频就会变黑。
我猜这与输出文件设置有关,但我对尝试的方法一无所知。任何指针/帮助将不胜感激。
我\xe2\x80\x99m 尝试使用 FFMpeg/LibAv 在我的 iOS 应用程序上对视频进行转码。\n我\xe2\x80\x99m 试图完成的是对视频进行转码,以便调整每个帧的大小并可能降低比特率为了在设备中节省宝贵的 MB。
\n\n生成的视频必须可以在所有 iPhone5+ 设备上播放。
\n\n阅读文档后我发现:
\n\n从 FFMpeg 角度来看,我尝试使用 LibAv 实现的目标是:
\n\nffmpeg -i INPUT.MOV -c:v libx264 -preset ultrafast -profile:v baseline -level 3.0 -c:a copy output.MOV\nRun Code Online (Sandbox Code Playgroud)\n\n(生成的文件 - 可以在下面找到 - 如果它是由 FFMpeg 通过命令行生成的\xe2\x80\x99s,则可以在 QuickTime 上播放) …
我在尝试使用 . 打开编解码器时遇到错误avcodec_open2()。avi如果我指定而不是在函数h264中指定,我已经尝试了相同的代码,没有任何问题av_guess_format()。
我不知道该怎么办。还有其他人遇到过类似的问题吗?
我正在使用的库是ffmpeg-20160219-git-98a0053-win32-dev。如果您能帮助我摆脱这种困惑,我将非常感激。
这是我的控制台输出:
视频编码
[libx264 @ 01383460] 检测到损坏的 ffmpeg 默认设置
[libx264 @ 01383460] 使用编码预设(例如 -vpre 中)
[libx264 @ 01383460] 预设用法:-vpre -vpre
[libx264 @ 01383460] 速度预设在 x264 中列出--help
[libx264 @ 01383460] 配置文件是可选的;x264 默认为高
无法打开视频编解码器,-542398533
这是我正在使用的代码:
// Video encoding sample
AVCodec *codec = NULL;
AVCodecContext *codecCtx= NULL;
AVFormatContext *pFormatCtx = NULL;
AVOutputFormat *pOutFormat = NULL;
AVStream * pVideoStream = NULL;;
AVFrame *picture = NULL;;
int i, x, y, ret; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 libavcodec 让硬件加速视频工作。我使用hw_decode.c示例作为起点,但无法让它工作。两者都是AVCodecContext->hwaccel并且AVCodecContext->hwaccel_context是NULL
当我看到输出时,我相信 hwaccel 的某些部分正在工作
libva info: VA-API version 0.39.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
Run Code Online (Sandbox Code Playgroud)
这和我跑步时是一样的
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mpg -f null -
Run Code Online (Sandbox Code Playgroud)
但之后我立即收到以下错误消息
[h264 @ 0x1df2cc0] Hardware acceleration context (hwaccel_context) does not exist.
Failed to get HW surface format.
[h264 @ 0x1df2cc0] decode_slice_header error
[h264 @ 0x1df2cc0] no frame! …Run Code Online (Sandbox Code Playgroud) ffmpeg ×10
libavcodec ×10
c++ ×4
libavformat ×4
libav ×3
c ×1
decoder ×1
directshow ×1
duration ×1
frame-rate ×1
fseek ×1
h.264 ×1
libx264 ×1
seek ×1
video ×1
windows ×1