附带android SDK的原生媒体播放器不会播放大多数MPEG4格式的视频文件.我可以使用其他第三方媒体播放器吗?如果是,我怎么用呢?它是一个jar我可以添加到我的lib目录或shd将用户重定向到Android Market并要求他们安装免费的应用程序?哪种方法最好?
提前致谢
h.264硬件压缩卡通过捕获的视频处理NALU.
我试图将NALU包装成FLV,我几乎成功了.
我不知道如何为每个NALU填充FLV中的撰写时间字段.
根据FLV规范,http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf,E.4.3.1.
CompositionTime 合成时间偏移
有关组合时间的说明,请参见ISO 14496-12,8.15.3.FLV文件中的偏移量始终以毫秒为单位
然后查看ISO 14496-12,8.15.3,第24页和第26页
提供解码时间和合成时间之间的偏移.由于解码时间必须小于合成时间,所以偏移表示为无符号数,使得 CT(n)= DT(n)+ CTTS(n)其中CTTS(n)是样本n的(未压缩的)表条目.
我如何知道每个NALU中的DT和CTTS?或者如何在没有DT和CTTS的情况下计算CT?
谢谢
我有许多从各种数码相机格式转码的MPEG-4文件,文件系统修改日期是正确的.我想设置"Media Created"标签以匹配.这可以在Windows资源管理器中通过"属性"窗口的"详细信息"选项卡手动完成.设置"已创建媒体"非常有用,因为Windows Live照片库会在此字段中键入其"采取日期"属性.不幸的是,文件数量使得手工设置所有日期变得不切实际.
一些自动化途径有潜力.TagLib#似乎支持所有MP4标签,但是获取更多基本标签的API尚不清楚.另一个角度是Windows shell.据推测,Windows资源管理器正在使用它来编写标签.有一个通过shell 读取的示例,但似乎没有用于编写的API.
我将网络摄像头数据传输到我的客户端.
我可以通过收听('数据')看到数据到达.但是,当我创建它时,我无法查看它,它可能是垃圾数据或丢失了一些标题.VLC无法播放.
我的下一步是使其实时流式传输到浏览器.
我究竟做错了什么?
net = require('net');
fs = require('fs');
// Start a TCP Server
net.createServer(function (socket) {
console.log("client connected");
var file = fs.createWriteStream("temp.mp4");
socket.pipe(file, {end: false});
socket.on('end', function(){
console.log("ended");
});
}).listen(5000);
Run Code Online (Sandbox Code Playgroud)
我测试看它是否真的捕获了视频输出:
$ mediainfo temp.mp4
General
Complete name : temp.mp4
Format : H.263
Format version : H.263
File size : 126 KiB
Video
Format : H.263
Width : pixel0
Height : pixel0
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Compression mode : Lossy …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试从使用GoPro录制的MPEG-4文件中提取每个帧时间戳.
我想要相机捕获帧的确切时间,以便稍后将其与计算机视觉算法结合起来.
我知道输出帧速率是25 fps.我使用ffmpeg和ffprobe以不同的方式提取了pts,但它们都显示出太完美的结果让我相信它们.
每个帧/包具有精确的0.04秒内部(或3600英寸单位),足够方便地匹配完美的25 fps.
我到目前为止使用的命令是:
ffmpeg -i 3_96025.MP4 -an -vf showinfo %10d.png 2> res.txt
Run Code Online (Sandbox Code Playgroud)
我也试过用
ffmpeg -i 3_96025.MP4 **-copyts** -an -vf showinfo %10d.png 2> res.txt
Run Code Online (Sandbox Code Playgroud)
但结果完全一样.
我也试过ffprobe:
ffprobe -i 396025.MP4 -show_packets -select_streams v
Run Code Online (Sandbox Code Playgroud)
我得到的间隔也很完美.
我很确定gopro无法以如此完美的方式维持25 fps.另外,我记录了一个计时器,我可以看到每个帧不完全匹配0.04秒的间隔. 那么我有没有办法真正看到每帧被捕获的时间?
这是我用ffmpeg获得的输出的一部分供参考:
frame= 42 fps= 26 q=0.0 size=N/A time=00:00:01.36 bitrate=N/A
n:42 pts:151200 pts_time:1.68 pos:3232584 fmt:yuv420p sar:1/1 s:1280x960 i:P iskey:0 type:B checksum:6A83E942 plane_checksum:[1C859E55 79A4ED3E 28E25DA0]
[Parsed_showinfo_0 @ 0037dea0] n:43 pts:154800 pts_time:1.72 pos:3255334 fmt:yuv420p sar:1/1 s:1280x960 i:P iskey:0 type:B checksum:5736F4C1 plane_checksum:[ACAD00D0 06FFDE34 …Run Code Online (Sandbox Code Playgroud) 有没有办法将封面艺术嵌入到m4a文件中?
这个适用mp3但效果不佳m4a
ffmpeg -i tests/in.m4a -i cover.jpg -map 0:0 -map 1:0 -acodec copy \
-id3v2_version 3 tests/out.m4a
Run Code Online (Sandbox Code Playgroud) 我正在写一个Android项目,我正在录制几个音频文件.因此,我正在设置以下参数.录音工作正常.
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Run Code Online (Sandbox Code Playgroud)
我的问题是每次我记录时,输出都写在一个单独的文件中.现在,我需要将这些文件合并到一个文件中.有没有人知道如何在Android项目中组合几个MPEG 4文件?
谢谢你的帮助....
所以我基本上读到了这个,http: //www.gdcl.co.uk/2011/June/UnregisteredFilters.htm .
它告诉您如何使用过滤器而不注册它们.有两种方法,new和使用私有CoCreateInstance.我试图使用CoCreateInstance方法.
在该站点的示例中,代码列为,
IUnknownPtr pUnk;
HRESULT hr = CreateObjectFromPath(TEXT("c:\\path\\to\\myfilter.dll"), IID_MyFilter, &pUnk);
if (SUCCEEDED(hr))
{
IBaseFilterPtr pFilter = pUnk;
pGraph->AddFilter(pFilter, L"Private Filter");
pGraph->RenderFile(pMediaClip, NULL);
}
Run Code Online (Sandbox Code Playgroud)
我的代码如下,
IUnknownPtr pUnk;
HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4demux.dll"), IID_BaseFilter, &pUnk);
if (SUCCEEDED(hr))
{
//add functionality
}
Run Code Online (Sandbox Code Playgroud)
我猜IID_BaseFilter是我应该使用的,它是我用于其他过滤器的东西.但我给出了错误'ClassFactory无法提供请求的类'.
我在这里错过了什么吗?任何帮助将不胜感激.提前致谢!
编辑:代码
IBaseFilter *pSrc = NULL, *pSrc2 = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;
ICaptureGraphBuilder2 *pBuild;
IMediaControl *pControl = NULL;
// This example omits error handling.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, …Run Code Online (Sandbox Code Playgroud) 根据ffmpeg手册,设置-g是在"I"帧之间定义空间,并设置-bf为使用"B"帧.前者我得到了,但后者没有.
目标:我正在尝试使用GOP 3,12(M = 3,N = 12)的视频.这意味着:2"B"帧分隔每个"P"帧,"I"帧具有12帧距离.或者简单地说:"IBBPBBPBBPBBI"
我认为我只得到N = 12,使用以下命令:
ffmpeg -s cif -r 30 -b 64000 -bt 3200 -g 12 -y -i video.yuv -vcodec mpeg4 video.m4vMP4Box -hint -mtu 1460 -fps 30 -add video.m4v video.mp4ffmpeg -y -i video.mp4 video_ref.yuv../cmd/psnr 352 288 420 video.yuv video_ref.yuv > psnr_ref.txt../cmd/mp4trace -f -s 192.168.0.2 12346 video.mp4 > tracehead -n 20 trace结果:
[robert@10-2Fontes]$ head -n 20 trace
1 H 12002 9 0.000
2 P 11479 8 …Run Code Online (Sandbox Code Playgroud) 在使用时MediaRecorder,我们没有API级别低于24的暂停/恢复.所以有一种方法可以做到这一点:
许多人在SO上问这个问题,但无论如何都找不到解决这个问题.人们谈论通过停止在暂停操作上录制并在恢复时重新开始来创建多个媒体文件.所以我的问题是我们如何以编程方式合并/加入所有媒体文件?
注意:在我的情况下MPEG4容器 - 音频为m4a,视频为mp4.
我尝试使用SequenceInputStream合并多个InputStream各自生成的录制文件.但它总是只产生第一个文件.
代码片段:
Enumeration<InputStream> enu = Collections.enumeration(inputStreams);
SequenceInputStream sqStream = new SequenceInputStream(enu);
while ((oneByte = sqStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, oneByte);
}
sqStream.close();
while (enu.hasMoreElements()) {
InputStream element = enu.nextElement();
element.close();
}
fileOutputStream.flush();
fileOutputStream.close();
Run Code Online (Sandbox Code Playgroud)