仔细阅读FFmpeg比特流过滤器文档后,我仍然不明白它们的真正含义.
该文件指出过滤器:
执行比特流级别修改而不执行解码
谁能进一步向我解释一下?用例会大大澄清事情.此外,有明显不同的过滤器.他们有什么不同?
在不断努力有效地摆弄比特的过程中(例如,参见这个SO问题),最新的挑战是比特的有效流和消费.
作为第一个简单的任务,我选择在生成的比特流中找到最长的相同比特序列/dev/urandom.典型的咒语是head -c 1000000 </dev/urandom | my-exe.实际目标是流式比特并解码Elias伽马码,例如,不是字节块或其倍数的码.
对于可变长度的这样的代码它是好的,具有take,takeWhile,group,对于列表操作等语言.由于a BitStream.take实际上会消耗部分b声,因此一些monad可能会发挥作用.
明显的起点是来自的懒惰字节串Data.ByteString.Lazy.
A.计算字节数
正如预期的那样,这个非常简单的Haskell程序与C程序相同.
import qualified Data.ByteString.Lazy as BSL
main :: IO ()
main = do
bs <- BSL.getContents
print $ BSL.length bs
Run Code Online (Sandbox Code Playgroud)
B.添加字节
一旦我开始使用unpack东西应该变得更糟.
main = do
bs <- BSL.getContents
print $ sum $ BSL.unpack bs
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,Haskell和C表现出几乎相同的表现.
C.相同位的最长序列
作为第一个非常重要的任务,可以找到最长的相同位序列,如下所示:
module Main where
import Data.Bits (shiftR, (.&.))
import qualified Data.ByteString.Lazy as BSL
import …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用C将一些数据写入比特流.有两种方法可以考虑.一种是将可变比特长度符号连接成连续的比特序列,但是以这种方式,我的解码器可能很难将这些符号与该连续比特流分开.另一种方法是为符号分配相同数量的比特,并且以这种方式解码器可以容易地恢复原始数据,但是可能存在比特的浪费,因为符号具有不同的值,这反过来导致比特流中的许多比特零(我猜这个浪费的比特).
任何暗示我应该做什么?
我是编程新手.任何帮助将不胜感激.
我想从文件中读取尽可能多的24位块. 如果我现在没有多少个块,我怎么能使用位串的' ConstBitStream?
目前我这样做:
eventList = ConstBitStream(filename = 'events.dat')
for i in range(1000) :
packet = eventList.read(24)
Run Code Online (Sandbox Code Playgroud)
(这里我必须预先计算事件的数量)
有没有办法解析HEVC比特流文件?
我希望能够创建一个新的比特流文件,该文件具有从原始比特流文件中选择的所选nal单元分组.
编辑:我插入了我的代码.请在这里找到我的比特流文件.
#library for searching in a string
import re
#library to keep dictionary order
import collections
import bitstring
from bitstring import BitStream, BitArray, ConstBitStream, pack
from bitstring import ByteStore, offsetcopy
#read bitstream file
s = BitStream(filename='11LTCCA_560x416_50Hz_8b_P420_GOP8_IP48_200frms_QP28.HEVC.str')
#find no of packets
pcks = list(s.findall('0x000001', bytealigned=True))
print len(pcks)
#set the current position, in the beginning of the nal unit.
s.pos =pcks[0]-8
print s.pos
#find the number of bits of first nal packet
no_p = pcks[1]-pcks[0]
forbidden_zero_bit = s.read(1) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Digilent Nexys II(Spartan 3E)开发板上测试Gadget Factory上的VHDL AVR8软处理器.该项目包括一个Makefile,用于编译C(或其他)软件程序并将其与FPGA比特流合并,因此无需在每次迭代软件时重新合成HDL.
当我执行'make'时,我得到与data2mem相关的以下错误:
Merging Verilog Mem file with Xilinx bitstream: main.bit
data2mem -bm bin/top_avr_core_v8_bd.bmm -bt bin/top_avr_core_v8.bit -bd main.mem -o b main.bit
process_begin: CreateProcess(NULL, data2mem -bm bin/top_avr_core_v8_bd.bmm -bt bin/top_avr_core_v8.bit -bd main.mem -o b main.bit, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [main.bit] Error 2
Run Code Online (Sandbox Code Playgroud)
我在包含VHDL项目文件的同一目录中执行'make',我甚至在目录中有一个空白的'main.bit'文件.
有没有人对这里发生的事情有任何想法?我的空白'main.bit'文件是否需要以某种方式格式化或放在不同的位置?
以下是我的Makefile的链接:
其他需要注意的信息:我不习惯使用Makefiles,更不用说将软件与FPGA比特流文件合并的特定目的了.此外,我在命令提示符下在Windows 7计算机上尝试此操作.
提前致谢.
我试图通过使用十六进制编辑器查看视频文件的比特流来了解一些有关 h264 的知识。我在这里找到了视频对象平面 (0x000001b6) 和 i 帧 (0x000001b600) 的起始代码。
但我在视频文件中找不到很多这样的字节。大多数情况下,这些起始代码出现在文件的开头,中间只有几位。我预计它们会非常有规律地出现,在整个文件中距离相等!?
用这种方式用十六进制编辑器查看文件是否可以?还存在哪些其他起始代码以及 h264 文件是如何组织的?
我正在尝试使用bitstring for python来解释传入的数据包并将其分解为可读部分.数据包将由一个标题(源(8位),目标(8位),NS(3位),NR(3位),RSV(1位),LST(1位),OPcode(8位),LEN(8位))组成,有效载荷介于0到128字节之间(由标题中的LEN确定)和CRC为16位.
数据将通过com端口到达大数据包.这些数据来自一个微控制器,它将数据打包并发送给用户,这是python进入的地方.
由于我不确定如何在解析之前存储它,因此我没有任何代码.
我是python的新手,需要一些帮助才能实现这一目标.
谢谢,Erik
编辑
我目前有一段代码正在运行,但它并没有完全按照我的需要生成....这是我已启动并运行的代码部分....
def packet_make(ser):
src = 10
p = 0
lst = 0
payload_make = 0
crc = '0x0031'
ns = 0
nr = 0
rsv = 0
packet_timeout = 0
top = 256
topm = 255
#os.system(['clear','cls'][os.name == 'nt'])
print("\tBatts: 1 \t| Berry: 2 \t| Bessler: 3")
print("\tCordell: 4 \t| Dave: 5 \t| Gold: 6")
print("\tYen: 7 \t| Erik: 8 \t| Tommy: 9")
print("\tParsons: 10 \t| JP: 11 \t| Sucess: 12")
dst …Run Code Online (Sandbox Code Playgroud) 我有一个有点爆炸的代码,它允许我通过 SPI 线发送大约 4 兆的数据。它的嵌入式代码用于使用 Linux 内核的自定义硬件。
问题是这需要很长时间才能完成(4 小时),这很可能是因为内核正在做更多的事情。基本上我的代码是这样的(aprox):
unsigned char data=0xFF;
BB_SPI_Init();
SPI_start();//activates chipselect(enable)
for(i=0;i<8;i++){
if(data & 0x80){
gpio_set_value(SPI_MOSI,1);
}else{
gpio_set_value(SPI_MOSI,0);
}
//send pulse clock
gpio_set_value(SPI_CLK,0);
gpio_set_value(SPI_CLK,1);
data<<=1;
}
SPI_stop();//deactivates chipselect(disable)
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的问题,但我注意到如果我使用 write 将数据发送到 linux gpio 处理程序/sys/class/gpio/gpioXX/value(其中 XX 是任何 gpio 编号),则需要 4 小时。但是,如果我fwrite()用于发送到同一台设备,则需要 3 个小时。但是,如果您write()仅用于启用(SPI_stop()和 SPI_ start())并fwrite()用于发送到 MISO、CLK,它只需要 1 小时 30 分钟。
那么,以此为基础,有人可以向我解释这是怎么发生的吗?我的想象说这是处理线程的方式,并且在每个软件周期中它解析 2 个线程(fwrite()和write()),如果只是使用的函数之一,但现在我仍在调查,有人可以让我知道任何类型的信息? 有没有更好的方法来处理这个问题?
仅供参考 无法使用内核驱动程序 spi,因为硬件已连接到 gpios,使用 bit bang …