我在ubuntu11上安装了ffmpeg 0.8.9
./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libx264
当我运行它
ffmpeg -y -i test.mp4 -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -vcodec libx264 -b 250k -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 250k -maxrate 250k -bufsize 250k -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -async 2 a.ts
Run Code Online (Sandbox Code Playgroud)
它说
未知编码器'libx264'
(注意:同样的错误可能会出现avconv
)
我怎样才能解决这个问题?谢谢!
我想从我在matplotlib的python脚本中生成的帧创建一个h264或divx电影.这部电影大约有10万帧.
在网络上的例子中[例如 1],我只看到了将每个帧保存为png然后在这些文件上运行mencoder或ffmpeg的方法.就我而言,保存每一帧是不切实际的.有没有办法从matplotlib生成一个图并将其直接传递给ffmpeg,不生成中间文件?
用ffmpeg的C-api编程对我来说太难了[例如.2].此外,我需要一个具有良好压缩的编码,例如x264,因为电影文件对于后续步骤来说太大了.所以坚持使用mencoder/ffmpeg/x264会很棒.
有什么东西可以通过管道来完成[3]?
[1] http://matplotlib.sourceforge.net/examples/animation/movie_demo.html
如何使用x264 C API将RBG图像编码为H264帧?我已经创建了一系列RBG图像,我现在如何将该序列转换为H264帧序列?特别是,如何将这个RGB图像序列编码为H264帧序列,该帧由单个初始H264关键帧后跟依赖H264帧组成?
是否有可能在h264中进行完全无损编码?通过无损,我的意思是,如果我喂它一系列帧并对它们进行编码,然后如果我从编码视频中提取所有帧,我将获得与输入完全相同的帧,逐个像素,逐帧.这有可能吗?举个例子:
我生成了一堆帧,然后我将图像序列编码为未压缩的AVI(类似于virtualdub),然后我应用无损h264(帮助文件声称设置--qp 0进行无损压缩,但我不确定是否这意味着在过程的任何一点都没有损失,或者只是量化是无损的).然后,我可以使用类似mplayer的内容从生成的h264视频中提取帧.
我首先尝试使用Handbrake,但事实证明它不支持无损编码.我试过x264但它崩溃了.这可能是因为我的源AVI文件是RGB颜色空间而不是YV12.我不知道如何提供一系列YV12位图以及x264的格式,所以我甚至无法尝试.
总之,如果有办法,我想知道什么
系列无损位图(在任何颜色空间中) - >一些转换 - > h264编码 - > h264解码 - >一些转换 - >原始系列的无损位图
如果有办法实现这一目标?
编辑:有一个关于无损H264的非常有效的观点没有太多意义.我很清楚,在H264中我无法分辨(和我的眼睛)和未压缩剪辑之间的区别以及另一个高速压缩,但我认为这并非没有用处.例如,对于存储视频进行编辑而不占用大量空间并且不会丢失质量并且每次保存文件时花费太多编码时间可能是有用的.
更新2:现在x264没有崩溃.我可以使用avisynth或无损yv12 lagarith作为来源(以避免颜色空间压缩警告).然而,即使使用--qp 0和rgb或yv12源,我仍然会得到一些差异,最小但存在.这是令人不安的,因为我在无损预测编码(--qp 0)上发现的所有信息都声称整个编码应该是无损的,但我无法验证这一点.
如何从视频文件中获取特定的h264视频信息?我需要知道个人资料(基线/主要/高)并且电影中是否有B-Frames?
我在执行命令时遇到错误
ffmpeg -i /path/to/video.mp4
:
ffmpeg version git-2012-07-24-93342de Copyright (c) 2000-2012 the FFmpeg developers
built on Jul 24 2012 23:55:41 with gcc 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
configuration: --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-gpl --enable-nonfree --enable-postproc --enable-swscale --enable-vdpau --enable-version3 --enable-libtheora --enable-libvorbis --enable-libvpx --enable-x11grab
libavutil 51. 65.100 / 51. 65.100
libavcodec 54. 44.100 / 54. 44.100
libavformat 54. 20.100 / 54. 20.100
libavdevice 54. 2.100 / 54. 2.100
libavfilter 3. 3.100 / 3. 3.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. 15.100 …
Run Code Online (Sandbox Code Playgroud) 我试图使用libavcodec/libavformat编码视频.音频效果很好,但当我尝试编码视频时,我收到以下错误:
[libx264 @ 0x10182a000]broken ffmpeg default settings detected
[libx264 @ 0x10182a000]use an encoding preset (vpre)
Run Code Online (Sandbox Code Playgroud)
使用命令行ffmpeg很容易修复,但我想在C中执行此操作.我的选项是
AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0);
AVCodecContext *pVideoOutCodecCtx = pVideoOutStream->codec;
pVideoOutCodecCtx->codec_id = CODEC_ID_H264;
pVideoOutCodecCtx->codec_type = CODEC_TYPE_VIDEO;
pVideoOutCodecCtx->bit_rate = pVideoInCodecCtx->bit_rate;
pVideoOutCodecCtx->width = pVideoInCodecCtx->width;
pVideoOutCodecCtx->height = pVideoInCodecCtx->height;
pVideoOutCodecCtx->pix_fmt = pVideoInCodecCtx->pix_fmt;
pVideoOutCodecCtx->sample_rate = pVideoInCodecCtx->sample_rate;
pVideoOutCodecCtx->gop_size = 30;
Run Code Online (Sandbox Code Playgroud)
但是avcodec_open()失败了.
我需要设置哪些其他值才能使x264满意?
我正在编写C++代码,其中在执行其中实现的一些操作之后生成N个不同帧的序列.每个帧完成后,我将它作为IMG_%d.png写在磁盘上,最后我使用x264编解码器通过ffmpeg将它们编码为视频.
该程序主要部分的汇总伪代码如下:
std::vector<int> B(width*height*3);
for (i=0; i<N; i++)
{
// void generateframe(std::vector<int> &, int)
generateframe(B, i); // Returns different images for different i values.
sprintf(s, "IMG_%d.png", i+1);
WriteToDisk(B, s); // void WriteToDisk(std::vector<int>, char[])
}
Run Code Online (Sandbox Code Playgroud)
这种实现的问题是所需帧的数量N通常很高(N~100000)以及图像的分辨率(1920x1080),导致磁盘过载,产生数十GB的写入周期每次执行后.
为了避免这种情况,我一直试图找到关于将存储在向量B中的每个图像直接解析为编码器(如x264)的文档(无需将中间图像文件写入磁盘).虽然发现了一些有趣的话题,但没有一个能够专门解决我想要的内容,因为其中许多都涉及在磁盘上使用现有图像文件执行编码器,而其他人则提供其他编程语言(如Python)的解决方案(在这里你)可以为该平台找到一个完全令人满意的解决方案.
我想要获得的伪代码类似于:
std::vector<int> B(width*height*3);
video_file=open_video("Generated_Video.mp4", ...[encoder options]...);
for (i=0; i<N; i++)
{
generateframe(B, i+1);
add_frame(video_file, B);
}
video_file.close();
Run Code Online (Sandbox Code Playgroud)
根据我在相关主题上所读到的内容,x264 C++ API可能能够做到这一点,但是,如上所述,我没有找到满意的答案来解决我的具体问题.我尝试直接学习和使用ffmpeg源代码,但是它的低易用性和编译问题都迫使我放弃这种可能性,因为我只是一个非专业的程序员(我把它视为一种爱好而不幸的是我不能浪费很多时候学习如此苛刻的东西).
我想到的另一个可能的解决方案是找到一种方法在C++代码中调用ffmpeg二进制文件,并以某种方式设法将每次迭代的图像数据(存储在B中)传输到编码器,让每个帧的添加(即,不是"关闭"要写入的视频文件)直到最后一帧,以便可以添加更多帧直到到达第N个帧,其中视频文件将被"关闭".换句话说,通过C++程序调用ffmpeg.exe将第一帧写入视频,但让编码器"等待"更多帧.然后再次调用ffmpeg添加第二帧并使编码器再次"等待"以获得更多帧,依此类推,直到到达最后一帧,视频将完成.但是,我不知道如何进行或者实际上是否可行.
编辑1:
正如回复中所建议的那样,我一直在记录有关命名管道的信息,并尝试在我的代码中使用它们.首先,应该注意我正在使用Cygwin,所以我的命名管道是在Linux下创建的.我使用的修改过的伪代码(包括相应的系统库)如下:
FILE *fd;
mkfifo("myfifo", 0666);
for (i=0; i<N; i++)
{
fd=fopen("myfifo", "wb");
generateframe(B, i+1);
WriteToPipe(B, fd); // void WriteToPipe(std::vector<int>, FILE …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用libx264为Android构建FFMPEG.
我可以成功构建和使用FFMPEG for Android但我意识到我需要编码的能力,因此我试图用x264构建FFMPEG.
我正在使用本教程为Android构建FFmpeg http://www.roman10.net/how-to-build-ffmpeg-for-android/
在尝试构建FFMPEG时出现错误:
"错误:未找到libx264"
在我的日志中它说:
"/usr/local/lib/libx264.a:无法读取符号:存档没有索引;运行ranlib添加一个..."
我有FFMPEG和x264的最新版本.我知道FFMPEG在usr/lib和usr/include中查找头文件和库,所以为了使它找到x264我使用cflags和ldflags:
我尝试构建x264,其中有许多不同的选项,互联网上的其他人都说我需要.例如.--enable-shared, - enable-static, - disable-pthreads等.有些论坛说启用这个,其他人说没有禁用它.
任何帮助将不胜感激,谢谢
编辑:
如果我使用最简单的命令构建FFmpeg以包含libx264,那么它可以工作.即.
./configure --enable-gpl --enable-libx264 --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --enable-static --enable-shared
Run Code Online (Sandbox Code Playgroud)
但是我需要它适用于Android.我使用的脚本是:
NDK=~/Desktop/android-ndk-r7
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86
function build_one
{
./configure --target-os=linux \
--prefix=$PREFIX \
--enable-cross-compile \
--enable-shared \
--enable-static \
--extra-libs="-lgcc" \
--arch=arm \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS -I/usr/local/include" \
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L …
Run Code Online (Sandbox Code Playgroud) 目标是创建多个输出文件,这些文件的比特率与单个源文件不同.记录的解决方案有效,但效率低下.我发现最有效的解决方案没有记录在任何我能看到的地方.我将其发布在此处进行审核,并询问其他人是否知道可以进行的其他优化.
Source file MPEG-2 Video (Letterboxed) 1920x1080 @>10Mbps
MPEG-1 Audio @ 384Kbps
Destiation files H264 Video 720x400 @ multiple bitrates
AAC Audio @ 128Kbps
Machine Multi-core Processor
Run Code Online (Sandbox Code Playgroud)
每个比特率的视频质量非常重要,因此我们使用"中"预设以2通道模式运行
VIDEO_OPTIONS_P2 = -vcodec libx264 -preset medium -profile:v main -g 72 -keyint_min 24 -vf scale=720:-1,crop=720:400
第一种方法是将它们全部编码在并行过程中
ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 250k -threads auto -f mp4 out-250.mp4 & ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 500k -threads auto -f mp4 out-500.mp4 & ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 700k -threads …
x264 ×10
ffmpeg ×7
h.264 ×3
c ×2
image ×2
video ×2
android ×1
android-ndk ×1
avconv ×1
build ×1
c++ ×1
decoding ×1
libav ×1
libavcodec ×1
libx264 ×1
matplotlib ×1
numpy ×1
python ×1
ubuntu ×1
ubuntu-10.04 ×1