我正在尝试使用ffmpeg的libav*库将iPhone的相机帧编码为H.264视频.我在Apple的文章中发现了 如何将CMSampleBuffer转换为UIImage,但是如何将其转换为ffmpeg的AVPicture?
谢谢.
GStreamer的文档令人困惑.这仍然是诉诸StackOverflow.com的借口,但仍然是:
什么是将任何视频文件(从任何格式)转换为WebM(+ WebM音频)的GStreamer命令行?
我被困在某个地方 gst-launch-0.10 webmmux name=mux ! filesrc location=oldfile.ext ! filesink location=newfile.webm ! name=demux ! demux. ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 ! demux. ! progressreport ! audioconvert ! audiorate ! vorbisenc ! queue ! mux.audio_0
我WARNING: erroneous pipeline: link without source element知道如何让这件事情继续下去.
这非常令人沮丧.
请帮忙,谢谢.:)
任何人都可以通过编码速度比较流行的视频编解码器?我知道通常更好的压缩需要更多的处理时间,但也有可能一些编解码器仍然通过快速编码提供相对较好的压缩.任何比较链接?
谢谢你的帮助
[编辑]:编解码器可以通过使用的算法进行比较,无论其具体实现,使用的硬件或视频源,如数学算法的大O
我真的很喜欢这个问题,因为我没有在互联网上看到有关iOS视频编码的足够信息,但是我们可以观察到大量应用成功解决视频流问题的应用程序(skype,qik,justin.tv等) .)
我将开发一个应用程序,它应该将从摄像机获得的视频帧发送到网络服务器,并在h.263(h.264或MPEG-4,它正在决定)中编码.为此,我需要一些视频编码库.显然,ffmpeg可以处理这个任务,但它是在LGPL许可下,这可能会导致在AppStore中提交应用程序时出现一些问题.另一方面,有些应用程序似乎使用ffmpeg库,但只有Timelapser在应用程序描述中明确说明了这一事实.这是否意味着,其他应用程序没有使用ffmpeg或仅隐藏此信息?
请分享您对此主题的想法和经验.我对dicsussion持开放态度.
我正在学习如何从这个例子中创建MP4视频.问题是该示例演示了动态生成的一些虚拟源数据的音频编码.我需要对文件中的音频进行编码.我检查了很多例子,其中大部分显示相同或只是一个单独的音频编码.在我的试错过程中,我对音频和视频帧使用相同的AVFormatContext.我不确定这是否正确,或者我是否应该有2个单独的上下文?到目前为止,我的视频编码还可以,但是音频流失败了因为AVPacket无法找到正确的音频流索引.以下是我设置音频流的方法:
void open_audio(AVFormatContext *oc, AVCodec **codec, AVStream **st ,enum AVCodecID codec_id){
// AVCodecContext *c;
int ret;
// c = st->codec;
*codec = avcodec_find_encoder(codec_id);
if (!(*codec)) {
fprintf(stderr, "Could not find encoder for '%s'\n",avcodec_get_name(codec_id));
}
/* open it */
if(avformat_open_input(&oc,_audioInName.c_str(),NULL,NULL) !=0){
Msg::PrintErrorMsg("Error opening audio file");
}
AVStream* audioStream = NULL;
// Find the audio stream (some container files can have multiple streams in them)
for (uint32_t i = 0; i < oc->nb_streams; ++i)
{
if (oc->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
{ …Run Code Online (Sandbox Code Playgroud) 当我试图将帧写入视频时,我不断收到断言错误.我得到的错误是这样的:
Traceback (most recent call last):
File "VideoMixer.py", line 23, in <module>
cv.WriteFrame(writer, cv.LoadImage(fileName))
cv.error: dst.data == dst0.data
Run Code Online (Sandbox Code Playgroud)
这是我的脚本:
import cv
import sys
files = sys.argv[1:]
for f in files:
capture = cv.CaptureFromFile(f)
height = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)
width = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT)
fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
fourcc = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FOURCC)
print fourcc
writer = cv.CreateVideoWriter('ok.mov', int(fourcc),fps,(int(width),int(height)),1)
print writer
for i in range(30):
frame = cv.QueryFrame(capture)
print frame
if frame:
cv.WriteFrame(writer, frame)
Run Code Online (Sandbox Code Playgroud)
保存帧图像工作正常,所以我知道捕获没有错.我创作的作者错了吗?'print fourcc'输出0.0,但我尝试了很多FOUR_CC值.
谢谢!
我正在寻找构建几十台机器的分布式视频编码集群.我之前从未使用过消息队列,但是我开始玩的那个是Gearman和Beanstalkd.
Beanstalk似乎比Gearman更简单,更容易使用,但它的功能并不像.
我不明白的一件事是......你如何在所有服务器上产生新员工?我打算用php.是否像在CLI中使用"&"运行worker.php一样简单,只是让它坐在那里等待工作?
我注意到在完成一个工作后,gearman实际上并没有杀死进程,但是Beanstalk会这样做,所以我必须在每个服务器上的每个作业之后重启脚本.
目前我更倾向于使用Beanstalk,我计划的一般流程是:
在每台服务器上运行一个微小的cron,检查是否有预先定义的工作量正在运行.如果它不应该是,产生新的工作进程.每个过程大约需要2-30分钟.
也许我的逻辑存在缺陷?让我知道这样做的"更好"或"适当"的方式是什么?
我有一个使用Paperclip的Rails应用程序在Amazon S3上上传和存储视频.我不是特别感兴趣将视频文件转换成另一种格式,或添加水印,没什么特别的.我只是想从视频创建缩略图,以用作我的视频播放器上的海报图像.
我看到Amazon Elastic Transcoder允许创建免费的缩略图(或者更确切地说,他们不会为缩略图创建收费),并且因为我已经在使用Amazon服务,所以我想看看我是否可以将它用于我的缩略图.
有没有人知道如何设置输入/输出选项,除了缩略图之外没有生成文件?我可以这样做吗?
transcoder = AWS::ElasticTranscoder::Client.new
transcoder.create_job(
pipeline_id: APP_CONFIG[Rails.env][:pipeline_id],
input: {
key: VIDEOPATH,
frame_rate: 'auto',
resolution: 'auto',
aspect_ratio: 'auto',
interlaced: 'auto',
container: 'auto'
},
output: {
key: , #LEAVE THIS BLANK TOO?
preset_id: , #LEAVE THIS BLANK?
thumbnail_pattern: "thumbnail",
rotate: '0'
}
)
Run Code Online (Sandbox Code Playgroud) 我以为我已经掌握了这一点,但显然我没有:)我需要使用不是编码器接受的任何格式的帧执行NVENC的并行H.264流编码,因此我有以下代码管道:
cuMemcpy是同步的,所以我可以从回调中返回,所有挂起的操作都在专用流中推送)出于某种原因,如果我在并行线程中执行此管道,我假设我需要为每个线程提供专用上下文.代码很慢,经过一些阅读我明白上下文切换实际上是昂贵的,然后我实际上得出的结论是没有意义,因为在一个上下文中拥有整个GPU所以我锁定了来自其他代码转换器线程的任何并行处理.
问题1:在这种情况下,我是否善于使用单个上下文和在此上下文中为执行上述管道的每个线程创建的显式流?
问题2:有人可以告诉我CUDA设备上下文的唯一目的是什么?我认为它在多GPU场景中是有意义的,但是在任何情况下我都想为一个GPU创建多个上下文吗?
我在笔记本电脑上使用动作,它可以在任何格式下完美运行.但是当我使用Raspberry Camera V2在我的Raspberry Pi 3(Raspbian Jessie)上使用它时,唯一有效的格式是:.avi和.swf.
当我选择任何其他格式时,输出视频是"0秒视频",即时播放和关闭.
我想拥有.mp4或.ogg输出所以我可以用HTML5轻松阅读.
这是运动编解码器文档.
这是我的配置文件:
############################################################
# Daemon
############################################################
# Start in daemon (background) mode and release terminal (default: off)
daemon on
# File to store the process ID, also called pid file. (default: not defined)
process_id_file /var/run/motion/motion.pid
############################################################
# Basic Setup Mode
############################################################
# Start in Setup-Mode, daemon disabled. (default: off)
setup_mode off
# Use a file to save logs messages, if …Run Code Online (Sandbox Code Playgroud) video-encoding ×10
ffmpeg ×4
c++ ×2
video ×2
audio ×1
avfoundation ×1
beanstalkd ×1
camera ×1
codec ×1
cuda ×1
gearman ×1
gstreamer ×1
ios ×1
ios4 ×1
iphone ×1
libav ×1
mencoder ×1
motion ×1
opencv ×1
php ×1
python ×1
raspberry-pi ×1
video-codecs ×1
webm ×1