我对h264 RTP数据包的时间戳感到困惑.我知道我在SIP SDP中定义的视频挂钟率是90KHz.我的编码器的帧速率不是30 FPS,它是可变的.它的速度从15 FPS到30 FPS不等.所以,我不能使用任何固定的时间戳.
任何人都可以告诉我以下编码数据包的时间戳.
经过0毫秒编码的RTP时间戳= 0(让开始时间戳0)
经过50毫秒编码的RTP时间戳=?
经过40毫秒编码的RTP时间戳=?
经过33毫秒编码的RTP时间戳=?
编码帧速率可变时的公式是什么?
先感谢您.
我想知道哪些命令行设置我需要明确设置(或避免)使用ffmpeg将视频编码成x264(mp4格式),默认情况下可以在Quicktime中播放.我发现许多预定义的预设文件对我有用,但其中一些不会,例如我无法使任何无损的文件工作,我也对这些文件感兴趣.例如,libx264-lossless_max.ffpreset将对我的视频进行编码,但它只能在VLC中播放,而不能在Quicktime中播放.在Quicktime中,视频保持黑色.我知道Perian是一个选项,但我希望我的文件可以在不安装Perian的情况下播放.谢谢你的帮助.
我正在构建一个Android应用程序,它将编码从相机预览中捕获的图像,然后对其进行解码.我正在使用ffmpeg库进行编码和解码.要使用x264构建静态库,我已经使用了本教程.http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html.作为ffmpeg的源代码,如果我使用从教程中给出的链接下载的那个,我可以构建它但是如果我使用从这里下载的源代码git clone git://source.ffmpeg.org/ffmpeg则无法构建库. git ffmpeg.我在ubuntu中构建了库,并在Eclipse的Windows 7中使用它.由于我只需要h264编码器和解码器,我使用了以下ffmpeg代码,稍微修改了一下教程.
#!/bin/bash
NDK=~/Documents/android-ndk-r8e
PLATFORM=$NDK/platforms/android-8/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
PREFIX=/home/android-ffmpeg
function build_one
{
./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-nonfree \
--enable-version3 \
--disable-everything \
--enable-gpl \
--disable-doc \
--enable-avresample \
--disable-ffplay \
--disable-ffserver \
--enable-ffmpeg \
--disable-ffprobe \
--enable-avcodec \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-encoder=libx264rgb \
--enable-decoder=h263 \
--enable-decoder=h264 \
--enable-decoder=svq3 \
--enable-zlib \
--enable-gpl \
--enable-pic \
--disable-devices \ …Run Code Online (Sandbox Code Playgroud) 在最近更新到Mavericks 10.9.5之后,我的ffmpeg安装一直在讨论
错误:
dyld: Library not loaded: /usr/local/lib/libx264.142.dylib
Referenced from: /usr/local/bin/ffmpeg
Reason: image not found
Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?我不熟悉手动编译,我通过Homebrew安装了ffmpeg.
我尝试卸载并执行:
brew install ffmpeg --HEAD
brew install ffmpeg --build-from-source
Run Code Online (Sandbox Code Playgroud)
但它吐出了一个./configure错误
==> ./configure --prefix=/usr/local/Cellar/ffmpeg/2.4.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "config.log" produced …Run Code Online (Sandbox Code Playgroud) 许多帖子表示,x264 上没有对 h.264 3D 的开源支持,并且该技术已经死亡。不过,我正在研究x264,想向这里的专家询问他们的意见:
注意:请不要将此问题标记为重复,因为我找到的所有答案都是在 2010-2012 年回答的,并且希望现在很多事情都已更改。
如果 p 帧不改变当前解码视频中的任何像素(即没有运动向量,什么都没有),我们就将其称为空帧。
我需要的是能够根据请求手动将空 p 帧插入到视频流中(需要以恒定的帧速率将帧发送到流客户端,但是流服务器上的帧源可以提供具有不同/较低帧速率的帧一)。
因此,我需要能够正确形成代表当前分辨率的空 p 帧的字节序列(我想知道还需要哪些其他参数?)
理想情况下,我更喜欢独立于编码器的解决方案,因为我使用两种不同的解决方案:通过 Nvidia Video SDK 的 nvenc 和通过 FFmpeg 的 x264。
我应该去哪里寻找?
我在使用 GPU (CUDA) 进行 ffmpeg 视频编码时遇到问题。
我有 2 个 nVidia GTX 1050 Ti
当我尝试进行多个并行编码时,问题就出现了。超过 2 个进程和 ffmpeg 像这样死亡:
[h264_nvenc @ 0xcc1cc0] OpenEncodeSessionEx failed: out of memory (10)
Run Code Online (Sandbox Code Playgroud)
问题是 nvidia-smi 显示 gpu 上有很多可用资源:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.66 Driver Version: 384.66 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 105... Off | 00000000:41:00.0 Off | N/A |
| 40% 37C P0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 x264 对流进行编码(通过提供单个图像),但不寻常的是我已经有了一些帧的运动信息。我确切地知道每个帧中哪些区域已被修改,并且我知道帧中发生运动的位置。
有没有办法向 x264 提供我自己的运动信息?我想给它帧中给定区域的运动向量,并以某种方式告诉它帧中的某些区域保证没有任何运动。
我认为这可能会显着提高编码的性能(因为我允许编解码器完全跳过运动估计阶段),并且在编码器的运动估计算法可能错过实际发生的运动的情况下也应该在一定程度上提高质量。
我是否需要修改编码器才能执行此操作,或者现有 API 是否支持此操作?
我有一项潜在的工作,需要我用FFMPEG和x264进行一些视频编码。我将有一系列文件,需要对它们进行一次编码,然后才能将实例关闭。由于我不确定x264和FFMPEG的资源利用率,应该获得哪种实例?我在想
高CPU超大型实例
7 GB的内存
20个EC2计算单元(8个虚拟内核,每个虚拟内核具有2.5个EC2计算单元)
1690 GB的实例存储
64位平台
I / O性能:高
API名称:c1.xlarge
或者,或者
集群GPU四重超大型实例
22 GB内存
33.5 EC2计算单元(2个Intel Xeon X5570,四核“ Nehalem”架构)
2个NVIDIA Tesla“ Fermi” M2050 GPU
1690 GB的实例存储
64位平台
I / O性能:很高(10千兆以太网)
API名称:cg1.4xlarge
我应该使用什么?x264 / FFMPEG在更快/更多的CPU上是否表现更好,还是真的使GPU更强大?无论如何,似乎Cluster GPU似乎是性能更高的实例。我该怎么选?
我有从相机流式传输的 RGB24 帧,我想将它们编码为 h264 ,我发现 AVCodec 和 x264 可以这样做,问题是默认情况下 x264 接受 YUV420 作为输入,所以我编写的是一个将 RGB 帧转换为 YUV420 的程序。这是由 sws_scale 函数实现的。除了它不满足所需的 FPS 之外,它运行良好,因为转换 (RGB->YUV420) 需要时间。
这就是我设置编码器上下文的方式:
videoStream->id = 0;
vCodecCtx = videoStream->codec;
vCodecCtx->coder_type = AVMEDIA_TYPE_VIDEO;
vCodecCtx->codec_id = AV_CODEC_ID_H264;
vCodecCtx->bit_rate = 400000;
vCodecCtx->width = Width;
vCodecCtx->height = Height;
vCodecCtx->time_base.den = FPS;
vCodecCtx->time_base.num = 1;
//vCodecCtx->time_base = (AVRational){1,};
vCodecCtx->gop_size = 12;
vCodecCtx->max_b_frames = 1;
vCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
if(formatCtx->oformat->flags & AVFMT_GLOBALHEADER)
vCodecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;
av_opt_set(vCodecCtx->priv_data, "preset", "ultrafast", 0);
av_opt_set(vCodecCtx->priv_data, "profile", "baseline", AV_OPT_SEARCH_CHILDREN);
if (avcodec_open2(vCodecCtx, h264Codec, …Run Code Online (Sandbox Code Playgroud)