问题标签 [avcodec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - avcodec_receive_packet() doesn't see the output
I'm trying to create a converter which will make a video out of set of images. Everything is at its place, AVFormatContext
, AVCodecContext
, AVCodec
. I'm creating YUV AVFrame out of UIImage and send it to encoder by avcodec_send_frame()
method. Everything goes fine until I'm trying to get AVPacket
with method avcodec_receive_packet()
. Every time it returns -53 which means - output is not available in the current state - user must try to send input
. As I said, I'm sending an input before I'm trying to get something and sending is successful.
Here's my code:
Init ffmpeg entities:
#xA;And here's convertation process:
#xA;Any insights would be helpful. Thanks!
c++ - ffmpeg - 访问 AVCodecContext 的元素
我想AVCodecContext *av_ctx
在我的程序中访问我的一些成员。当我在 32 位版本中编译它时很好,但是当我将它更改为 64 位时,这些元素的行为就像它们被移动了一样。
例如,我想获取av_ctx->coded_width
and av_ctx->coded_height
(有时它们与av_ctx->width
and不同av_ctx->height
)并将它们存储在一些变量中。现在,当我在 32 位版本中调试该程序时没问题,但在 64 位版本中,这个值是错误的,当我检查我的结构时,我可以看到接下来的两个元素 (av_ctx->gop_size
和av_ctx->pix_fmt
) 具有我想要的值。
我检查了AVCodecContext
声明avcodec.h
,它(在结构声明上方的评论中)说:
请使用 AVOptions (av_opt* / av_set/get*()) 从用户应用程序访问这些字段。
我认为这可能是获取这些元素的正确方法,但我不知道这是什么AVOptions,我搜索了它但找不到它到底是什么以及如何使用它。
multithreading - FFmpeg 用 avcodec_send_packet() 做什么?
我正在尝试优化一个播放视频的软件,它在内部使用 FFmpeg 库进行解码。我们发现,在一些大型(4K、60fps)视频中,解码一帧的时间有时比显示该帧的时间要长;可悲的是,由于问题域,简单地缓冲/跳过帧不是一种选择。
但是,似乎 FFmpeg 可执行文件能够以大约 2 倍的速度很好地解码有问题的视频,所以我一直在努力找出我们做错了什么。
我为测试编写了一个非常精简的解码器程序;源代码在这里(大约 200 行)。从分析来看,解码过程中的一个主要瓶颈似乎是avcodec_send_packet()
函数,每次调用最多可能需要 50 毫秒。但是,在 FFmpeg 中测量相同的调用会显示出奇怪的行为:
(这些是解码 4K 25fps VP9 编码视频时,每次调用 avcodec_send_packet() 所需的时间(以毫秒为单位。)
基本上,当 FFmpeg 使用这个函数时,似乎只需要花费任何时间来完成每 N 次调用,其中 N 是用于解码的线程数。但是,我的测试解码器和实际产品都使用 4 个线程进行解码,这不会发生;使用基于帧的线程时,测试解码器的行为类似于 FFmpeg,仅使用 1 个线程。这似乎表明我们根本没有使用多线程,但我们仍然看到通过使用更多线程来提高性能。
FFmpeg 的结果平均比我们的解码器快两倍,所以很明显我们做错了什么。我一直在阅读 FFmpeg 的源代码以试图找到任何线索,但到目前为止我还没有找到。
我的问题是:FFmpeg 在这里做什么而我们不是?或者,我们如何提高解码器的性能?
任何帮助是极大的赞赏。
c - Hwaccel 与 FFMPEG 中的 AVCodec?
我正在使用 AVCodec 作为视频流解码器,想知道是否可以通过 FFMPEG 将硬件加速与 hwaccel 一起使用?还是默认情况下已经使用了?我已经列出了可用的编解码器,但我不明白如何在我的代码中实现它们。
我获得:h264_qsv、h264_vaapi、h264_vdpaufor h264。我看到命令 :
AVHWAccel * ff_find_hwaccel (codecID enum codec_id, enum PixelFormat pix_fmt)
已过时。预先感谢您的帮助。
ffmpeg - 如何用 avcodec_send_frame() 和 avcodec_receive_packet() 替换 avcodec_encode_audio2()/avcodec_encode_video2()?
在链接中的复用示例中,我尝试使用avcodec_send_frame()
andavcodec_receive_packet()
而不是avcodec_encode_audio2()
/ avcodec_encode_video2()
,因为它们已被弃用。在
并且在
got_packet
使用avcodec_send_frame()
和函数时分配变量的avcodec_receive_packet()
内容以及如果我这样做如何更改代码?到目前为止我已经尝试过了
但不工作,我很难让它工作。
ffmpeg - ffmpeg avcodec_find_encoder null - 注册所有折旧
avcodec_find_encoder(AV_CODEC_ID_H264) 返回空值;
其他答案说使用 av_register_all 或 avcodec_register_all 现在都已弃用。
我正在使用通过 vcpkg 安装的 ffmpeg:x64-windows 4.2-8
http-live-streaming - 将 AAC 的 avcodec 配置配置为 HLS/MPEG-TS([mpegts @ 0x7fc4c00343c0] AAC 比特流不是 ADTS 格式并且缺少额外数据)
我们将视频编码为 H264 并将原始 PCM 样本编码为 AAC 以进行 HLS 流式传输。视频工作正常,但在 libavcodec 中配置 AAC 编码器时遇到问题。
有两种方法可以将 AAC 放入传输流。
1. 使用 ADTS 语法(MPEG2 风格)。
在这种情况下,PMT 的 stream_type 应指定为 0x0F(ISO/IEC 13818-7 音频与 ADTS 传输语法)。
因此,您只能使用“旧”(MPEG2) AAC 版本,而不能使用 SBR 和 PS。
2. 使用 LATM+LOAS/AudioSyncStream 语法(MPEG4 风格)。
在这种情况下,PMT 的 stream_type 应指定为 0x11(ISO/IEC 14496-3 音频与 LATM 传输语法)。
并且您可以使用所有强力的“新”(MPEG4) AAC 功能,包括 SBR 和 PS。
此外,DVB 标准 ETSI TS 101 154 要求: HEv1/HEv2 AAC 应使用 LATM 语法传输。
但是经过大量搜索后,我找不到任何有关如何执行其中任何一项的文档。在将其传递到 MPEG-TS 多路复用器(用于输出到 HLS)之前,使用 ADTS 或 LATM 获取编码音频的配置中缺少什么?
设置 AAC 编解码器的当前代码给出了错误[mpegts @ 0x7fc4c00343c0] AAC bitstream not in ADTS format and extradata missing
AAC 编码器设置(为简洁起见删除了错误检查)
HLS 多路复用器设置
编码循环
输出
c++ - 如何使用 avcodec 和 libx264 设置固定 (const) fps
我正在使用这个项目https://github.com/apc-llc/moviemaker-cpp 我想知道如何在我的视频上设置固定帧率,当我输入 30FPS 作为 c-> 时,它的结果就像 33.6 38.1 35.3帧率我尝试了在网上找到的所有内容,但没有机会。
ffmpeg - 如何使 ffmpeg 为数据流输出正确的 SDP 数据
我有一个基于 FFMPEG 库的程序,用于将 KLV 数据添加到视频流中。当我尝试将输出发送到 RTSP 服务器 (rtsp-simple-server) 时,我收到 400 响应。
明显的原因是 KLV 流的 SDP 数据缺少 rtpmap。
我想通过在上下文中设置适当的参数或明确指定数据来添加丢失的数据。
这是使用 Wireshark 捕获的 ANNOUNCE
初始化数据流的代码片段:
ffmpeg - 使用ffmpeg提取视频帧
我被困在使用 ffmpeg 提取帧的问题上。我在filmora和shotkut等视频编辑器中指出给定的帧持续时间(两者都连贯到2毫秒),然后我在ffmpeg中使用该持续时间以本机帧速率提取所有帧。但是,当我看到提取的第一帧和编辑器(vlc、wondershare、filmora 都相同)中的相应图像都不同时,我没有得到完美的连贯性。
请在下面找到一个命令示例:
ffmpeg -i "/mnt/sda1/Downloaded_Videos/25mm_Videos/24- 12_21/0840.mp4" -ss 00:09:50.18 -to 00:10:49.22 /mnt/sda1/ExtractedFrames/25mm/24Dec_test/frame %5d_0r_0840_0009.5018_00008_00 PNG
提取的帧frame_0_0r_0840_00095018_00095018.png与进入 timestamp : 00:09:50.18时在编辑器和 vlc 播放器中加载的图像或帧不同。