我想使用c ++代码从位图图像制作.avi视频文件.我写了以下代码:
//Get RGB array data from bmp file
uint8_t* rgb24Data = new uint8_t[3*imgWidth*imgHeight];
hBitmap = (HBITMAP) LoadImage( NULL, _T("myfile.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetDIBits(hdc, hBitmap, 0, imgHeight, rgb24Data , (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
/* Allocate the encoded raw picture. */
AVPicture dst_picture;
avpicture_alloc(&dst_picture, AV_PIX_FMT_YUV420P, imgWidth, imgHeight);
/* Convert rgb24Data to YUV420p and stored into array dst_picture.data */
RGB24toYUV420P(imgWidth, imgHeight, rgb24Data, dst_picture.data); //How to implement this function?
//code for encode frame dst_picture here
Run Code Online (Sandbox Code Playgroud)
我的问题是如何实现RGB24toYUV420P()函数,这个函数会将RGB24数据从数组rgb24Data 转换为YUV420p存储到dst_picture.data …
我的应用程序从分形创建图像,我喜欢在分形周围"飞行"的感觉.我曾经保存了大约2000个位图文件并使用Premiere从它创建了一个AVI.尽管我成功创作了一部电影,但这种体验却令人沮丧.这太壮观了.当然我想从我的应用程序中创建一个视频.我实际上并不关心编解码器,压缩或其他什么的漂亮.我只想要一个可以在大多数系统上重放的视频.
在过去,我尝试过但从未成功过.我最近被一个问题触发了,但唉不能让FFMpeg运行.
更新
我决定略微调整这个问题并为此付出赏金.我看过几个解决方案,但最吸引人的(因为它很简单)在我看来是TAviWrite.我试过TAviWriter但没有成功.在程序TAviWriter.Write; 函数调用370行
AVIERR := AVISaveV(s,
// pchar(FileName),
nil, // File handler
nil, // Callback
nStreams, // Number of streams
Streams,
CompOptions); // Compress options for VideoStream
Run Code Online (Sandbox Code Playgroud)
不返回AVIERR_OK.
更新2
上述错误的原因是AVISaveV的错误声明,它应该被声明为AVIS指出的AVISaveVW.下面发布了用于创建BMP文件的AVI文件的正确代码.下面的原始代码是从efg下载的一个示例单元.
在Windows 7上使用Delphi XE.
unit AviWriter;
/////////////////////////////////////////////////////////////////////////////
// //
// AviWriter -- a component to create rudimentary AVI files //
// by Elliott Shevin, with large pieces of code //
// stolen from Anders Melander //
// version 1.0. Please send comments, suggestions, and advice …Run Code Online (Sandbox Code Playgroud) 我有两个视频,我想将它们组合成一个视频,其中两个视频都位于静态背景图像之上.(认为像这样).我的要求是,我使用的软件是免费的,它运行在OSX,而我不必重新编码我的影片的次数过多的.我也希望能够从命令行或通过脚本执行此操作,因为我会做很多事情.(但这不是绝对必要的.)
我尝试用ffmpeg摆弄几个小时,但它似乎不太适合后期处理.我可能通过叠加功能一起破解某些东西,但到目前为止我还没有弄清楚如何做到这一点,除了痛苦 - 将图像转换为视频(这需要2倍于我的视频长度!)然后在另一个渲染步骤中将两个视频叠加到它上面.
有小费吗?谢谢!
更新:
感谢LordNeckbeard的帮助,我通过一个ffmpeg电话就能达到我想要的结果!不幸的是,编码速度非常慢,需要6秒才能编码1秒的视频.我相信这是由背景图片引起的.有关加速编码的任何提示?这是ffmpeg日志:
MacBook-Pro:Video archagon$ ffmpeg -loop 1 -i underlay.png -i test-slide-video-short.flv -i test-speaker-video-short.flv -filter_complex "[1:0]scale=400:-1[a];[2:0]scale=320:-1[b];[0:0][a]overlay=0:0[c];[c][b]overlay=0:0" -shortest -t 5 -an output.mp4
ffmpeg version 1.0 Copyright (c) 2000-2012 the FFmpeg developers
built on Nov 14 2012 16:18:58 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
libavutil 51. 73.101 / 51. …Run Code Online (Sandbox Code Playgroud) video ffmpeg video-processing command-line-tool video-encoding
我正在尝试解码文件中的视频,并使用API Level 21及更高版本(Android OS 5.0 Lollipop)支持MediaCodec的新异步模式将其编码为不同的格式.
在Big Flake,Google的Grafika等网站上以同步模式执行此操作有很多示例,并且StackOverflow上有许多答案,但它们都不支持异步模式.
我不需要在此过程中显示视频.
我相信一般的程序是用一个读取文件MediaExtractor作为MediaCodec(解码器)的输入,允许解码器的输出渲染成一个Surface也是共享输入到MediaCodec(编码器),然后最后写入编码器输出文件通过MediaMuxer.它Surface是在编码器设置期间创建的,并与解码器共享.
我可以将视频解码为a TextureView,但Surface与编码器共享而不是屏幕也没有成功.
我MediaCodec.Callback()为我的两个编解码器设置了s.我认为问题在于我不知道在Encoder的回调onInputBufferAvailable()函数中该怎么做.我不知道(或知道如何)将数据从Surface编码器复制到编码器中 - 这应该自动发生(就像在解码器输出上一样codec.releaseOutputBuffer(outputBufferId, true);).然而,我认为onInputBufferAvailable需要打电话codec.queueInputBuffer才能运作.我只是不知道如何设置参数而不从像MediaExtractorDecode端使用的那样获取数据.
如果您有一个打开视频文件MediaCodec的示例,对其进行解码,使用异步回调将其编码为不同的分辨率或格式,然后将其保存为文件,请分享您的示例代码.
=== 编辑 ===
下面是我在异步模式下尝试做的同步模式的一个工作示例:ExtractDecodeEditEncodeMuxTest.java:https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media /src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java这个例子在我的应用程序中工作
android video-encoding mediacodec android-5.0-lollipop android-5.1.1-lollipop
谢谢你的关注!我想使用Android MediaCodec API对从Camera获取的视频帧进行编码,遗憾的是,我没有成功做到这一点!我仍然不熟悉MediaCodec API.以下是我的代码,我需要你的帮助来弄清楚我应该做什么.
1,相机设置:
Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPreviewSize(320, 240);
mCamera.setParameters(parameters);
Run Code Online (Sandbox Code Playgroud)
2,设置编码器:
private void initCodec() {
try {
fos = new FileOutputStream(mVideoFile, false);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mMediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc",
320,
240);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mMediaCodec.configure(mediaFormat,
null,
null,
MediaCodec.CONFIGURE_FLAG_ENCODE);
mMediaCodec.start();
inputBuffers = mMediaCodec.getInputBuffers();
outputBuffers = mMediaCodec.getOutputBuffers();
}
private void encode(byte[] data) {
int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear(); …Run Code Online (Sandbox Code Playgroud) 我希望用最小的文件大小来完成质量最好的FLV.毕竟,这不是每个人的目标吗?如果有任何不同,这些视频将会流式传输.
目前,我的视频不超过320像素,有些是宽屏,因此它们的高度略小于240像素.目前,转换后的FLV的质量非常差.
当前命令:
> ffmpeg -i video.mov -ar 22050 -ab 32 -f flv -s 320x240 -aspect 4:3 video.flv
Run Code Online (Sandbox Code Playgroud) 哪些视频格式与iPhone的资产库兼容?
换句话说,对于什么视频格式,ALAssetsLibrary的videoAtPathIsCompatibleWithSavedPhotosAlbum会返回YES?
我似乎无法在iPhone参考库中找到有关此信息的任何信息.
我有一个视频文件和一个音频文件.是否可以将其与声音文件合并为一个视频.我认为AVMutableComposition应该对我有所帮助,但我仍然不明白如何.任何建议?
基本上我想要的是QMediaRecorder通过提供QImage我在运行时在自定义代码中生成的s 序列作为源来编码视频.
到目前为止,我没有发现任何简单的方法来做到这一点,并在解决方案的所有点,我必须以某种方式实现自己的子类QMediaService和/或QMediaControl这需要QImage作为输入,将它们注册并以某种方式让QMediaRecorder使用它们.但是根据关于这个主题的官方Qt文档中的这个页面,这是一条较少旅行的道路,我自己:
通常,实施QMediaService不在本文档的范围之内,应寻求相关邮件列表或IRC渠道的支持.
我在这篇文章中希望拥有这些知识的人可以了解如何做到这一点.我认为记录这组功能将为Qt5的用户开辟许多有用的可能性.
我目前在我的Android应用程序上使用ffmpeg的实现.我允许用户在我的应用程序中拍摄短视频,然后当他们将它们上传到服务器时,我正在使用ffmpeg来缩小它们以减小文件大小,因此它们不会通过网络传递大量数据.
问题是,它需要永远在Android设备上编码视频.这些视频通常不超过45秒,编码可能需要20分钟.我已经在ffmpeg命令行上玩了一些不同的开关/参数,我现在可以在更舒适的时间使用它,但文件大小要大得多.我只是不确定我应该使用哪种编解码器(编码速度最快但输出质量不错),ffmpeg如何根据编码速度等处理大小(宽高比)的变化.
这是我一直在使用的两个命令.第一个输出我想要的文件大小/质量,但它只需要太长时间来编码,更不用说它使我的设备变得非常热,而它的编码时间如此之长:
ffmpeg -i input.mp4 -b:v 1024k -c:a copy -vf scale=960:540 output.mp4
Run Code Online (Sandbox Code Playgroud)
我已经调整了一些比特率,并将比例尺改为更小的尺寸,但我不想让视频非常小(在比例方面)以实现更快的编码.第二个命令的速度要快得多,但文件大小要大得多:
ffmpeg -i input.mp4 -vcodec libx264 -preset fast -c:a copy -s 960x540 output.mp4
Run Code Online (Sandbox Code Playgroud)
我想找到一个快乐的媒体(较小的文件大小,但编码更快)保持视频比例尺寸接近原始.ffmpeg只有很多不同的参数/开关,很难围绕我应该做的事情.
编辑:添加ffmpeg输出.
ffmpeg -i input.mp4 -vcodec libx264 -crf 30 -preset veryfast -c:a copy -s 960x540 output.mp4
09-13 11:06:28.330 10881-10881/someapp D/home: ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
09-13 11:06:28.330 10881-10881/someapp D/home: built with gcc 4.8 (GCC)
09-13 11:06:28.331 10881-10881/someapp D/home: configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi …Run Code Online (Sandbox Code Playgroud)